Detalii SISTEM:
Ediție = Windows Server 2019 Standard,
Versiune = 1809,
Compilarea sistemului de operare = 17763.2114
Codul meu:
- $UpdateSession = Nou-Object -ComObject Microsoft.Update.Session
- $UpdateServiceManager = Nou-Object -ComObject Microsoft.Update.ServiceManager
- $UpdateService = $UpdateServiceManager.AddScanPackageService ("Serviciu de sincronizare offline", $CabPath, 1)
- $UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
- $UpdateSearcher.ServerSelection = 3
- $UpdateSearcher.ServiceID = $UpdateService.ServiceID.ToString()
*Se blochează AICI* - $Missing = $UpdateSearcher.Search("IsInstalled=0")
Scriptul PS rulează bine pe alte câteva servere cu 2012 R2, 2016 și 2019; dar asta imi da batai de cap. Odată ce începe căutarea, -Verbose încetează să ofere rezultate (cu Set-PSDebug -Trace 2).Această metodă de căutare a durat între 3 și 15 minute pe celelalte sisteme, dar chiar și după 24 de ore este încă pe această linie.
Într-un alt fir, snip furnizat mai jos, am găsit ceea ce ar putea fi o soluție, dar trebuie să știu cum să transform funcția de căutare în asincron în timpul căutării. Sau există o altă modalitate de a depana metoda acestui API? WSUS nu a reușit să obțină actualizări de la servere și unele servere nu au fost recunoscute de la AD sau DNS, așa că am folosit scriptul API WUA pentru a căuta offline.
Postare anterioară de Elliot Labs LLC >>
Am vorbit cu managerul de la Microsoft responsabil cu Windows Update
(Dave Roth) și a spus că nu ar trebui să încerci să obții
starea Windows Update prin intermediul registrului. El a spus că ar trebui să folosești
API-ul COM pentru a obține starea executând metoda de căutare și folosind
rezultatele returnate pentru starea actualizării computerului dvs.
Mi-a dat și acest sfat:
Ca o simplă informație, pentru a verifica ce actualizări sunt instalate apelând
IUpdateSearcher::Search with IsInstalled=1 va genera un
obiect updatecollection care conține toate actualizările instalate. Poti sa mergi
prin el pentru a vedea ce este deja instalat.
Extindendu-și sfatul cu care ai putea numi această metodă
IsInstalled=0 pentru a vedea ce actualizări nu sunt instalate. (vezi
exemplu powershell de mai jos).
COM API
API-ul COM este o modalitate bună de a accesa direct Windows Update fără
trebuind să analizeze jurnalele. Aplicațiile acestui API variază de la găsire
actualizările disponibile pe computer pentru instalare și dezinstalare
actualizări.
Puteți utiliza clasa Microsoft.Update.Session pentru a rula o actualizare
căutați și apoi numărați numărul de actualizări disponibile pentru a vedea dacă există
sunt actualizări pentru computer.
Exemplu PowerShell:
$updateObject = Nou-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Serverfault Exemplu de Script"
$updateSearcher = $updateObject.CreateUpdateSearcher() $searchResults
= $updateSearcher.Search("IsInstalled=0") Write-Host $searchResults.Updates.Count Dacă rezultatul returnat este mai mare de 0
apoi există actualizări pentru computer care trebuie instalate
și/sau descărcat. Puteți actualiza cu ușurință scriptul Powershell pentru a se potrivi
aplicatia ta.
Doar un avertisment, se pare că funcția de căutare nu este asincronă, așa că ar îngheța aplicația în timpul căutării. In acest caz tu
va dori să-l facă asincron.