我正在尝试远程管理 Windows 7 计算机。我已启用 WinRM 并可用于Enter-PsSession
连接到远程计算机。
但是,我注意到在本地运行特定命令与远程运行特定命令之间存在差异,即使我使用同一个用户帐户(即域管理员)进行连接。
远程会话的输出是:
> 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 设置为“不受限制”,当我在远程计算机上使用本地 powershell 会话时,此命令效果很好。
远程 Powershell 会话是否有不同的安全上下文?
编辑:失败的具体行是这一行:
$objSystemInfo= New-Object -ComObject "Microsoft.Update.SystemInfo"
答案1
Windows Update API 比较特殊。它专门通过检查您的令牌是否被标记为远程来检查并禁止远程访问。我不知道为什么要这样写。
我最终创建了一个计划任务并在其中调用了 Windows 更新 API - 相当麻烦。
答案2
根据 Get-WURebootStatus cmdlet 访问其信息的具体方式,我认为它可能与 PowerShell 中的“第二跳”问题有关。
当您进入远程 PowerShell 会话时,您正在要求 WinRM 使用您的凭据在远程主机上创建会话。如果您从同一会话尝试访问需要这些凭据的另一个(远程)系统或服务,则请求将失败,因为远程计算机无权使用您的凭据对其他任何内容进行身份验证。“嘿,脚本小伙!”博客很好地解释了这一点:
出于同样的原因,当您远程控制进入一台机器并尝试使用 Test-Path 访问另一台远程机器共享路径时,您会看到相同(或类似)的问题。
解决方案(如博客文章中所述)是在创建 PSSession 时启用并使用 CredSSP 作为身份验证机制。
您还可以将命令包装在计划任务中并立即运行,但这会增加很多不必要的额外工作。
答案3
复制自堆栈溢出:Powershell Remote:Microsoft.Update.Session,访问被拒绝:0x80070005:
当您处于远程 PowerShell 会话中时,此远程计算机上的登录会话被标记为“网络”登录(登录类型:3)。出于某些不为人知的原因(安全?销售 SCCM?),部分Windows 更新代理 COM API 受到限制仅可供本地登录的管理员使用。
有人建议使用 PsExec 和计划任务作为解决方法。
在我看来,最无缝(并且仍然安全有能力的)解决方案是促进 RunAs 风格“本地虚拟账户“PowerShell 的功能会话配置/杰亚。通常,JEA 用于“限制”用户可以在远程计算机上通过 PowerShell 执行哪些操作,但我们在这里滥用它来获得完全访问权限,就像我们是本地登录的管理员一样。
(1.)在ComputerB
(远程服务器)上创建一个新的不受限制的(并且持久的!)会话配置:
New-PSSessionConfigurationFile -RunAsVirtualAccount -Path .\VirtualAccount.pssc
# Note this will restart the WinRM service:
Register-PSSessionConfiguration -Name 'VirtualAccount' [-ShowSecurityDescriptorUI] -Path .\VirtualAccount.pssc -Force
# Check the Permission property:
Get-PSSessionConfiguration -Name 'VirtualAccount'
# Those users will have full unrestricted access to the system!
(2.)从ComputerA
(本地客户端)连接到 ComputerB 上的不受限制的会话配置:
New-PSSession -ComputerName 'ComputerB' -ConfigurationName 'VirtualAccount' | Enter-PSSession
[ComputerB]: new-object -com "Microsoft.Update.Downloader" # Yay!
答案4
尝试使用Get-WURebootStatus -ComputerName <your remote computer> -Silent
。