将用户名和密码传递给get-credential或运行sql查询而不使用Powershell中的invoke-sqlcmd

Emo*_*Emo 2 powershell cmdlets sql-server-2008

我正在尝试连接到远程sql数据库,只需在Powershell中运行"select @@ servername"查询.我试图在不使用集成安全性的情况下这样做.我一直在努力使用"get-credential"和"invoke-sqlcmd",但却发现(我认为),你无法将密码从"get-credential"传递给另一个Powershell cmdlet.

这是我正在使用的代码:

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

# load assemblies
[Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, `
      Version=9.0.242.0, Culture=neutral, `
      PublicKeyToken=89845dcd8080cc91")
[Reflection.Assembly]::Load("Microsoft.SqlServer.SqlEnum, `
      Version=9.0.242.0, Culture=neutral, `
      PublicKeyToken=89845dcd8080cc91")
[Reflection.Assembly]::Load("Microsoft.SqlServer.SmoEnum, `
      Version=9.0.242.0, Culture=neutral, `
      PublicKeyToken=89845dcd8080cc91")
[Reflection.Assembly]::Load("Microsoft.SqlServer.ConnectionInfo, `
      Version=9.0.242.0, Culture=neutral, `PublicKeyToken=89845dcd8080cc91")

# connect to SQL Server

$serverName = "HLSQLSRV03"
$server = New-Object -typeName Microsoft.SqlServer.Management.Smo.Server -argumentList $serverName

# login using SQL authentication

$server.ConnectionContext.LoginSecure=$false;
$credential = Get-Credential
$userName = $credential.UserName -replace("\\","")
$pass = $credential.Password
$server.ConnectionContext.set_Login($userName)
$server.ConnectionContext.set_SecurePassword($credential.Password)
$DB = "Master"

invoke-sqlcmd -query "select @@Servername" -database $DB -serverinstance $servername -username $username -password $pass
Run Code Online (Sandbox Code Playgroud)

如果只是在"invoke-sqlcmd"行的末尾硬编码密码,它就可以工作.这是因为你不能将"get-credential"与"invoke-sqlcmd"一起使用?

如果是这样......我有什么选择?

非常感谢你的帮助

情绪

Mic*_*ael 5

您的命令不起作用,因为-password属性期望密码为纯文本字符串,而不是您传递的SecureString值.

虽然看起来你正在尝试使用两种不同的方法来执行SQL - 即使用程序集以及使用invoke-sqlcmd.

如果使用invoke-sqlcmd,则无需加载程序集并执行所有其他操作.

要使invoke-sqlcmd工作,您需要做的就是将密码转换为纯文本:

$serverName = "HLSQLSRV03"
$DB = "Master" 
$credential = Get-Credential 
$userName = $credential.UserName.Replace("\","")  
$pass = $credential.GetNetworkCredential().password  

invoke-sqlcmd -query "select @@Servername" -database $DB -serverinstance $servername -username $username -password $pass
Run Code Online (Sandbox Code Playgroud)