使用Powershell的Invoke-Command运行Windows Update时拒绝访问

时间:2017-09-28 18:36:30

标签: powershell powershell-remoting invoke-command windows-update

我一直在尝试设置一个Powershell模块,该模块可以使用Invoke-Command远程调用服务器上的Windows / Microsoft更新,然后处理更新,并将所有内容发送回调用服务器,以便它可以发送电子邮件报告。

当我尝试调用下载程序时出现问题:Powershell似乎在远程计算机上请求提升权限。

以下是我尝试运行和失败的内容片段:

Invoke-Command -ComputerName $Server -Credential $Credentials -ScriptBlock {
    $UpdateSession = New-Object -ComObject "Microsoft.Update.Session"
    Write-Progress -Activity "Updating" -Status "Checking for new updates"
    $Criteria = "IsInstalled=0 and Type='Software'"
    $Updates = $UpdateSession.CreateUpdateSearcher().Search($Criteria).updates
    $Downloader = $UpdateSession.CreateUpdateDownloader()
    $Downloader.Updates = $Updates
}

我知道问题不在于远程处理,因为前4个命令工作正常。 $Credentials变量指向预定义的凭据,即远程服务器上的本地管理员。

当脚本到达第5行$Downloader = $UpdateSession.CreateUpdateDownloader()时,我从Powershell收到此错误:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
    + CategoryInfo          : OperationStopped: (:) [], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException
    + PSComputerName        : SERVER.sidlee.inc

究竟是什么造成这种情况?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

由于我刚刚碰到同一堵墙,谷歌也没有多大帮助,这就是我可以挖掘的东西。

为了记录,我几乎都在做同样的事情(使用自定义PS代码来检查远程系统的Windows更新)但是使用WinRM而不是Invoke-Command而且还卡在Microsoft.Update.Searcher.Search()上抛出E_ACCESSDENIED错误。

UnauthorizedAccessException确实与Powershell无关,而与底层API无关。

我怀疑微软在最近的一些更新(Powershell v5?)中开始切断远程会话中的模拟,因为这在旧版Windows版本(例如,带有Powershell v3的Server 2012或带有v4的2012 R2)上工作正常(并且仍然如此)

为了解决这个问题,你需要在使用PSCredential对象执行你的东西之前(在远程服务器上)进行身份验证。

所以Remote Auth -> Local Auth -> Run stuff例如使用Start-Process -Credential ...

e.g。

$pass = ConvertTo-SecureString "PA$$W0RD" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential "User", $pass
Start-Process -Credential $creds powershell -ArgumentList "-Command & { ... whatever you want to do ... }"
  

请注意,这会带来安全风险,因为您的密码将以明文形式进行解析,因此请勿在   未加密的频道!