我有一个调用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身份验证还需要做其他事情吗?
答案 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脚本。