无法从PowerShell枚举SQL Server上的数据库

时间:2014-07-21 16:16:17

标签: sql sql-server powershell

我希望检查服务器上的一个数据库的内容,我可以通过Windows身份验证登录。听起来很简单,很多例子都是通过互联网提供的。

我尝试了几个例子,每个都在我的机器上失败了。我怀疑,凭证转换期间可能存在问题。

我的代码(缩写)如下:

[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时,我收到了:

  

尝试枚举集合时抛出以下异常:“无法连接到服务器mmyServer。”

1 个答案:

答案 0 :(得分:1)

ConvertFrom-SecureString 将安全字符串转换为“加密标准字符串”(哈希,用于以文本格式存储加密字符串)。因此,在创建 $ targetConn 对象时,您将提供密码哈希( $ Pwd )作为密码参数,该对象无效。

您可以通过以下方式从PSCredential对象 $ credentials 获取纯文本密码:

$Pwd = $credentials.GetNetworkCredential().Password

但是,根据the documentation for the contructors for the ServerConnection class,您还可以提供安全字符串作为密码参数。所以如果你简单地省略| ConvertFrom-SecureString,即

,它应该可行
$Pwd = $credentials.Password

这可能是一个更好的主意,因为它更安全一点。如果您使用第一种方法获取明文密码,那么存储 $ Pwd 变量的RAM位置可能会在脚本运行时被分页,从而导致明文密码被写入磁盘。