PowerShell`Microsoft.Update.Session`;无法下载所有更新

PowerShell`Microsoft.Update.Session`;无法下载所有更新

如果不能直接确定下载未完成的原因,我怎样才能至少看到Microsoft.Update.Session幕后发生了什么?

我正在Microsoft.Update.Session尝试强制向 Windows 10 提供一些更新。我不知道 COM 对象在后台做什么,但我看到某些项目通过了(音频驱动程序、英特尔存储驱动程序……),但是,我正在下载更新集合的部分无限期地搁置着——上次尝试时,它搁置了整个周末。

当我强制超时时,返回的错误是通用的,“所有更新操作失败。”(HResult -2145124318)

这是正在进行下载的部分。

Start-Job {
    $Downloader = $Session.CreateUpdateDownloader()
    $Downloader.Updates = $UpdateCollection
    $Downloader.Download()
} # | Wait-Job -Timeout $(1*60*60) # Seconds to wait on download

以下是剧本的剩余部分,

## Query-MicrosoftUpdate.ps1

$Blacklist = @(
    "*Windows 11*",
    "*BIOS*"
)

Function DisableMicrosoftUpdate {
    Param ([bool]$Status)
    $Bit = [int][bool]::Parse($Status)
    ## Temporarily enable communication with Microsoft Update
    $RegPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
    New-ItemProperty -Path $RegPath -Name "DoNotConnectToWindowsUpdateInternetLocations" -Value $Bit -PropertyType DWORD -Force
}

DisableMicrosoftUpdate $False

## Object definition
$UpdateCollection = New-Object -ComObject "Microsoft.Update.UpdateColl"
$Session = New-Object -ComObject "Microsoft.Update.Session"
$Installer = New-Object -ComObject "Microsoft.Update.Installer"

## Update check
$Criteria = "(IsInstalled=0 and DeploymentAction=*)"
$Result = $Session.CreateUpdateSearcher().Search($Criteria).Updates
$Result | Select-Object Title,Identity,IsHidden,LastDeploymentChangeTime,KBArticleIDs | `
Format-List -Property `
    Title, `
    @{l='UpdateID';e={$_.Identity.UpdateID}}, `
    @{l='PublishedDate';e={$_.LastDeploymentChangeTime.ToString('yyyy-MM-dd')}}, `
    @{l='KBArticle';e={$_.KBArticleIDs}}, `
    IsHidden

$n = 0
ForEach ($Update in $Result) {
    Write-Host "Processing... $($Update.Title)"
    $Valid = $True
    ForEach ($Item in $Blacklist){If (($Update.Title -like $Item)) {$Valid = $False; $Trigger = $Item}}
    ## Add to collection if blacklisted term is not detected
    If ($Valid) {$UpdateCollection.Add($Result.Item($n))}
    Else {Write-Host "Found blacklisted item `"$Trigger`" in update title, skipping..."}
    $n++ | Out-Null
}

## Download updates in filtered collection
Start-Job {
    $Downloader = $Session.CreateUpdateDownloader()
    $Downloader.Updates = $UpdateCollection
    $Downloader.Download()
} # | Wait-Job -Timeout $(1*60*60) # Seconds to wait on download

## Install updates in filtered collection
$Installer.Updates = $UpdateCollection
$Installer.Install()

# DisableMicrosoftUpdate $True

答案1

这是我必须在环境中的系统上使用的 PowerShell 脚本,以强制工作站上的 Windows 更新向 Microsoft 检查其 Windows 更新。

在这种情况下,域组策略将硬编码的 WSUS 注册表设置推送到机器,以告诉它在哪里下载 Windows 更新。

如果相关的注册表设置被清除,Windows 更新服务将重新启动 - 然后在gpupdate运行之前 - 它会检查 Windows 更新,它会直接与 Microsoft Internet 服务器检查它们是否开始下载。

本质上是这样的:

  • 删除所有 Windows 更新域组策略推送的设置
  • 停止 Windows 更新服务
  • 清除本地 Windows 更新缓存和其他相关历史数据文件
  • 删除所有“计算机”和“用户”级别当地的组策略
  • 重新启动 Windows 更新服务
  • 强制计算机直接从 Microsoft Internet 服务器签入、扫描和检查 Windows 更新

电源外壳

警告: 这将清除使用 设定的所有本地组策略配置gpedit.msc。如果这些配置很重要,请确保在运行此脚本之前备份或记录这些配置。

## Remove any WSUS or other hard coded WU settings and wipe old WU cache files, etc.
Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Force -Confirm:$false;
Stop-Service -Name wuauserv -Force;
$path = "c:\windows\SoftwareDistribution";
Remove-Item -path $path -force -recurse;
 
## Wipe local GPOs
Remove-Item -Recurse -Force "C:\Windows\System32\GroupPolicyUsers";
Remove-Item -Recurse -Force "C:\Windows\System32\GroupPolicy";
 
## Restart WU and force check-in
Restart-Service -Name wuauserv -Force;
1..5 | % { (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow(); Sleep -Seconds 3; }
c:\windows\system32\UsoClient.exe startscan;
c:\windows\system32\UsoClient.exe startinteractivescan;

相关内容