Invoke-Command行为澄清

时间:2016-04-05 14:24:40

标签: powershell windows-authentication kerberos powershell-v4.0 invoke-command

我遇到了Invoke-Command cmdlet的问题。我使用我的域名身份登录到我的本地计算机,该域名具有$server的管理员权限。如果我手动输入我的凭据,然后使用Invoke-Command,我收到错误:

  

无法在计算机上打开服务控制管理器''。此操作可能需要其他权限。

# Works
Get-Service -ComputerName $server-ErrorAction Ignore

# Doesn't work
$cred = Get-Credential
Invoke-Command -ComputerName localhost -ScriptBlock {param($serverIPAddress) Get-Service -ComputerName $server -ErrorAction Ignore} -Credential $cred -ArgumentList $server

内置凭据有什么特别之处可以让它起作用吗?

1 个答案:

答案 0 :(得分:2)

这是经典的kerberos双跳。

正在发生的特殊事情是本地计算机拥有您的凭据。它可以与远程计算机通信并证明它具有凭据,而无需发送它们。

但是,如果远程计算机需要访问第三台计算机(第二跳)上的某些内容,则无法证明它具有凭据(因为它没有),因此无法进行身份验证。

这是Kerberos按设计工作。

使用Invoke-Command到localhost仍在进行远程连接,因此它仍然算作跳。 Get-Service电话是第二跳。

考虑:

Invoke-Command -ComputerName $server -ScriptBlock { Get-Service -ErrorAction Ignore } -Credential $cred

这将有效(只要在远程计算机上启用了PowerShell远程处理)。

否则,你需要启用kerberos授权或CredSSP,或者(尽可能最好)返工你正在做的事情,不需要双跳。

Be wary of CredSSP (and delegation in general).