Alles was man dafür braucht ist eine GPO und ein VBScript.
Die Benutzereinstellungen können bei der GPO deaktiviert werden, da hier nur Computereinstellungen verwendet werden.
GPO-Einstellungen, damit das Skript sichtbar und ohne Abbruch ausgeführt werden kann:
Computerkonfiguration / Richtlinien / Administrative Vorlagen / System / Skripts
- Maximale Wartezeit für Gruppenrichtlinienskripts - z. B. 18000 (Sekunden) für 5 Stunden maximale Ausführungsdauer des Skripts.
- Skripts zum Herunterfahren sichtbar ausführen - Aktiviert
Computerkonfiguration / Einstellungen / Windows-Einstellungen / Registrierung
- Registrierungs-Assistent-Werte/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/gpsvc / PreshutdownTimeout
- Dezimal z.B. 18000000 (Millisekunden) für 5 Stunden
Shutdownscript:
Computerkonfiguration / Richtlinien / Windows-Einstellungen / Skripts / Herunterfahren
- Matrix42_PM3_Fix.vbs
Code: Select all
On Error Resume Next
Set WshShell = WScript.CreateObject("WScript.Shell")
strComputer="."
ProcWatch="PM3Client.exe"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & ProcWatch & "'")
LoopCount = 5
LoopCount = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\LoopCount")
PatchesMissing = 1
PatchesMissing = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\PatchesMissing")
If Err.Number <> 0 Then
Err.Clear
PatchesMissing = 0
Else
PatchesMissing = 1
End If
Reboot = 0
Reboot = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\Reboot")
If Err.Number <> 0 Then
Err.Clear
Reboot = 0
Else
Reboot = 1
End If
If LoopCount > 1 And PatchesMissing = 1 Then
WshShell.Popup "Updates werden installiert. Bitte den PC nicht ausschalten!" & vbLf & "Nach der Installation fährt der PC automatisch herunter.", 10, "Matrix42 Patch Management"
WshShell.Run """C:\EmpirumAgent\User\setup.exe"" /F /S1 ""\\%EmpirumServer%\Configurator$\Packages\matrix42\PM3Client\15.1\Install\Fix.inf""", 1, true
Do Until colProcesses.Count = 0
WScript.Sleep 1000
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name ='" & ProcWatch & "'")
Loop
Else
Do While Finished = 0
WScript.Sleep 1000
LoopCount = 5
LoopCount = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\LoopCount")
PatchesMissing = 1
PatchesMissing = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\PatchesMissing")
If Err.Number <> 0 Then
Err.Clear
PatchesMissing = 0
Else
PatchesMissing = 1
End If
Reboot = 0
Reboot = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\Reboot")
If Err.Number <> 0 Then
Err.Clear
Reboot = 0
Else
Reboot = 1
End If
If LoopCount < 1 Or PatchesMissing = 0 Or Reboot = 1 Then
Finished = 1
End If
Loop
End If
Patchmanagement 3 wird vom VBScript nur ausgeührt wenn:
- zuvor ein Scan durchgelaufen ist und dieser fehlende Patches gefunden hat (HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\PatchesMissing = 1)
- wenn der LoopZähler > 1 ist: (HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\LoopCount > 0)
Das Skript wird bei einer dieser drei Bedingungen beendet:
- zuvor ein Scan durchgelaufen ist und dieser fehlende Patches gefunden hat (HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\PatchesMissing nicht vorhanden)
- ein Neustart durchgeführt werden muss (HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\Reboot = 1)
- wenn der LoopZähler < 1 ist: (HKEY_LOCAL_MACHINE\SOFTWARE\MATRIX42\PM3Client\LoopCount = 0)
Vielleicht habt ihr ja auch bereits nach dieser Lösungen gesucht.
Für Verbesserungen bin ich immer offen.
Christian Hensel