PowerShell 查询具有不同 Windows 凭据的远程 SQL 服务器
PowerShell query remote SQL Server with different Windows Credentials
我正在尝试使用脚本块查询 SQL 服务器并传入一组不同的 windows 凭据。如果我 运行 它与 SQL 服务器在同一台机器上,该脚本就可以工作,但是当我尝试远程 运行 它时失败。我知道我可以远程访问 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
这是作业的状态:
啊,第二跳远程处理的乐趣。基本上这里出了什么问题是,在创建远程 powershell 会话之后,您无法访问除您所连接的服务器之外的服务器上的任何资源,因为您的凭据在您登录时实际上并未传递给第二台服务器。唯一真正的解决方法是使用 CredSSP authentication, which you can do using Enable-WSManCredSSP 请务必阅读链接,因为与标准身份验证相比,使用 CredSSP 时会引入一些特定要求和潜在问题。
所以我想出了问题所在。正如我之前在评论中所述,当调用 Start-Job 确实传递参数时,我是正确的新会话。如果您查看 SQL 连接属性并且未传递 user/password ,它将尝试使用您传递给新会话的凭据通过 windows 身份验证进行身份验证。问题是我自己在 get-credentials 中的错误,我提供了如下用户名和密码。
用户:user@domain.local
密码:我的密码
问题是需要这样:
用户:DOMAIN\user
密码:我的密码
我不确定为什么会有所不同,但确实如此。我认为这两种语法是相同的,但可能与 SQL Windows 身份验证不同。
我正在尝试使用脚本块查询 SQL 服务器并传入一组不同的 windows 凭据。如果我 运行 它与 SQL 服务器在同一台机器上,该脚本就可以工作,但是当我尝试远程 运行 它时失败。我知道我可以远程访问 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
这是作业的状态:
啊,第二跳远程处理的乐趣。基本上这里出了什么问题是,在创建远程 powershell 会话之后,您无法访问除您所连接的服务器之外的服务器上的任何资源,因为您的凭据在您登录时实际上并未传递给第二台服务器。唯一真正的解决方法是使用 CredSSP authentication, which you can do using Enable-WSManCredSSP 请务必阅读链接,因为与标准身份验证相比,使用 CredSSP 时会引入一些特定要求和潜在问题。
所以我想出了问题所在。正如我之前在评论中所述,当调用 Start-Job 确实传递参数时,我是正确的新会话。如果您查看 SQL 连接属性并且未传递 user/password ,它将尝试使用您传递给新会话的凭据通过 windows 身份验证进行身份验证。问题是我自己在 get-credentials 中的错误,我提供了如下用户名和密码。
用户:user@domain.local
密码:我的密码
问题是需要这样:
用户:DOMAIN\user
密码:我的密码
我不确定为什么会有所不同,但确实如此。我认为这两种语法是相同的,但可能与 SQL Windows 身份验证不同。