0

我正在尝试使用脚本块查询 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

这是作业的状态: 在此处输入图像描述

4

2 回答 2

1

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

于 2016-11-28T20:13:59.360 回答
1

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

用户:user@domain.local

密码:我的密码

问题是它必须是这样的:

用户:域\用户

密码:我的密码

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

于 2016-11-28T22:52:02.053 回答