如果不能直接确定下载未完成的原因,我怎样才能至少看到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;