Invoke-Command 行为说明

Invoke-Command behavior clarification

我 运行 在使用 Invoke-Command cmdlet 时遇到了一些麻烦。我使用我的域身份登录到我的本地计算机,该身份在 $server 上具有管理员权限。如果我手动输入我的凭据,然后使用 Invoke-Command,我会收到错误消息:

Cannot open Service Control Manager on computer ''. This operation might require other privileges.

# 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

内置凭据是否有什么特别之处使它起作用?

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