Powershell“ Invoke-Sqlcmd2”未与Windows帐户凭据连接

时间:2019-10-11 15:55:16

标签: sql sql-server powershell windows-authentication

我有一个调用Invoke-Sqlcmd2

的脚本
$password = ConvertTo-SecureString 'xxxxxxx' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ('domain\someuser', $password)

$resultListTable = Invoke-Sqlcmd2 -Credential $cred -query $query -ServerInstance "SERVER" -Database ZZZZ -As "DataTable"

失败并显示错误消息

  

使用“ 0”参数调用“打开”的异常:“用户'domain \ someuser'的登录失败。”

我的DBA向我报告他可以从服务器中看到如下所示的错误:

  

用户“ domain \ someuser”的登录失败原因:尝试在SQL Server身份验证中使用NT帐户名。

https://github.com/sqlcollaborative/Invoke-SqlCmd2/blob/master/Invoke-SqlCmd2/Public/Invoke-SqlCmd2.ps1处的Invoke-SqlCmd2文档指示同时支持Windows和sql身份验证。 (我只尝试使用sql凭据,并且工作正常,但是出于商业原因,我需要使用Windows凭据)。而且我已经看到(某处,现在找不到),只需在用户名中提供反斜杠就足以选择Windows身份验证(它是System.Data.SqlClient.SQLConnection对象)。不幸的是,这不是我所看到的行为。

使用电话进行Windows身份验证还需要做其他事情吗?

1 个答案:

答案 0 :(得分:1)

该代码实际执行的操作是:

if ($Credential) {
  $CSBuilder["Trusted_Connection"] = $false
  $CSBuilder["User ID"] = $Credential.UserName
  $CSBuilder["Password"] = $Credential.GetNetworkCredential().Password
}
else {
  $CSBuilder["Integrated Security"] = $true
}

(请参阅source code

...因此基本上,如果您提供凭据,则假定它是SQL Server登录名,而不是Windows登录名(因为可信连接设置为false)。

您天生就误解了SQL Server身份验证的工作方式。根据登录用户 current 隐式完成对SQL Server的Windows Auth。如果在连接字符串中将集成/受信任身份验证设置为打开,则SQL将自动使用建立连接的Windows用户的上下文来确定用户的身份。您不能指定其他Windows用户。这适用于所有SQL Server客户端。如果要以其他用户身份登录SQL,则需要在该用户帐户下运行powershell脚本。