【问题标题】:Connecting PowerShell to SQL Server using Windows authentication and impersonating user使用 Windows 身份验证和模拟用户将 PowerShell 连接到 SQL Server
【发布时间】:2021-12-21 18:38:40
【问题描述】:

我找到了大量关于如何使用当前登录的具有 Windows 身份验证的用户或使用 SQL Server 帐户与其他凭据连接的 PowerShell 连接到 SQL Server 的信息。我想知道是否有办法连接 Windows 身份验证但冒充另一个 Windows 用户。

以下是我发现可以使用 Windows 身份验证或 SQL Server 身份验证连接到 SQL Server 数据库的方法:

使用 .Net 进行 Windows 身份验证:

$Connection = New-Object System.Data.SqlClient.SQLConnection
$Connection.ConnectionString = "Data Source=$SQLServer;Integrated Security=$true;Initial Catalog=$Database"
$Connection.Open()

使用 .Net 的 SQL Server 身份验证:

$CredentialObject = New-Object System.Management.Automation.PSCredential -ArgumentList $SQLUsername,$SQLPassword
$CredentialObject.Password.MakeReadOnly()
$SQLCredential = New-Object System.Data.SqlClient.SqlCredential($CredentialObject.UserName,$CredentialObject.Password)

$Connection = New-Object System.Data.SqlClient.SQLConnection
$Connection.ConnectionString = "Data Source=$SQLServer;Initial Catalog=$Database"
$Connection.Credential = $SQLCredential

使用SqlServer模块的Windows身份验证:

Invoke-Sqlcmd -ServerInstance $SQLServer -Database $Database -Query "SELECT....."

使用SqlServer模块的SQL Server身份验证:

Invoke-Sqlcmd -ServerInstance $SQLServer -Database $Database -Query "SELECT....." -Username $SQLUsername -Password $SQLPassword

我注意到-Credential 存在Invoke-Sqlcmd 标志,但according to this post 也假定SQL Server 身份验证并且不能使用Windows 身份验证。

如果我想使用 Windows 身份验证模拟用户,还有其他可用的选项吗?

提前致谢

【问题讨论】:

  • 我不知道直接做你想做的事。如果这是一个自动/后台进程,您可以将该进程设置为以不同的用户身份运行。如果它是一个交互式过程,则仅 RunAs PowerShell 控制台可能更容易。您还可以尝试使用“Windows 凭据”小程序将特定的 Windows 凭据绑定到 SQL Server
  • 哦,是的,使用 Invoke-Command 但指定本地服务器?我得试试,让我回复你!
  • 我没有忘记这一点,我的测试环境坏了,我正在重建它:(我一试就会回来
  • 更新:这似乎至少在正确的用户上下文中运行,但我不明白如何从命令中检索输出。如在,我看不出它是失败还是成功,因为它在不同的进程中运行。如果我使用不同的凭据和 -ArgumentList "-Command","whoami" 运行 Start-Process,或者如果我故意将其拼写为 "-Command","whoamiiii" ,则该过程仍然会运行。如果我在新 PS 窗口中看到输出之前和之后添加一些 Start-Sleep,但我可以将其重定向回调用新的原始 powershell 实例吗?

标签: sql-server powershell windows-authentication


【解决方案1】:

suggested post 似乎可以在不同的用户上下文下正确运行它,但由于某种原因它不适用于 SQL 查询,很可能是因为命令包含单引号 '。当使用比SELECT * FROM dbo.MyTable 更复杂的东西时,它将无法正常运行,例如当您运行WHERE MyColumn LIKE '%filter%' 时。即使它运行正确,它也不会产生任何输出,因为在 Start-Process 中不会告诉我失败的原因,如果有的话。我需要一种方法来捕获 StandardOutput 和 StandardError。

我找到的解决方案是this post,它允许我使用System.Diagnostics.ProcessStartInfo 捕获输出。但是,我还需要在不同的用户上下文中运行它,这可以通过.UserName.Domain.Password 来实现。最终代码如下所示:

$ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo
$ProcessStartInfo.CreateNoWindow = $true
$ProcessStartInfo.UseShellExecute = $false
$ProcessStartInfo.RedirectStandardOutput = $true
$ProcessStartInfo.RedirectStandardError = $true
$ProcessStartInfo.FileName = 'powershell.exe'
$ProcessStartInfo.Arguments = @("-Command",$MyCommand)
$ProcessStartInfo.UserName = $Username
$ProcessStartInfo.Domain = $Domain
$ProcessStartInfo.Password = $Password
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $ProcessStartInfo
[void]$Process.Start()
$StandardOutput = $Process.StandardOutput.ReadToEnd()
$StandardError = $Process.StandardError.ReadToEnd()
$Process.WaitForExit()

if ($Process.ExitCode -eq 1) {

    throw $StandardError

}
else {

    Write-Output $StandardOutput

}

$MyCommand 是我需要运行的完整命令,如下所示:

$SQLCommand = $SQLCommand -replace "'","''"

$MyCommand = '
$Connection = New-Object System.Data.SqlClient.SQLConnection
$Connection.ConnectionString = ''Data Source=' + $SQLServer + ';Integrated Security=' + $true + ';Initial Catalog=' + $Database + '''

$Command = New-Object System.Data.SqlClient.SqlCommand(''' + $SQLCommand + ''',$Connection)
$Connection.Open()

$Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Command
$Dataset = New-Object System.Data.DataSet
$Adapter.Fill($Dataset) | Out-Null

$Connection.Close()
$Dataset.Tables'

$SQLCommand 是我将对数据库运行的 SQL 查询,我对所有单引号执行 -replace 以向它们添加两个,因为传递此查询有两个步骤,首先$MyCommand 然后在实际进程中运行时。

我完全清楚这会引发许多不同的 SQL 注入问题,但这是我们已经接受的安全风险。您的里程可能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 2013-09-07
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2015-11-11
    • 2017-10-23
    相关资源
    最近更新 更多