我试图远程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。 “嗨,脚本专家! 博客解释了这一点:
出于同样的原因,在远程访问机器之后,尝试访问具有Test-Path的另一个远程计算机共享path时,您会看到相同(或相似)的问题。
解决scheme(如博客文章中所述)在创buildPSSession时启用并使用CredSSP作为身份validation机制。
你也可以将这个命令包装在一个计划任务中,并且立即运行,但这是很多额外的工作,可能是不必要的。
尝试使用Get-WURebootStatus -ComputerName <your remote computer> -Silent
。