使用 winrm 和 Microsoft.Update.Session 远程修补服务器的问题

rec*_*bot 11 powershell windows-server-2003 windows-server-2008 windows-update winrm

我有一个带有 Windows 2003、2008 和 2008r2 服务器的网络。我有一个 powershell 脚本,我编写它来使用“Microsoft.Update”com 对象修补本地机器。(类似于 Windows 更新 PowerShell 远程处理。)我的脚本在本地运行良好,但我想远程使用它的功能,因为我有相当数量的服务器需要管理。在这种情况下,它会掉下来(类似于没有解决的其他帖子)。

然而,我能够将失败缩小到特定类的两种方法。

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()
Run Code Online (Sandbox Code Playgroud)

如果您以管理员身份在本地的 powershell 中运行这些,则不会有任何问题。如果您尝试使用 invoke-command(或 enter-session 或 winrs),您将收到以下错误。(这是使用 localhost 进行测试,但任何主机都可以。我还尝试了不同的身份验证方法,例如 credssp 和 kerberos。);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation
Run Code Online (Sandbox Code Playgroud)

我在博客上看到这是一个错误,但没有备份该声明。存在两种解决方法,但都不让我高兴。

  • 使用 psexec 以系统用户身份运行命令。PSExec 是我试图不使用的,因为它已被证明不可靠。我也想要一个纯粹的 powershell 解决方案。
  • 创建一个计划任务并告诉它以系统用户身份运行您的脚本。(通过他的帖子)这不仅很混乱,而且我不会有更新结果。我必须登录到文件或更新数据库或其他东西。

我对在主机上远程运行更新的其他方法持开放态度,因为这似乎是很多人都遇到的问题。

我找到了一些解释消息的文档,但没有解释原因或解决方法。

返回值 如果成功则返回 S_OK。否则,返回 COM 或 Windows 错误代码。

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.
Run Code Online (Sandbox Code Playgroud)

它怎么知道我在远程计算机上?

小智 6

你只是不能这样做,因为 MS 不允许你通过 WUApi 做到这一点。

详细信息可以在这里找到:http : //msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx

您可以尝试使用计划任务来完成此操作。


mot*_*bói 0

这样的命令需要在远程计算机上以特权运行,因此需要以域管理员用户或远程计算机上的管理员身份运行。

如果你是第一种情况,我没有帮助,但你只是本地管理员,不是远程管理员,get-credential像这样使用。

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}
Run Code Online (Sandbox Code Playgroud)

另一种更直接的形式是要求Invoke-Command提供凭据:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
Run Code Online (Sandbox Code Playgroud)