Passe o nome de usuário e a senha para obter credibilidade ou executar a Query SQL sem usar Invoke-Sqlcmd no PowerShell
-
20-09-2019 - |
Pergunta
Estou tentando me conectar a um banco de dados SQL remoto e simplesmente executar a consulta "Selecionar @@ ServerName" no PowerShell. Estou tentando fazer isso sem usar segurança integrada. Eu tenho lutado com "Get-Credencial" e "Invoke-SQLCMD", apenas para encontrar (eu acho), que você não pode passar a senha de "Get-Credencial" para outro cmdlets do PowerShell.
Aqui está o código que estou usando:
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
Se se apenas codificar a senha no final da linha "Invoke-SQLCMD", ela funcionará. É porque você não pode usar "Get-Credential" com "Invoke-Sqlcmd"?
Se sim ... quais são minhas alternativas?
Muito obrigado por sua ajuda
Emo
Solução
Seu comando não está funcionando porque o atributo -Password espera que a senha como uma string de texto simples, não o valor de títulos que você está passando.
Embora pareça que você esteja tentando usar dois métodos diferentes para executar o SQL - ou seja, usando os conjuntos, além de usar o Invoke -SQLCMD.
Se estiver usando o Invoke-SQLCMD, você não precisa carregar os conjuntos e fazer todas as outras coisas.
Tudo o que você precisa fazer para fazer com que seu Invoke-SQLCMD funcione é converter sua senha em texto simples:
$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