PowerShell使用不同的Windows凭据查询远程SQL Server

时间:2016-11-28 20:00:44

标签: sql-server powershell authentication windows-authentication scriptblock

我正在尝试使用脚本块查询SQL Server并传入一组不同的Windows凭据。如果我在与SQL Server相同的机器上运行它,但是当我尝试远程运行它时失败,该脚本可以工作。我知道我可以远程访问SQL服务器,因为我可以使用SQL Server Managment Studio访问SQL服务器并手动运行查询。下面是我想要使用的代码。我在脚本中的点之前指定了服务器,数据库和查询。

$credentials = Get-Credentials
#Script block
$sqlscript = {
    #SQL variables
    $sqlDataSource = $sqlServer
    $sqlDatabase = $database

    $connectionString = "Server="+$sqlDataSource+";Database="+$sqlDatabase+";Integrated Security=SSPI;"

    $connection = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString

    $connection.Open()
    $command = New-Object System.Data.SqlClient.SqlCommand($queryString,$connection)
    $command.CommandTimeout=$queryTimeout

    # use dataset to get sql results
    $dataset=New-Object system.Data.DataSet
    $dataAdapter=New-Object system.Data.SqlClient.SqlDataAdapter($command)
    [void]$dataAdapter.fill($dataset)
    $connection.close()

    # dataset has separate results tables
    #$versionData = $dataset.Tables[0] #Version query results #not needed
    $hardwareData = $dataset.Tables[1] #Hardware query results
    $softwareData = $dataset.Tables[2] #Software query results


}
start-job -ScriptBlock $sqlscript -Credential $credentials
# output to separate CSV files
#$versionData | Export-CSV $outputPath -notype #not needed
$hardwareData | Export-CSV $outputPathHardware -notype
$softwareData | Export-CSV $outputPathSoftware -notype

这是工作的状态: enter image description here

2 个答案:

答案 0 :(得分:1)

第二跳远程的快乐啊。基本上这里出现的问题是,在创建远程PowerShell会话后,您无法访问除连接的服务器之外的任何服务器上的任何资源,因为您在登录时实际上没有将凭据传递给第二台服务器。真正的解决方法是使用CredSSP authentication,您可以使用Enable-WSManCredSSP确保阅读链接,因为使用CredSSP与标准身份验证相比,会引入一些特定要求和潜在问题。

答案 1 :(得分:1)

所以我想出了问题所在。正如我在前面的评论中所述,当调用Start-Job传递参数时,我对新会话是正确的。如果您查看SQL连接属性并且没有传递用户/密码,它将尝试使用您传递给新会话的凭据通过Windows身份验证进行身份验证。问题是我自己在get-credentials中的错,我提供了用户名和密码,如下所示。

用户:user@domain.local

密码:mypassword

问题在于它需要像这样:

用户:DOMAIN \ user

密码:mypassword

我不确定为什么会有所作为,但确实如此。我认为这两种语法都是相同的,但可能不是SQL Windows身份验证。