为什么域pipe理员可以在本地运行powershell cmd,但是通过WinRM连接相同的帐户,命令返回一个UnauthorizedAccessException?

我试图远程pipe理Windows 7机器。 我启用了WinRM,并可以使用Enter-PsSession连接到远程机器。

不过,我注意到在本地运行特定命令与远程运行特定命令之间的区别,即使我使用相同的用户帐户(这是一个域pipe理员)连接。

远程会话的输出是:

 > enter-pssession -computername REMOTEHOST [REMOTEHOST} > Get-WURebootStatus New-Object : Creating an instance of the COM component with CLSID {C01B9BA0-BEA7-41BA-B604-D0A36F469133} from the IClassFactory failed due to the following error: 80070005. At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\pswindowsupdate\Get-WURebootStatus.ps1:52 char:33 + $objSystemInfo= New-Object <<<< -ComObject "Microsoft.Update.SystemInfo" + CategoryInfo : NotSpecified: (:) [New-Object], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.NewObjectCommand 

ExecutionPolicy被设置为'Unrestricted',并且这个命令在远程机器上使用本地powershell会话时效果很好。

远程PowerShell会话有不同的安全上下文吗?

编辑 :它的失败的具体行是这一个:

 $objSystemInfo= New-Object -ComObject "Microsoft.Update.SystemInfo" 

Windows Update API是特殊的。 它通过检查您的令牌是否被标记为远程来专门检查和禁止远程访问。 我不知道为什么这样写。

我结束了创build一个计划的任务,并调用Windows更新API里面 – 非常麻烦。

取决于Get-WURebootStatus cmdlet如何访问它的信息,我认为它可能与PowerShell中的“第二跳”问题有关。

当你input远程PowerShell会话时,你要求WinRM使用你的凭证在远程主机上创build一个会话。 如果从同一个会话尝试访问需要这些凭据的另一个(远程)系统或服务,则该请求将失败,因为远程计算机未被授权使用您的凭证进行任何其他身份validation。 “嗨,脚本专家! 博客解释了这一点:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx

出于同样的原因,在远程访问机器之后,尝试访问具有Test-Path的另一个远程计算机共享path时,您会看到相同(或相似)的问题。

解决scheme(如博客文章中所述)在创buildPSSession时启用并使用CredSSP作为身份validation机制。

你也可以将这个命令包装在一个计划任务中,并且立即运行,但这是很多额外的工作,可能是不必要的。

尝试使用Get-WURebootStatus -ComputerName <your remote computer> -Silent