我有一个装有 Windows 2003、2008 和 2008r2 服务器的网络。我编写了一个 powershell 脚本,用于使用“Microsoft.Update”com 对象修补本地计算机。(类似于 Windows 更新 PowerShell 远程处理.) 我的脚本在本地运行良好,但我想远程使用它的功能,因为我有相当多的服务器需要管理。在这种情况下,它就会失败(类似于另一篇未解决的帖子)。
然而,我能够将失败的原因缩小到特定类的两种方法。
(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.
它怎么知道我在远程计算机上?
答案1
你根本做不到,因为 MS 不允许你通过 WUApi 来做到这一点。
详细信息可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
您可以尝试使用计划任务来完成此操作。
答案2
这样的命令需要在远程机器上使用权限运行,因此需要以域管理员用户或远程机器上的管理员身份运行。
如果您是第一种情况,我没有帮助,但您只是本地管理员,而不是远程管理员,请get-credential
像这样使用。
$cred = get-credential
Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}
另一种更直接的形式是Invoke-Command
要求提供凭证:
Invoke-Command -scriptblock {$ENV:username} -Credential ""
答案3
我可以通过在远程服务器上设置 JEA 端点作为本地虚拟帐户运行来实现这一点。
从https://docs.microsoft.com/en-us/powershell/jea/session-configurations:
本地虚拟账户
如果此 JEA 端点支持的角色都用于管理本地计算机,并且本地管理员帐户足以成功运行命令,则应将 JEA 配置为使用本地虚拟帐户。虚拟帐户是特定用户独有的临时帐户,仅在其 PowerShell 会话期间有效。在成员服务器或工作站上,虚拟帐户属于本地计算机的管理员组,并有权访问大多数系统资源。在 Active Directory 域控制器上,虚拟帐户属于域的域管理员组。