我正在尝试使用脚本块查询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
答案 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身份验证。