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

标签 sql sql-server powershell

我希望检查我可以通过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时,我收到了:

The following exception was thrown when trying to enumerate the collection: "Failed to connect to server mmyServer."

最佳答案

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/

相关文章:

powershell - 新-AzureRmVM : Parameter set cannot be resolved using the specified named parameters

powershell - 通过 PowerShell 在远程计算机上设置环境变量

mysql - SQL 自动化 (MySQL)

mysql - 合并具有部分关系的两个表

sql - 冒险作品说明

sql - 如何使用动态编号创建表。数据输入的列数

powershell - 我该如何纠正 “Command output already redirected”错误

mysql - 从数据库表中选择不在另一个表中的行

sql - Max 和 Min 按 2 列分组

sql - 转换 SQL 日期时间格式