【发布时间】: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