[Gelöst] WSUS-Paket automatisiert mehrfach aufrufen

d.karsten
Beiträge: 40
Registriert: 02 Jan 2014, 15:50

[Gelöst] WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon d.karsten » 23 Feb 2017, 11:21

Hallo zusammen,

aus dem OPSI-Wiki haben wir das Skript für ein WSUS-Paket (die Variante, die ein VB-Skript aufruft). Das VB-Skript haben wir durch ein Powershell-Skript ersetzt, was auch soweit funktioniert.
Nun ist unser Ziel, dass ein Rechner nach dem Aufsetzen solange das WSUS-Paket ausführt, bis keine Updates mehr gefunden werden. Es soll aber nicht bei jedem Systemstart wieder aufgerufen werden, da es schon recht lange dauert, selbst wenn es nichts findet - also kein Always-Skript.

Was wir versucht hatten, war die Anzahl der gefundenen Updates zurückzugeben und anhand dieser eine Abfrage im Skript zu machen: steht noch eine Anzahl größer 0 aus, setze das Paket erneut auf Setup. Das funktioniert leider nicht - wir vermuten, dass das Paket diesen Anforderungsstatus nach erfolgreichem Abschließen des Pakets wieder überschreibt. (Syntaktisch war der Aufruf korrekt, für ein anderes Softwarepaket hat es funktioniert.)

Nun die Frage, wie könnte man das in OPSI realisieren?

Viele Grüße,
d.karsten
Zuletzt geändert von d.karsten am 13 Mär 2017, 14:23, insgesamt 1-mal geändert.

Benutzeravatar
ngbr
Ex-uib-Team
Beiträge: 130
Registriert: 27 Sep 2010, 11:41

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon ngbr » 23 Feb 2017, 12:40

Hi d.karsten,

es gibt die Möglichkeit, ein Paket als Exit - Status auf setup stehen zu lassen, indem man mit 'isSuspend' rausgeht.

kurz operhalb dieses Kapitels http://download.uib.de/opsi4.0/doc/html ... ecsections ist das beschrieben.

klappt das ?
---
hoping to help :)

if your problem was solved, pls mark this thread as 'SOLVED'. thank you .

-- no PN support --

Andre

d.karsten
Beiträge: 40
Registriert: 02 Jan 2014, 15:50

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon d.karsten » 24 Feb 2017, 08:25

Hallo,

das ist fast genau was wir suchen, vielen Dank!
Allerdings sollte der Rechner nach einem Block von Updates automatisch neustarten und von vorn beginnen. Setzt man das ExitWindows-Kommando vor "isSuspended", liest er das nicht mehr, setzt man es dahinter, kommt er nicht zum Neustart. Gibt es eine Möglichkeit das zu verbinden?

Viele Grüße,
d.karsten

harb
Beiträge: 7
Registriert: 01 Feb 2017, 09:15

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon harb » 28 Feb 2017, 09:12

Hallo,

um dieses Problem zu lösen habe bei uns ein PS Script geschrieben welches vorab (grob) überprüft in welchem "Windows-Update-Stadium" sich der Rechner befindet. Die Angaben beziehen sich hauptsächlich auf Win7 Maschinen könnten aber auch auf höhere Versionen funktionieren. (WU-Fix installiert & Systemupdates installiert, WU-Fix installiert & Systemupdates fehlen!, WU-Fix fehlt!) Mit WU-Fix ist gemeint das bei neu installierten w7 Rechnern zuerst der Windows Update Agent aktualisiert werden muss um sehr lange Wartezeiten bei der Suche zu vermeiden.

Es läuft ungefähr folgendermaßen ab:
- überprüfen ob neustart erforderlich?
- "Windows-Update-Stadium" bestimmen .. (check_preq.ps1)
- anhand des Rückgabewerts entsprechende Aktionen ausführen


INSTALL.INS - Ausschnitt

Code: Alles auswählen

   winbatch_check4reboot
   set $ExitCode$ = getLastExitCode
   if ($ExitCode$ = "1")
      comment "ExitCode 1 .. Neustart erforderlich"
      ExitWindows /ImmediateReboot
   endif

   Winbatch_processExplorer /LetThemGo

   winbatch_stop_wusvc
   winbatch_checkupdates
   Set $ExitCode$ = GetLastExitCode

   Switch $ExitCode$
      Case "0"
         comment "WU-Fix installiert & Systemupdates installiert. Fertig!"
         winbatch_start_wusvc
         
         winbatch_install_onlineUpdates
         winbatch_check4reboot
         set $ExitCode$ = getLastExitCode
         if ($ExitCode$ = "1")
            comment "ExitCode 1 .. Neustart erforderlich"
            ExitWindows /ImmediateReboot
         endif
         
         comment "Online Windows Update"
         winbatch_install_onlineUpdates
         ExitWindows /Reboot
      EndCase
      Case "5"
         comment "WU-Fix installiert & Systemupdates fehlen!"
         DosBatch_install
         ExitWindows /ImmediateReboot
      EndCase
      Case "9"
         comment "WU-Fix fehlt!"
         comment "Offline Windows Update ueber WSUS offline Update"
         Winbatch_install_preq
         ExitWindows /ImmediateReboot
      EndCase
   EndSwitch


[winbatch_stop_wusvc]
powershell.exe -ExecutionPolicy Bypass -File "%SCRIPTPATH%\stopWUSvc.ps1"

[winbatch_check4reboot]
powershell.exe -ExecutionPolicy Bypass -File "%SCRIPTPATH%\PendingReboot.ps1"

[winbatch_checkupdates]
powershell.exe -ExecutionPolicy Bypass -File "%SCRIPTPATH%\check_preq.ps1"

[Winbatch_install_preq]
net stop wuauserv
%SystemRoot%\system32\wusa.exe %SCRIPTPATH%\installfiles\wu_fix\windows6.1-kb3212642-x64.msu /quiet /norestart
net stop wuauserv
%SystemRoot%\system32\wusa.exe %SCRIPTPATH%\installfiles\wu_fix\Windows6.1-KB3177467-x64.msu /quiet /norestart
net stop wuauserv
%SystemRoot%\system32\wusa.exe %SCRIPTPATH%\installfiles\wu_fix\windows6.1-kb3172605-x64.msu /quiet /norestart
net stop wuauserv
%SystemRoot%\system32\wusa.exe %SCRIPTPATH%\installfiles\wu_fix\windows6.1-kb3212646-x64.msu /quiet /norestart

[Winbatch_processExplorer]
%SystemRoot%\system32\cmd.exe /C "%SCRIPTPATH%\procexp.exe" /accepteula

[DosBatch_install]
start /B /D %SCRIPTPATH%\installfiles\wsusou\cmd %SystemRoot%\System32\cmd.exe /C %SCRIPTPATH%\installfiles\wsusou\cmd\DoUpdate.cmd /verify /updatecpp /instdotnet4 /updatetsc /instwmf

[winbatch_start_wusvc]
net start wuauserv
ping -n 4 127.0.0.1

[winbatch_install_onlineUpdates]
powershell.exe -WindowStyle "Maximized" -ExecutionPolicy Bypass -File "%SCRIPTPATH%\runWU_online.ps1"




check_preq.ps1

Code: Alles auswählen

$updates                = @{KB3172605=$false;KB3177467=$false;KB3212642=$false;KB3212646=$false;}
$requiredUpdate         = "KB3212646"                   # Ein update vom letzten patchday angeben um "grob" festzustellen ob aktuelle updates installiert sind
[array] $updatelist     = get-hotfix | select HotFixID             
[array] $keys           = $updates.keys                 # Workaround

foreach($key in $keys) {
    if ($updatelist -match $key){
     $updates.Set_Item($key, $true)
    }
}

if ($updates.values -notcontains $false) {
    if ($updatelist -match $requiredUpdate) {
        write-output "WU-Fix installiert & Systemupdates installiert";exit 0
    }
    else {
        write-output "WU-Fix installiert & Systemupdates fehlen!";exit 5
    }
    }
else {
        write-output "WU-Fix fehlt!"; exit 9
}



Das Script ist alles andere als schön aber vielleicht kannst du was davon verwenden.

d.karsten
Beiträge: 40
Registriert: 02 Jan 2014, 15:50

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon d.karsten » 02 Mär 2017, 08:16

Hallo,

das klingt interessant. Allerdings habe ich mich beim Durchlesen deines Skripts gefragt, wie du dort eine Art Schleife mit realisierst? Die Switch-Case-Anweisung müsste doch beim Aufruf des Pakets einmal durchlaufen werden und eine der Abfrage entsprechende Aktion durchführen, wenn ich das richtig verstanden habe.

Viele Grüße,
d.karsten

trabs-ol
Beiträge: 59
Registriert: 07 Dez 2011, 10:46

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon trabs-ol » 02 Mär 2017, 09:56

Hi,

wir haben das bei uns mit Mix aus OPSI und einem Powershell Script gelöst. Folgendes passiert:

OPSI prüft, ob PS in der Version >= 4 installiert ist, wenn nein installiert OPSI zuerst das Paket nach.
Danach wird das PS Script aufgerufen.

Im PS Script wird folgendes geprüft:

1. Ist die Installationszeit des Clients jünger als 1 Tag -> Dann handelt es sich um eine Neuinstallation des Clients und es müssen Updates installiert werden. Ist die Installationszeit älter als 1 Tag handelt es sich um einen "Bestands-Client" -> Hier läuft das Script nur nach 19 Uhr, damit der User nicht an der Anmeldung gehindert wird (Bei uns werden alle Rechner am Wochenende um 20 Uhr zu Wartungszwecken aufgeweckt).

2. Sind wird im vorgesehenen Zeitfenster wird per Powershell die Windows Update API angesprochen und nach Updates gesucht. Werden welche gefunden, so wird so lange installiert und rebootet, bis keine Updates mehr gefunden werden. Zusätzlich wird per Windows Forms ein Fenster in den Vordergrund gestellt, welches den User grafisch über den Fortschritt der Updates informiert (Installiere Update 1 von X).

Bei Interesse kann ich die Scripte mal ins Wiki einstellen.

Getestet bei uns unter Windows 7x64. Läuft seit Jahre ohne Probleme...

VG
Lars

EDIT sagt: Zusätlich schreibt das Script noch ein schönes Log auf dem Client.

d.karsten
Beiträge: 40
Registriert: 02 Jan 2014, 15:50

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon d.karsten » 02 Mär 2017, 10:08

Hallo,

also hast du den Updatevorgang, bis keine Updates mehr gefunden werden, auch im Powershell-Skript realisiert?
Die Skripte würden mich sehr interessieren - klingt als wäre das genau das, was bei uns noch fehlt.

Viele Grüße,
d.karsten

trabs-ol
Beiträge: 59
Registriert: 07 Dez 2011, 10:46

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon trabs-ol » 02 Mär 2017, 10:52

So. Fertig!

https://forum.opsi.org/wiki/doku.php?id=userspace:windows_updates_-_powershell

Ich musste da etwas von unserer CI und einigen spezifischen Paket-Abhängikeiten entfernen. Wenn ich keinen Fehler gemacht habe, sollte das so laufen. Ansonsten eben wieder hier melden!

VG
Lars

harb
Beiträge: 7
Registriert: 01 Feb 2017, 09:15

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon harb » 02 Mär 2017, 11:24

d.karsten hat geschrieben:Hallo,

das klingt interessant. Allerdings habe ich mich beim Durchlesen deines Skripts gefragt, wie du dort eine Art Schleife mit realisierst? Die Switch-Case-Anweisung müsste doch beim Aufruf des Pakets einmal durchlaufen werden und eine der Abfrage entsprechende Aktion durchführen, wenn ich das richtig verstanden habe.

Viele Grüße,
d.karsten


Das wiederholte Ausführen des OPSI Pakets geschieht durch die Anweisung "ExitWindows /ImmediateReboot" diese führt zu einem Neustart des Clients ohne das der Actionrequest (Setup) zurückgesetzt wird. Das Bedeutet der Client führt nach dem Neustart wieder das WindowsUpdate Paket aus bis irgendwann das script "check_preq.ps1" den Return value 0 zurück gibt.

Code: Alles auswählen

Neu installierter Client:
boot1:
- check_preq.ps1 = returnval 9           # kein aktueller WU-Agent
- installation Winbatch_install_preq & neustart   # Installation des aktuellen WU-Agents

boot2:
- check_preq.ps1 = returnval 5          # WU-Agent installiert aber die Windows Updates fehlen
- installtion DosBatch_install & neustart      # Installation der WindowsUpdates über Wsus Offline update ( optional)

-  ...                                                # zwischendurch sind mehrere Neustarts möglich 

bootx:
- check_preq.ps1 = returnval 0          # WU-Agent & Windows Updates installiert
- winbatch_install_onlineUpdates      # Abschließend wird nochmal über den Online WSUS überprüft


Windows Update PowerShell Module gibts unter https://gallery.technet.microsoft.com/s ... dff796b0bc

d.karsten
Beiträge: 40
Registriert: 02 Jan 2014, 15:50

Re: WSUS-Paket automatisiert mehrfach aufrufen

Beitragvon d.karsten » 13 Mär 2017, 14:23

Hallo,

sorry für die späte Antwort!
ExitWindows /ImmediateReboot hat unser Problem gelöst, vielen Dank!

Viele Grüße,
d.karsten