为什么域管理员可以在本地运行 powershell cmd,但使用相同帐户通过 WinRM 连接时,命令会返回 UnauthorizedAccessException?

为什么域管理员可以在本地运行 powershell cmd,但使用相同帐户通过 WinRM 连接时,命令会返回 UnauthorizedAccessException?

我正在尝试远程管理 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 使用您的凭据在远程主机上创建会话。如果您从同一会话尝试访问需要这些凭据的另一个(远程)系统或服务,则请求将失败,因为远程计算机无权使用您的凭据对其他任何内容进行身份验证。“嘿,脚本小伙!”博客很好地解释了这一点:

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

出于同样的原因,当您远程控制进入一台机器并尝试使用 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

相关内容