You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Invoke-Command使用域用户连接SQL Server失败求助

解决PowerShell远程调用后SQL Server匿名登录失败的问题(Kerberos双跳场景)

这个问题我之前帮同事排查过,典型的Kerberos双跳坑!核心原因是Windows默认不允许跨服务器传递凭据:当你从自动化服务器远程到应用服务器执行操作时,应用服务账户的凭据只能在应用服务器本地生效,再访问SQL Server时就没法把凭据传过去,导致SQL Server收到的是NT AUTHORITY\ANONYMOUS LOGON请求。结合你不能用SQL用户的限制,咱们用域环境下的Kerberos配置来解决:

步骤1:给SQL Server注册服务主体名称(SPN)

Kerberos认证需要SPN来识别服务,首先得确保SQL Server的SPN已经正确注册。在域控制器上用域管理员权限执行以下命令(根据你的SQL环境调整参数):

  • 如果是SQL默认实例(1433端口):
    setspn -S MSSQLSvc/<SQL服务器完全限定域名> <SQL运行账户>
    setspn -S MSSQLSvc/<SQL服务器完全限定域名>:1433 <SQL运行账户>
    
  • 如果是命名实例:
    setspn -S MSSQLSvc/<SQL服务器完全限定域名>:<实例名> <SQL运行账户>
    setspn -S MSSQLSvc/<SQL服务器完全限定域名>:<实例端口> <SQL运行账户>
    

说明:如果SQL Server用的是本地系统账户,<SQL运行账户>要填服务器的计算机账户,格式是域名\服务器名$

步骤2:配置应用服务账户的约束委派

接下来要让域允许应用服务账户把凭据传递给SQL Server:

  1. 打开域控制器的「AD用户和计算机」,找到你的应用服务账户,右键打开属性面板
  2. 切换到委派选项卡,选择「信任此用户指定的服务进行委派」
  3. 点击「添加」→「用户或计算机」,找到SQL Server的运行账户(或SQL服务器的计算机账户)
  4. 在可用服务里选中之前注册的MSSQLSvc服务,添加进去
  5. 勾选「仅使用Kerberos」选项(更安全,符合你的组织安全要求)

如果你的域支持,推荐用「仅信任此用户对指定服务进行委派」(资源约束委派),权限更严格,进一步降低安全风险

步骤3:修改PowerShell脚本,强制Kerberos认证

默认远程调用可能用NTLM协议,咱们要强制用Kerberos,同时修正脚本里的变量错误:

$Credential = New-Object System.Management.Automation.PSCredential $ApplicationUser, $SecurePassword
Write-Host "Running executable" -ForegroundColor Green
Invoke-Command -ComputerName $applicationServer -Credential $Credential -Authentication Kerberos -ScriptBlock {
    Write-Host $(whoami)
    $SQLServer = "YourServerName" # 这里建议用SQL服务器的完全限定域名,避免DNS问题
    $SQLDBName = "YourDBName"
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    # 修正变量名错误:把$ServerName/$DbName改成定义好的$SQLServer/$SQLDBName
    $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security=true;"
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = 'StoredProcName'
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $SqlConnection.Close()
}

额外检查项

  • 确保自动化服务器、应用服务器、SQL Server在同一个域(或有双向信任的域)内
  • 应用服务账户的SQL访问权限已经配置正确(你本地测试过,这部分应该没问题)
  • 在应用服务器上执行klist命令,查看是否生成了针对SQL Server的Kerberos票据,验证认证是否正常
  • 连接字符串里尽量用SQL服务器的完全限定域名,避免用NetBIOS名导致NTLM fallback

内容的提问来源于stack exchange,提问作者Adrian Hristov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:19:22