我希望检查我可以通过Windows身份验证登录的服务器上一个数据库的内容。听起来真的很简单,并且通过Internet提供了许多示例。
我尝试了几个示例,但每个示例在我的机器上都失败了。我怀疑凭证转换期间可能存在问题。
我的代码(缩短了)如下:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
$User=[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$credentials = Get-Credential $saUser | Select-Object *
$Pwd = $credentials.Password | ConvertFrom-SecureString
$targetConn = New-Object ('Microsoft.SqlServer.Management.Common.ServerConnection') ('myServer', $User, $Pwd)
$targetServer = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $targetConn
到目前为止,还没有错误消息。
当我输入
$targetServer
时,我没有看到列出的任何对象(也没有数据库)。当我尝试检查
$targetServer.Databases
时,我收到了:最佳答案
ConvertFrom-SecureString 将安全字符串转换为“加密的标准字符串”(哈希,用于以文本格式存储加密的字符串)。因此,在创建 $ targetConn 对象时,您将提供密码哈希( $ Pwd )作为密码参数,这是无效的。
您可以通过以下方式从PSCredential对象 $ credentials 中获取纯文本密码:
$Pwd = $credentials.GetNetworkCredential().Password
但是,根据the documentation for the contructors for the ServerConnection class,您还可以提供一个安全字符串作为password参数。因此,如果您只是省略
| ConvertFrom-SecureString
,即应该有效$Pwd = $credentials.Password
这可能是一个更好的主意,因为它更安全。如果使用第一种方法来获取纯文本密码,则在脚本运行时,存储 $ Pwd 变量的RAM位置可能会被调出页面,从而将纯文本密码写入磁盘。
关于sql - 无法从PowerShell枚举SQL Server上的数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24869799/