Passe o nome de usuário e a senha para obter credibilidade ou executar a Query SQL sem usar Invoke-Sqlcmd no PowerShell

StackOverflow https://stackoverflow.com/questions/2464265

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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top