簡體   English   中英

使用 Windows 身份驗證和模擬用戶將 PowerShell 連接到 SQL Server

[英]Connecting PowerShell to SQL Server using Windows authentication and impersonating user

我找到了大量有關如何使用 PowerShell 連接到 SQL Server 的信息,使用當前登錄的 Windows 身份驗證用戶,或使用 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

我注意到Invoke-Sqlcmd存在-Credential標志,但根據這篇文章,它也假設 SQL Server 身份驗證並且不能使用 Windows 身份驗證。

如果我想使用 Windows 身份驗證模擬用戶,是否還有其他選項可用?

提前致謝

建議的帖子似乎確實在不同的用戶上下文下正確運行它,但由於某種原因它不適用於 SQL 查詢,很可能是因為命令包含單引號' 當使用比SELECT * FROM dbo.MyTable更復雜的任何東西時,它將無法正常運行,例如,當您運行WHERE MyColumn LIKE '%filter%' 即使它正確運行,它也不會產生任何輸出,因為在 Start-Process 中不會告訴我什么失敗了,如果有的話。 我需要一種方法來捕獲 StandardOutput 和 StandardError。

我找到的解決方案是這篇文章,它允許我使用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 注入問題,但這是我們已經接受的安全風險。 你的旅費可能會改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM