由于双跳故障,委派受约束,远程Powershell请求中的SSPI SQL访问失败

Jus*_*tin 6 sql-server powershell powershell-remoting kerberos-delegation

我们正在尝试从远程服务器B上的serverA运行自动安装,该安装需要使用Windows身份验证与sql serverC进行通信。

Invoke-Command -ComputerName serverB -ScriptBlock {

    $conn = new-object System.Data.SqlClient.SqlConnection 'Data Source=ServerC;Initial Catalog=master;Integrated Security=SSPI'
    try
    {
        $conn.open()
    } finally {
        $conn | Remove-SQLConnection
    }

} -Credential $cred 
Run Code Online (Sandbox Code Playgroud)

但是,它无法返回:

”使用“ 0”参数调用“ Open”的异常:“用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。”

我们使用以下方法解决了此问题:

Invoke-Command -ComputerName serverB -ScriptBlock { Register-PSSessionConfiguration -Name Ipswitch -RunAsCredential $using:cred -Force  } -Credential $cred
Run Code Online (Sandbox Code Playgroud)

但是我们更喜欢使用受约束的kerberos委托:

https://docs.microsoft.com/zh-cn/powershell/scripting/learn/remoting/ps-remoting-second-hop?view=powershell-6#resource-based-kerberos-constrained-delegation

我们尝试使用以下步骤执行kerberos委派:

##########################
#run on serverC
##########################
Add-WindowsFeature RSAT-AD-PowerShell

Import-Module ActiveDirectory


$serverB = Get-ADComputer serverB
$serverC = Get-ADComputer serverC

# Grant resource-based Kerberos constrained delegation
Set-ADComputer -Identity $serverC -PrincipalsAllowedToDelegateToAccount $serverB

# Check the value of the attribute directly
$x = Get-ADComputer -Identity $serverC -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
$x.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access

# Check the value of the attribute indirectly
Get-ADComputer -Identity $serverC -Properties PrincipalsAllowedToDelegateToAccount

# purge kerberose cache
Invoke-Command -ComputerName $serverB.Name -Credential $cred -ScriptBlock {
    klist purge -li 0x3e7
}
Run Code Online (Sandbox Code Playgroud)

完成之后,这两个测试通过:

Invoke-Command -ComputerName serverB -ScriptBlock {

    Invoke-Command -ComputerName serverC -ScriptBlock {'hello world'} -Credential $using:cred
} -Credential $cred 


Invoke-Command -ComputerName serverB -ScriptBlock {

    Copy-Item '\\serverC\c$\file'

} -Credential $cred 
Run Code Online (Sandbox Code Playgroud)

但是,sql命令仍然失败,并且我们无法找到解决方案。

我们在github上发现了相同的问题,看起来似乎相同,但没有答案:https : //github.com/PowerShell/PowerShell/issues/9331

Dav*_*d W 2

请务必使用 SetSPN \xe2\x80\x93A MSSQLSvc/.:1433 为 SQL 服务帐户注册 SPN

\n