我希望检查服务器上的一个数据库的内容,我可以通过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。”
答案 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位置可能会在脚本运行时被分页,从而导致明文密码被写入磁盘。