PS Windows Update cz. 2 Installer

mnustOstatnio zaprezentowałem jak poprzez PowerShella odpytać serwer usługi Windows Update odnośnie nowych aktualizacji. Dziś pokażę jak takie aktualizację pobrać i zainstalować na swojej maszynie. Niestety w zależności od nałożonej polityki zabezpieczeń może się okazać, iż konieczne będzie wykonywanie poniższych kroków z uprawnieniami administratora.

Przed rozpoczęciem instalacji sprawdzamy czy aby przypadkiem nie jest konieczny restart maszyny. Można to również wykonać przy użyciu metody RebootRequiredBeforeInstallation obiektu samego Installera.

$objSystemInfo= New-Object -com "Microsoft.Update.SystemInfo"
$objSystemInfo.RebootRequired

Jeśli nie to gwoli przypomnienia, a jednocześnie kontynuacji wysyłamy zapytanie o nowe aktualizację do serwera.

$objSession = New-Object -ComObject "Microsoft.Update.Session"
$objSearcher = $objSession.CreateUpdateSearcher()
$objResults = $objSearcher.Search("IsInstalled=0")

Zanim jednak rozpoczniemy pobieranie i instalację stworzymy sobie kolejny obiekt który będzie nam przechowywał zaakceptowane do pobrania aktualizacje.

$objToDownloadCollection = New-Object -com "Microsoft.Update.UpdateColl"

Jeżeli chcemy możemy sobie sprawdzić status pobrania aktualizacji.

Foreach($objEntry in $objResults.Updates){$objEntry | Select Title,MaxDownloadSize,IsDownloaded}

Następnie przeglądamy listę dostępnych aktualizacji, wybieramy jakie nas interesują i dodajemy je do kolejki.

Foreach($Update in $objResults.Updates)
{
  $accept = Read-Host "Pobrać: $($Update.Title) ?"
  If($accept –eq "Y")
  {
    $objToDownloadCollection.Add($Update) | out-null
  }
}

Możemy sprawdzić ilość zaakceptowanych aktualizacji

$objToDownloadCollection.Count

Możliwe jest również natychmiastowe pobieranie i instalowanie aktualizacji, niemniej jednak było by to dość uciążliwe. Głównie dlatego, iż zmusiło by nas to do oczekiwania na kolejną akceptację pomiędzy pobieraniem i instalacją obecnie przetwarzanej aktualizacji.

Gdy posiadamy już zbiór zaakceptowanych aktualizacji rozpoczynamy ich pobieranie. Do tego celu przeglądamy listę i tworzymy obiekt Downloadera.

If($objToDownloadCollection.Count –gt 0)
{
  $Downloader = $objSession.CreateUpdateDownloader()
  $Downloader.Updates = $objToDownloadCollection
  $DownloadResult = $Downloader.Download()
}

Proces pobierania może zwrócić nam następujące statusy

$DownloadResult.ResultCode:

0 - "NotStarted"
1 - "InProgress"
2 - "Succeeded"
3 - "SucceededWithErrors"
4 - "Failed"
5 - "Aborted"

Ponownie możemy sobie sprawdzić status pobrań aktualizacji.

Foreach($objEntry in $objResults.Updates){$objEntry | Select Title,MaxDownloadSize,IsDownloaded}

Następnie tworzymy sobie kolejną kolekcję aktualizacji, która będzie przechowywać zbiór pobranych aktualizacji.

$objToInstallCollection = New-Object -com "Microsoft.Update.UpdateColl"

Przeglądamy jeszcze raz wynik wyszukiwania aktualizacji, tym razem pod kątem status IsDowloaded.

Foreach($Update in $objResults.Updates)
{
  If($Update.IsDownloaded)
  {
    $objToInstallCollection.Add($Update) | out-null
  }
}

Również i tu możemy sprawdzić ilość poprawnie skierowanych do instalacji aktualizacji

$objToInstallCollection.Count

Następnie możemy przystąpić do ich zainstalowania. Do tego celu tworzymy sobie obiekt Installera i postępujemy analogicznie jak w przypadki pobierania.

If($objToInstallCollection.Count –gt 0)
{
  $objInstaller = $objSession.CreateUpdateInstaller()
  $objInstaller.Updates = $objToInstallCollection
  $InstallResult = $objInstaller.Install()
}

Podobnie jak przy pobieraniu, Installer może zwrócić nam następujące kody:

$InstallResult.ResultCode:

0 - "NotStarted"
1 - "InProgress"
2 - "Succeeded"
3 - "SucceededWithErrors"
4 - "Failed"
5 - "Aborted"

Obiekt InstallResult pozwala nam nie tylko sprawdzić status procesu instalacji, lecz również czy aby przypadkiem nie jest konieczny restart maszyny po zakończeniu wgrywania poprawek.

$InstallResult.RebootRequired

Restartujemy maszynę.

Restart-Computer

I sprawdzamy stan zainstalowanych aktualizacji

$objSession = New-Object -com "Microsoft.Update.Session"
$objSearcher = $objSession.CreateUpdateSearcher()
$count = $objSearcher.GetTotalHistoryCount()
if($count -gt 0)
{
  $colHistory = $objSearcher.QueryHistory(0, $count)
  Foreach($Update in $colHistory){ $Update | Select Title, Date}
}

Zaprezentowane tutaj rozwiązania są podstawowymi poleceniami, aby dokonać aktualizacji systemu Windows. Niemniej jednak opcji, by stworzyć tą procedurę bardziej powiedzmy „User Friendly” jest mnóstwo, a tak naprawdę ogranicza nas tylko nasza własna wyobraźnia.

Jak już wcześniej pisałem dla leniwych możliwe jest również użycie gotowych funkcji z których ja korzystam, a które zgromadziełm w module PSWindowsUpdate.

Źródła:
http://msdn.microsoft.com/en-us/library/aa387291(v=VS.85).aspx
http://code.msdn.microsoft.com/PSWindowsUpdate

Reklamy

2 thoughts on “PS Windows Update cz. 2 Installer

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s