【问题标题】:Invoke-Command behavior clarificationInvoke-Command 行为说明
【发布时间】:2016-04-05 14:24:39
【问题描述】:

我在使用 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

内置凭据有什么特别之处吗?

【问题讨论】:

    标签: powershell windows-authentication kerberos powershell-4.0 invoke-command


    【解决方案1】:

    这是经典的 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).

    【讨论】:

    • 我希望避免打开 powershell 远程处理,因为我以前从未使用过它,也不知道我是否可以将它卖给 IT 团队。谢谢你的解释!
    • @Vlad274 考虑到在 windows server 2012 及更高版本中,powershell 远程处理是开箱即用的。我发现这是支持启用它的有力论据,似乎引起了其他犹豫不决的 IT 专业人士的共鸣。