我遇到了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
内置凭据有什么特别之处可以让它起作用吗?
答案 0 :(得分:2)
这是经典的kerberos双跳。
正在发生的特殊事情是本地计算机拥有您的凭据。它可以与远程计算机通信并证明它具有凭据,而无需发送它们。
但是,如果远程计算机需要访问第三台计算机(第二跳)上的某些内容,则无法证明它具有凭据(因为它没有),因此无法进行身份验证。
这是Kerberos按设计工作。
使用Invoke-Command
到localhost仍在进行远程连接,因此它仍然算作跳。 Get-Service
电话是第二跳。
考虑:
Invoke-Command -ComputerName $server -ScriptBlock { Get-Service -ErrorAction Ignore } -Credential $cred
这将有效(只要在远程计算机上启用了PowerShell远程处理)。
否则,你需要启用kerberos授权或CredSSP,或者(尽可能最好)返工你正在做的事情,不需要双跳。