Beim Aufbau einer enteo Umgebung ist das Reboot Management nicht selten heiß diskutiertes Thema und viele der Anforderungen des IT-Environment sind mit den enteo Standard Mitteln schlichtweg nicht umsetzbar.
Beispiele für solche Anforderungen könnten wie folgt lauten:
-
Während der Re-Installation eines Systems soll der Reboot immer automatisch erfolgen.
-
Ist kein Benutzer angemeldet, soll der Reboot im Falle einer Workstation augenblicklich erfolgen.
-
Ist ein Benutzer angemeldet, soll der User gefragt werden ob ein Reboot durchgeführt werden darf. Diese Frage darf er x-mal verzögern.
-
Auf einem Server darf ein Reboot nicht automatisiert erfolgen, der zuständige Administrator soll aber eine Benachrichtigung erhalten.
Alle die vorhergenannten Anforderungen sind eigentlich mit Hilfe der mitgelieferten enteo Mittel lösbar, aber der Aufwand, die Logik in jedes betreffende Paket zu implementieren ist extrem hoch. Die Lösung dieses Problem besteht also darin, alle für einen Reboot notwendige Schritte zu zentralisieren. Hierbei helfen die Job-Policies. Es gibt die Möglichkeit, eine Job Policy für ein Paket zu erstellen, die nach jedem Beenden einer Installer Sitzung ausgelöst wird. Das Paket, welches durch die Job Policy ausgelöst wird, muss zudem noch einen Trigger (z.B. in Form eines RegKeys) erhalten, um die Reboot Aktion nur dann auszulösen, wenn zuvor auch ein Reboot angefordert wurde. Alle normalen Softwarepakete schreiben dann (bei Bedarf) nur den zentralen Registry Wert, die Reboot Option in den Paketeigenschaften steht auf „NoReboot required“. Durch den direkten Einsatz des EndInstallerSession Befehls kann der Reboot auch direkt nach dem betreffenden Paket durchgeführt werden.
Das Paket für die Steuerung der Reboot Eigenschaften kann beispielhaft wie folgt aussehen:
!-Count Variablen für Reboot Verzögerung
Set('_count','5')
Set('_reboot_timeout','0')
!-Beenden des Paketes, wenn kein Reboot angefordert wird
If not RegValueExistsEx('HKEY_LOCAL_MACHINE\Software\SWV\','RebootFlag',reUseX64Hive)
goto _exit
!- Optional: Auslesen eines Wertes, der beschreibt, ob sich der Client in der Erstinstallation (Staging)
!- befindet, oder im normalen Betrieb. In diesem Beispiel bedeutet staging < 100 = Erstinstallation
RegReadValueEx('HKEY_LOCAL_MACHINE\Software\SWV\','StagingPhase','_StagingPhase',reUseX64Hive)
!- Auslesen des Reboot Triggers
RegReadValueEx('HKEY_LOCAL_MACHINE\Software\SWV\','RebootFlag','_RebootFlag',reUseX64Hive)
!-Speziell im Serverumfeld soll oft steuerbar sein, ob der Reboot durch enteo ausgeführt werden soll. Mit der
!-Option RebootAllowed wird definiert dass enteo nicht automatisch neustarten darf, aber ein Reboot
!-trotzdem notwendig ist.
RegReadValueEx('HKEY_LOCAL_MACHINE\Software\SWV\','RebootAllowed','_RebootAllowed',reUseX64Hive)
!
!-Beenden des Paketes, wenn Reboot Trigger gesetzt, aber nicht mit einer Reboot Anforderung bestückt.
If %_Rebootflag%='0'
goto _exit
!
!-Ist der Client in der Erstinstallation, kann der Reboot immer ausgeführt werden.
If not %_Stagingphase%='100'
goto _reboot
!
!-Beenden, wenn ein manueller Reboot notwendig ist. Hier können weitere Aktionen wie z.B. das Senden einer
!-E-Mail an den Serververantwortlichen eingesetzt werden.
If %_Rebootflag%='2'
EndInstallerSession
goto _exit
!
!- Reboot notwendig bei Rebootflag 1
If %_Rebootflag%='1'
!- check ob reboot generell erlaubt ist (2 = nicht erlaubt)
If %_RebootAllowed%='2'
RegModifyDWord('HKEY_LOCAL_MACHINE\Software\SWV\','RebootFlag','2',mrdwSet+reUseX64Hive)/TS
EndInstallerSession
goto _exit
!-Auf einem ServerOS wird automatisch neugestartet ((vurausgesetzt, es wird kein manueller Reboot erfodert)
If IsRunningOnServerOS
goto _reboot
! - Läuft ein explorer.exe Prozes, wird davon ausgegangen, dass ein User angemeldet ist.
Set('WMI_Handle','0')
WMISimpleQuery('\\.\root\cimv2','Win32_Process','Name=explorer.exe','WMI_')
Handle
EndProc
!- Kein explorer.exe Prozess gefunden. Neustart auslösen
If %WMI_Handle%='0'
goto _reboot
Else
goto _askUser
!
!-User kann den Reboot x-mal um y-minuten verzögern, danach wird der Rechner automatisch neu gestartet
: _askUser
Set('_reboot_timeout','30')
!-Spezielle Messagebox aus dem Download-Bereich der NWC-Services.
ExecuteEx('.\extern$\msgboxt.exe /t:"Neustart benötigt" /m:"Der Computer muss auf Grund eines Updates neu gestartet werden." /m:"" /m:"Sie können den Neustart noch %_count%mal um 10 Minuten verzögern, danach wird das Gerät automatisch neu gestartet" /m:"" /m:"Wollen sie jetzt neu starten" /b:YN /i:Q /w:60 /f:T','_return','6')/?
!_ User hat dem Reboot zugestimmt
If %_return%='6'
goto _reboot
Else
!-Die Anzahl der möglichen Verzögerungen wird um 1 reduziert.
DecrementVar('_count','1')
If %_count%='0'
!- Letzte Möglichkeit für den Benutzer, seine Anwendungen zu schliessen.
ExecuteEx('.\extern$\msgboxt.exe /t:"Reboot steht kurz bevor" /m:"Die maximale Anzahl der Neustartverzögerungen wurde erreicht!" /m:"Der PC wird in spätestens 5 Minuten automatisch neu gestartet" /m:"" /m:"Schliessen sie alle Anwendungen und drücken sie auf OK um den Rechner neu zu starten" /i:W /w:300 /f:T','','6')/?
goto _reboot
Else
Sleep('600')
goto _askUser
!
!-Reboot Flag auf 0 setzten und den Rechner neu starten
: _reboot
RegModifyDWord('HKEY_LOCAL_MACHINE\Software\SWV\','RebootFlag','0',mrdwSet+reUseX64Hive)/TS
Execute('shutdown.exe -r -t %_reboot_timeout% -c "Computer will be restartet in 30 seconds." -f')/x64/TS
EndInstallerSession
: _exit
Ich will abschließend noch der Vollständigkeit halber erwähnen, dass ausführliche Tests und Anpassungen an die jeweilige enteo Umgebung notwendig sind und weder ich, noch die NWC-Services einen umfassende Garantie für die fehlerfreie Ausführung dieses Scriptes geben können.