none
Windows Update Status via Powershell RRS feed

  • Frage

  • Hallo,

    ich befasse mich seit kurzem mit Powershell und scheitere leider bei dem Versuch, mögliche Windows Updates aufzulisten. Derzeit hänge ich bei dem Befehl:

    Get-WmiObject -Query "select * from win32_QuickFixEngineering"

    Dieser gibt mir aber leider, soweit ich verstanden habe nicht die offenen Updates, sondern nur die bereits installierten Updates aus.

    Am besten wäre es, wenn man mit einem Befehl, zum Beispiel die Ausgabe "3 Wichtig, 2 Optional" bekommt.

    Also genauso, wie es im "Windows Update"-Fenster erscheint, nur halt in Textform.

    Hat jemand eine Idee oder einen Tipp für mich?
    • Bearbeitet dr34mup Montag, 2. Februar 2015 14:03
    Montag, 2. Februar 2015 13:53

Antworten

  • Hallo,

    dazu musst Du ´mit dem COM-Objekt Microsoft.Update.Session arbeiten.

    			$UpdateSession = New-Object -ComObject Microsoft.Update.Session
    			$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
    			$UpdateSearcher.ServerSelection = 3
    			$UpdateSearcher.ServiceID = "7971F918-A847-4430-9279-4A52D1EFE18D"
    			$WUPacks = @($UpdateSearcher.Search("IsHidden=0 and IsInstalled=0").Updates)

    Wenn Du den Code laufen laesst wird gegen die Updateserver von Microsoft geprueft was an Updates fehlt. Die stehen dann alle in der Variablen $WUPACKS. Dies kannst Du dann weiter bearbeiten, um deine gewuenschte Infos zu erhalten.

    Beste Gruesse
    brima

    Montag, 2. Februar 2015 14:28

Alle Antworten

  • Hallo,

    dazu musst Du ´mit dem COM-Objekt Microsoft.Update.Session arbeiten.

    			$UpdateSession = New-Object -ComObject Microsoft.Update.Session
    			$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
    			$UpdateSearcher.ServerSelection = 3
    			$UpdateSearcher.ServiceID = "7971F918-A847-4430-9279-4A52D1EFE18D"
    			$WUPacks = @($UpdateSearcher.Search("IsHidden=0 and IsInstalled=0").Updates)

    Wenn Du den Code laufen laesst wird gegen die Updateserver von Microsoft geprueft was an Updates fehlt. Die stehen dann alle in der Variablen $WUPACKS. Dies kannst Du dann weiter bearbeiten, um deine gewuenschte Infos zu erhalten.

    Beste Gruesse
    brima

    Montag, 2. Februar 2015 14:28
  • Am 02.02.2015 schrieb dr34mup:

    Dieser gibt mir aber leider, soweit ich verstanden habe nicht die offenen Updates, sondern nur die bereits installierten Updates aus.

    Am besten wäre es, wenn man mit einem Befehl, zum Beispiel die Ausgabe "3 Wichtig, 2 Optional" bekommt.

    Lass dieses Script laufen, evtl. bekommst Du damit das gewünschte
    angezeigt:
    https://gallery.technet.microsoft.com/scriptcenter/0dbfc125-b855-4058-87ec-930268f03285


    Servus
    Winfried

    Gruppenrichtlinien
    HowTos zum WSUS Package Publisher
    WSUS Package Publisher
    HowTos zum Local Update Publisher
    NNTP-Bridge für MS-Foren

    Montag, 2. Februar 2015 14:46
  • Danke für deine Antwort. Leider wird nur eine gesamte Liste der benötigten Updates ausgegeben. Also nur ungefähr das Ergebnis, dass ich gerne hätte. Diesen Code habe ich probiert:

    Import-Module $PSHOME\Modules\PSPendingUpdates\Get-PendingUpdate.ps1
    
    Get-PendingUpdate -Computer localhost | Measure-Object | Select-Object -ExpandProperty count


    • Bearbeitet dr34mup Dienstag, 3. Februar 2015 13:36
    Dienstag, 3. Februar 2015 13:28
  • Hi brima,

    danke für deine Antwort. Allerdings verstehe ich nicht so ganz, wie ich den Variablen Wert, wieder ausgeben kann? Ich habe es zb. mit einem "Write-Host $WUPacks" probiert, allerdings wurde nichts ausgegeben. Was mache ich falsch?


    • Bearbeitet dr34mup Dienstag, 3. Februar 2015 13:36
    Dienstag, 3. Februar 2015 13:32
  • Hi brima,

    danke für deine Antwort. Allerdings verstehe ich nicht so ganz, wie ich den Variablen Wert, wieder ausgeben kann? Ich habe es zb. mit einem "Write-Host $WUPacks" probiert, allerdings wurde nichts ausgegeben. Was mache ich falsch?


    Pardon ein Fehler meinerseits. Habe mich verschrieben und es nicht sofort bemerkt.

    Bekomme allerdings bei einer Ausgabe nur diesen Wert zurück:

    System.__ComObject System.__ComObject System.__ComObject System.__ComObject System.__ComObject System.__ComObject System
    .__ComObject System.__ComObject System.__ComObject System.__ComObject System.__ComObject System.__ComObject System.__Com
    Object System.__ComObject System.__ComObject System.__ComObject System.__ComObject


    Dienstag, 3. Februar 2015 13:47
  • Hallo,

    was ich jetzt schreibe ist nicht boese gemeint, aber ich denke du solltest ein paar Gaenge zurueck schalten und dich erstmal mit den PowerShell Grundlagen vertraut machen.

    Deine Ausgabe beweist schon mal das der Code funktioniert und Updates gefunden werden.

    Wenn Du einfach nach den den 5 Zeilen die folgende Zeile eingibts siehst du jede Menge Infos je gefundenem Update, wird nichts gelistet hat er keine gefunden.

    $WUPacks

    Das sollte dann z.B: so aussehen:

    Title                           : Update for Microsoft Silverlight (KB3011970)
    AutoSelectOnWebSites            : True
    BundledUpdates                  : System.__ComObject
    CanRequireSource                : False
    Categories                      : System.__ComObject
    Deadline                        :
    DeltaCompressedContentAvailable : False
    DeltaCompressedContentPreferred : True
    Description                     : This update to Silverlight improves security, reliability, accessibility support,
                                      startup performance, enhances line-of-business support and includes several fixes to
                                      better support rich internet applications. This update is backward compatible with
                                      web applications built using previous versions of Silverlight.
    EulaAccepted                    : True
    EulaText                        :
    HandlerID                       :
    Identity                        : System.__ComObject
    Image                           :
    InstallationBehavior            : System.__ComObject
    IsBeta                          : False
    IsDownloaded                    : False
    IsHidden                        : False
    IsInstalled                     : False
    IsMandatory                     : False
    IsUninstallable                 : False
    Languages                       : System.__ComObject
    LastDeploymentChangeTime        : 13.12.2014 00:00:00
    MaxDownloadSize                 : 13083328
    MinDownloadSize                 : 0
    MoreInfoUrls                    : System.__ComObject
    MsrcSeverity                    :
    RecommendedCpuSpeed             : 500
    RecommendedHardDiskSpace        : 25
    RecommendedMemory               : 128
    ReleaseNotes                    :
    SecurityBulletinIDs             : System.__ComObject
    SupersededUpdateIDs             : System.__ComObject
    SupportUrl                      : http://go.microsoft.com/fwlink/?LinkID=105787
    Type                            : 1
    UninstallationNotes             :
    UninstallationBehavior          :
    UninstallationSteps             : System.__ComObject
    KBArticleIDs                    : System.__ComObject
    DeploymentAction                : 1
    DownloadPriority                : 2
    DownloadContents                : System.__ComObject
    RebootRequired                  : False
    IsPresent                       : False
    CveIDs                          : System.__ComObject
    BrowseOnly                      : False
    PerUser                         : False
    AutoSelection                   : 0
    AutoDownload                    : 0

    Willst Du nun z.B.: nur den Namen, das letzte Aenderungsdatum und die max. Groesse pro Patch anzeigen kannst Du das so machen.

    $WUPacks | Select-Object Title, LastDeploymentChangeTime, MaxDownloadSize

    Mit anderen *-Object CMDLets und Informationen aus $WUPacks.Categories kannst Du dann auch Auflistungen erzeugen, wie das 20 Patches gefunden wurden, davon 5 fuer Windows, 4 fuer fuer Office usw, und auch den Typ also Security Patch, Rollup, SP usw. aber das ist alles kein grosse Problem mehr wenn dir die Grundlagen der Powershell vertraut sind.

    Kauf dir ein gutes PowerSHell Buch und sieh dir z.B.: auf YouTube die Powershell Videos von Peter Kriegel an, in denen wird sehr viel erklaert und am Ende gibt es auch Links auf Buecherlisten usw.

    Beste Gruesse
    brima


    Dienstag, 3. Februar 2015 15:36
  • Am 03.02.2015 schrieb dr34mup:

    Danke für deine Antwort. Leider wird nur eine gesamte Liste der benötigten Updates ausgegeben. Also nur ungefähr das Ergebnis, dass ich gerne hätte.

    Wenn der Client an einem WSUS hängt, wirst Du IMHO auch nichts anderes
    bekommen.


    Servus
    Winfried

    Gruppenrichtlinien
    HowTos zum WSUS Package Publisher
    WSUS Package Publisher
    HowTos zum Local Update Publisher
    NNTP-Bridge für MS-Foren

    Dienstag, 3. Februar 2015 17:53
  • Sorry hatte gestern vergessen, dann noch zu antworten. Bin etwas verkühlt und stand gestern, daher echt auf der Leitung. Musste mich etwas einlesen und konnte dann das gewünschte Ergebnis erzielen:

    ################################################################################################
    #
    #	Nagios NRPE Powershell-Script
    #	
    #	Checks Windows Updates and returns Value to Nagios NRPE
    #	Inspired by "check_windows_updates.ps1" from Christian Kaufmann, created by Bernhard Sumser
    #	Special thanks to "brima" and "Winfried" (social.technet.microsoft.com)
    ################################################################################################
    
    # Convert script arguments to value. If no argument exiting the base value is set here
    param(
    [string]$warningArgument = 10,
    [string]$criticalArgument = 30
    )
    
    # Searching for sign in string. Remove first 3 signs and convert string to int32
    if ($warningArgument -match ":") {
    	$warningArgument = $warningArgument.Remove(0,3)
    	[int]$warningArgument = [convert]::ToInt32($warningArgument, 10)
    }
    if ($criticalArgument -match ":") {
    	$criticalArgument = $criticalArgument.Remove(0,3)
    	[int]$criticalArgument = [convert]::ToInt32($criticalArgument, 10)
    }
    
    # Return Levels Nagios NRPE gets
    $standardLevel = $args[0]
    $warningLevel = $args[1]
    $criticalLevel = $args[2]
    
    # Create COM Windows-Update API Object and write it in an Array
    $updateSession = New-Object -ComObject Microsoft.Update.Session
    $updateSearcher = $updateSession.CreateUpdateSearcher().Search(("IsInstalled=0 and Type='Software'")).Updates
    
    # Check if Windows needs a restart
    if (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"){ 
    	Write-Host "Updates: Installed, reboot required"
    	exit 1
    }
    
    # Create variable for counting updates
    $countCritical = 0;
    $countOptional = 0;
    $countHidden = 0;
    $countAll = 0;
    
    # Count updates
    Foreach ($update in $updateSearcher) {
    	if ($update.IsHidden) {
    		$countHidden++
    	}
    	elseif ($update.AutoSelectOnWebSites) {
    		$countCritical++
    	} else {
    		$countOptional++
    	}
    	$countAll++
    }
    
    # Exit program based on counted value with state
    if ($countAll -ge $warningArgument -and $countAll -lt $criticalArgument) {
    	Write-Host "Updates: $countCritical important, $countOptional optional"
    	exit 1
    }
    if ($countAll -ge $criticalArgument) {
    	Write-Host "Updates: $countCritical important, $countOptional optional"
    	exit 2
    }else {
    	if ($countHidden) {
    	Write-Host "OK: $countHidden hidden updates."
    	} else {
    	Write-Host "OK: No pending updates."
    	}
    	exit 0
    }

    INFO

    Das Script verwende ich als Ersatz zu dem derzeit noch nicht funktionierenden "check_updates" des NSClient 0.4.3.

    Damit das Script mit NSClient 0.4.3 funktioniert, muss vorher noch die nsclient.ini auf dem Client bearbeitet werden:

    [/modules]

    CheckExternalScripts = enabled

    [/settings/external scripts/scripts]
    check_windows_version = cmd /c echo scripts\check_windows_version.ps1; exit($LastExitCode) | powershell.exe -command -

    [/settings/external scripts/alias]

    ;alias for powershell script check_windows_updates.ps1
    alias_check_windows_updates = check_updates

    [/settings/external scripts/wrappings]

    ; POWERSHELL WRAPPING - 
    ps1 = cmd /c echo scripts\\%SCRIPT% %ARGS%; exit($lastexitcode) | powershell.exe -command -

    [/settings/external scripts/wrapped scripts]
    check_updates = check_windows_updates.ps1 $ARG1$ $ARG2$

    Auf den Nagios-Server noch die commands.cfg bearbeiten:

    define command {
    command_name check_windows_updates
    command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -t 360 -c check_updates -a /w:10 /c:30
    }

    Keine Ahnung ob bei dem Script noch etwas verbessert werden kann, allerdings erziele ich damit das gewünschte Ergebnis. :)

    Mittwoch, 4. Februar 2015 13:08