我希望检查我可以通过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/

10-17 00:43