Bestehen Sie den Benutzernamen und das Passwort an, um die SQL-Abfrage zu erhalten, ohne in Ivoke-SQLCMD in PowerShell zu verwenden
-
20-09-2019 - |
Frage
Ich versuche, eine Verbindung zu einer Remote -SQL -Datenbank herzustellen und einfach die Abfrage "Select @@ Servername" in PowerShell auszuführen. Ich versuche dies zu tun, ohne integrierte Sicherheit zu verwenden. Ich habe mit "Get-Credential" und "Invoke-SQLCMD" zu kämpfen, nur um zu finden (glaube ich), dass Sie das Passwort nicht von "Get-Credential" zu einem anderen PowerShell-CMDlets übergeben können.
Hier ist der Code, den ich verwende:
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
Wenn Sie das Kennwort am Ende der Zeile "Invoke-SQLCMD" nur härten, funktioniert es. Liegt das daran, dass Sie mit "Invoke-SQLCMD" nicht "Get-Credential" verwenden können?
Wenn ja ... was sind meine Alternativen?
Vielen Dank für Ihre Hilfe
Emo
Lösung
Ihr Befehl funktioniert nicht, da das Attribut -Password das Kennwort als Klartext -Zeichenfolge erwartet und nicht den Wert für den Wert, den Sie übergeben.
Obwohl es so aussieht, als würden Sie versuchen, zwei verschiedene Methoden für die Ausführung des SQL zu verwenden - dh die Verwendung der Baugruppen sowie die Verwendung von Invoke -SQLCMD.
Wenn Sie Invoke-SQLCMD verwenden, müssen Sie die Baugruppen nicht laden und alle anderen Dinge ausführen.
Alles, was Sie tun müssen, um Ihr Invoke-SQLCMD zum Arbeiten zu bringen, ist, Ihr Passwort in Plain-Text umzuwandeln:
$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