我有一个装有Windows 2003、2008和2008r2服务器的网络。我有一个Powershell脚本,该脚本是使用“ Microsoft.Update” com对象编写的,用于修补本地计算机。(类似于 Windows Update PowerShell Remoting。)我的脚本在本地可以很好地运行,但是由于要管理的服务器数量很多,我想远程使用它的功能。在这种情况下,它会下降(类似于其他未解决的帖子)。
但是,我能够将失败范围缩小到特定类的两个方法。
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()
如果您以管理员身份在本地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
我已经在博客上看到这是一个错误,但是对此说法没有任何支持。存在两种解决方法,但都不能使我满意。
- 使用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.
怎么知道我在远程计算机上?