【问题标题】:PowerShell query remote SQL Server with different Windows CredentialsPowerShell 使用不同的 Windows 凭据查询远程 SQL Server
【发布时间】:2016-11-28 20:00:43
【问题描述】:

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

这是作业的状态:

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 也许我错过了什么。但我不想开始远程会话。我在与 PowerShell 脚本相同的机器上创建一个新会话。我传递的一组 Windows 凭据与我登录到该会话的凭据不同。如果我删除脚本块并使用有权访问 SQL 服务器的 Windows 凭据登录机器,它就可以正常工作。即使我从与 SQL Server 不同的机器上运行脚本。
    • 会话是远程还是本地都没有关系。提供凭据的会话的标准身份验证不会传递用户名和密码,因此它们不能用于连接到另一个系统。
    • 实际上,当您调用 Start-Job 时,确实会传递凭据。这就是使用脚本块的全部意义所在。我可以使用与当前会话不同的凭据来调用它。以下是为我指明正确方向的链接。 MSDN Start-JobSQL Connection with Start-Job
    【解决方案2】:

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

    用户:user@domain.local

    密码:我的密码

    问题是它必须是这样的:

    用户:域\用户

    密码:我的密码

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

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多