【问题标题】:Access denied while running Windows Update using Powershell's Invoke-Command使用 Powershell 的 Invoke-Command 运行 Windows 更新时访问被拒绝
【发布时间】:2018-03-10 14:39:18
【问题描述】:

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

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

这是我尝试运行和失败的 sn-p:

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

究竟是什么原因造成的?

提前感谢您的帮助!

【问题讨论】:

  • 如果我没记错的话,大多数 Windows Update 和 Microsoft Installer 方法都需要本地和交互式会话。一种解决方法是设置一个任务计划程序任务以立即运行。
  • 如果是这样,那将非常糟糕,因为这基本上是我最初所做的。我有一个运行所有内容的大型脚本(触发 Windows 更新、生成报告、通过另一台服务器通过电子邮件发送它们等),但我希望通过 Powershell 模块从单个服务器运行所有内容。

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


【解决方案1】:

由于我刚刚碰到了同一堵墙,而且 Google 也帮不上什么忙,所以我可以挖掘一下。

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

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

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

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

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

例如

$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 ... }"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2018-07-22
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多