none
Windows Update script to check if security updates are available RRS feed

  • Frage

  • Hey guys. I'm a Powershell Beginner and I'm working on a PowerShell script to automatically check every day if a security relevant updates/hotfixes for the Windows Servers of my company are available. If so the script should send an notification mail to a specific mail address with the number of the update as content.

    I totally would need some help.

    Here's what I've got so far:

    $Hostname= env:computername
    $Mailcontent = Get-WUList -title “security” OR “critical”
    Get-WUList -title “security” OR “critical” |  Send-MailMessage -From psalert@test.com -to tester.intest@test.com -Subject $Hostname - kritische Updates verfügbar -Body

    I downloaded the module Windows Update PowerShell Module to make this work. 

    Well, it doesn't work. I get an error message already at the beginning, from env:computername. It somehow doesn't recognize the computername environment variable.

    Can you please help me?

    Kind regards

    Mittwoch, 22. Februar 2017 16:12

Antworten

  • Moin,

    $ENV ist das Standardlaufwerk für Umgebungsvariablen, den kannst Du nicht umdefinieren. Nimm doch einfach wie vorgeschlagen $ENV:ComputerName

    Ansonsten fehlen im Send-MailMessage-Aufruf  noch Bindestriche, Anführungszeichen usw.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    Donnerstag, 23. Februar 2017 11:02
  • $ENV=ComputerName
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From psalert@test.ch to florian.tester@test.ch -Subject $ENV kritische Updates verfügbar

    $hostname = $env:COMPUTERNAME
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From "psalert@test.ch" -To "florian.tester@test.ch" -Subject "$hostname kritische Updates verfuegbar"



    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Donnerstag, 23. Februar 2017 11:15
  • So sollte es laufen:

    Import-Module PSWindowsUpdate
    $user = "Username" $password = "Password" | Convertto-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.Pscredential -Argumentlist $user,$password $hostname = $env:COMPUTERNAME $updatelist = @(Get-WUList -title "security";Get-WUList -title "critical") if ($updatelist) { Send-MailMessage -From "Absender" -To "Empfaenger" -Subject "$hostname kritische Updates verfuegbar" -SmtpServer "Mail-Server" -Port "Serverport" -Credential $credentials #optional -UseSsl }



    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Donnerstag, 23. Februar 2017 12:01
  • Es gibt keine Category Security (oder ich steh gerade total auf dem Schlauch bei dem Module). Also entweder über den Namen mit -Title oder Du filterst nach dem Updatetyp

    get-wulist | Where-Object {$_.Type -like "1"}
    Type = 1 sind bei mir die Updates für Silverlight und Windows Defender. Keine Ahnung ob das der Kategorie "Security" oder Einstufung "Critical" entspricht. Ich hab gerade keine Möglichkeit das nachzuprüfen.

    Eventuell findest Du aber mit

    Get-WUList | Get-Member 
    noch ein anderes Property nachdem Du sinnvoll filtern kannst ob ein wichtiges Update am Server verfügbar ist.

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Freitag, 24. Februar 2017 09:58

Alle Antworten

  • Als Erstes: Das hier ist das deutsche Powershell Forum - sprich ruhig deutsch mit uns.  ;-)

    Hey guys. I'm a Powershell Beginner and I'm working on a PowerShell script to automatically check every day if a security relevant updates/hotfixes for the Windows Servers of my company are available. If so the script should send an notification mail to a specific mail address with the number of the update as content.

    warum? ... es gibt einen festen Termin dafür - den Microsoft Patch Day!!

    $Hostname= env:computername 

    Da fehlt ein Dollar-Zeichen vor dem "env". Aber warum weist Du denn den Inhalt einer Variable einer anderen zu? Verwende doch einfach die Umgebungsvariable ( $ENV:ComputerName)

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 22. Februar 2017 16:24
    Mittwoch, 22. Februar 2017 16:24
  • warum? ... es gibt einen festen Termin dafür - den Microsoft Patch Day!!

    naja... aber nach dem MS Patchday (und der dringend empfohlenen Testphase ;-) ) kommen noch mindestens zwei Instanzen:

    • Patch Management, das die Updates für den jeweiligen Server im WSUS freigibt
    • Server Management (der jeweiligen Applikation), das für die Applikation eine Wartung ankündigt, Updates installiert und die Maschinen bootet.

    Und darum, diese letzte Instanz zu überwachen, dürfte es Florian hierbei gehen. Habe ich auch regelmäßig.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Mittwoch, 22. Februar 2017 17:01
  • naja... aber nach dem MS Patchday (und der dringend empfohlenen Testphase ;-) ) kommen noch mindestens zwei Instanzen:

    Ja ... schon klar ... keine Frage ... aber dann muss man ja eben nicht jeden Tag checken. Darum ging es mir bei meinem Kommentar. 

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 22. Februar 2017 19:33
  • Hallo zusammen

    Ist gut, dann schreib ich ab jetzt Deutsch.

    Erst mal danke für die raschen Antworten. Mein Chef möchte dieses Skript, um auch über "ausserplanmässige", sicherheitskritische Updates schnellstmöglich informiert zu sein, falls z.B. eine Sicherheitslücke schnell geschlossen werden muss.

    Ich probiers gleich mal ohne noch eine zusätzliche Variable zu definieren.

    Donnerstag, 23. Februar 2017 08:54
  • Also, das Skript bis jetzt:

    $ENV=ComputerName
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From psalert@test.ch to florian.tester@test.ch -Subject $ENV kritische Updates verfügbar

    Als Fehlermeldung kommt:

    Missing expression after unary operator '-'.
    At C:\Users\Flo\Desktop\PowershellWindowsUpdate.ps1:3 char:2
    + - <<<< Subject $ENV kritische Updates verfügbar
        + CategoryInfo          : ParserError: (-:String) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : MissingExpressionAfterOperator

    Es scheint, dass PS ein Problem mit dem - bei -Subject hat, dies müsste jedoch korrekt sein gemäss Syntax von Send-MailMessage. Weiss da jemand was?

    Vielen Dank für eure Hilfe.

    LG

    Florian

    Donnerstag, 23. Februar 2017 10:53
  • Moin,

    $ENV ist das Standardlaufwerk für Umgebungsvariablen, den kannst Du nicht umdefinieren. Nimm doch einfach wie vorgeschlagen $ENV:ComputerName

    Ansonsten fehlen im Send-MailMessage-Aufruf  noch Bindestriche, Anführungszeichen usw.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    Donnerstag, 23. Februar 2017 11:02
  • $ENV=ComputerName
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From psalert@test.ch to florian.tester@test.ch -Subject $ENV kritische Updates verfügbar

    $hostname = $env:COMPUTERNAME
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From "psalert@test.ch" -To "florian.tester@test.ch" -Subject "$hostname kritische Updates verfuegbar"



    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Donnerstag, 23. Februar 2017 11:15
  • $ENV=ComputerName
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From psalert@test.ch to florian.tester@test.ch -Subject $ENV kritische Updates verfügbar

    $hostname = $env:COMPUTERNAME
    $Mailcontent = Get-WUList -title "security" OR "critical" | Send-MailMessage -From "psalert@test.ch" -To "florian.tester@test.ch" -Subject "$hostname kritische Updates verfuegbar"



    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Naja, die Pipe ist auch recht zweifelhaft ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 23. Februar 2017 11:22
  • Naja, die Pipe ist auch recht zweifelhaft ;-)
    Ich hab's nicht getestet. Aber so passt schon mal das Format ;)

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Donnerstag, 23. Februar 2017 11:23
  • So sollte es laufen:

    Import-Module PSWindowsUpdate
    $user = "Username" $password = "Password" | Convertto-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.Pscredential -Argumentlist $user,$password $hostname = $env:COMPUTERNAME $updatelist = @(Get-WUList -title "security";Get-WUList -title "critical") if ($updatelist) { Send-MailMessage -From "Absender" -To "Empfaenger" -Subject "$hostname kritische Updates verfuegbar" -SmtpServer "Mail-Server" -Port "Serverport" -Credential $credentials #optional -UseSsl }



    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Donnerstag, 23. Februar 2017 12:01
  • Hallo zusammen

    Vielen vielen Dank für die schnelle und umfassende Hilfe!

    Es scheint soweit zu funktionieren. Ich werde es umfassend testen in nächster Zeit und euch dann hier Feedback geben.

    Ihr seid die Besten.

    Liebe Grüsse

    Florian

    Donnerstag, 23. Februar 2017 15:00
  • Hallo Florian,

    ein Hinweis noch. Mit Get-WUList -Title "" filterst Du nach dem Updatetitel, nicht nach der Kategorie!

    Für Sicherheitsupdates musst Du also je nach verwendeter Windows-Sprache nach "security" bzw"sicherheit" suchen. Ansonsten wirst Du nie ein Update angezeigt bekommen ;)

    Markiere die hilfreichen Antworten doch bitte noch als solche mit einem Klick auf "Abstimmen" und Lösung(en) mit einem Klick auf "Als Antwort markieren".

    Danke!


    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)


    Donnerstag, 23. Februar 2017 16:52
  • Hallo Sandro

    Ist gut, hab ich gemacht.

    Also würdest du mir eher was in die Richtung von

    Get-WUList -Category "Security"

     empfehlen für meinen Use Case?

    Ich geb euch noch Bescheid, wie es gelaufen ist mit Testen, sobald ich dazu komme.

    Liebe Grüsse

    Florian

    Freitag, 24. Februar 2017 09:37
  • Es gibt keine Category Security (oder ich steh gerade total auf dem Schlauch bei dem Module). Also entweder über den Namen mit -Title oder Du filterst nach dem Updatetyp

    get-wulist | Where-Object {$_.Type -like "1"}
    Type = 1 sind bei mir die Updates für Silverlight und Windows Defender. Keine Ahnung ob das der Kategorie "Security" oder Einstufung "Critical" entspricht. Ich hab gerade keine Möglichkeit das nachzuprüfen.

    Eventuell findest Du aber mit

    Get-WUList | Get-Member 
    noch ein anderes Property nachdem Du sinnvoll filtern kannst ob ein wichtiges Update am Server verfügbar ist.

    Freundliche Grüße

    Sandro
    MCSA: Windows Server 2012
    Fachinformatiker Fachrichtung Systemintegration (IHK, 07/2013)



    Freitag, 24. Februar 2017 09:58