Wir kennen es alle: Ein Paket wird „rot“ oder eine msi wirft den ominösen Returncode 1603 zurück. Viele dieser Fehler lassen sich durch die Rebootprüfung umgehen, indem man Windows vor der Installation von Software erstmal die Möglichkeit gibt, sich selbst zu ordnen, bevor man mit neuen Installationen kommt. Vor Version 2017 war im DSM die Möglichkeit der Reboot Prüfung nur eingeschränkt implementiert, nämlich über:
If IsRebootPending
Leider prüft diese Funktion nur, ob das Paket einen Neustart wünscht, nicht aber Windows. Ab Version 2017 von DSM ist jetzt eine neue Funktion eingebaut:
If IsRestartFlagSet
Diese sollte auch Windows auf Restart Flags überprüfen, genaue Tests, ob das wirklich so ist, habe ich noch nicht durchgeführt. Solang bleibe ich noch bei der „alten“ Variante. Es gibt unter Windows 3 Registry Schlüssel, welche anzeigen, ob Windows einen Neustart möchte oder nicht:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager‘,’PendingFileRenameOperations
Diese 3 Schlüssel baue ich vor jedes Paket (es sei denn, es ist nur eine Kopieroperation).
Hier derselbe Teil nochmal aus der Script.inc:
!Prüfen ob Reboot nötig
If RegKeyExistsEx(‚HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending‘,reUseX64Hive) or RegKeyExistsEx(‚HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired‘,reUseX64Hive) or RegValueExistsEx(‚HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager‘,’PendingFileRenameOperations‘,reUseX64Hive)
System_Reset/?/TW
ExitProcEx(Undone,’Installation kann erst nach einem Neustart erfolgen‘)
Falls die Bedingung wahr ist, kommt eine Reboot Anforderung an den Benutzer:
System_Reset/?/TW
Danach wird das Paket auf nicht installiert gesetzt und eine Meldung an die DSM Konsole zurückgegeben:
ExitProcEx(Undone,’Installation kann erst nach einem Neustart erfolgen‘)
Die Aufforderung zum Neustart ist Geschmackssache, jedoch möchte man Software ja so schnell wie möglich verteilen, daher verwende ich sie bei so gut wie jedem Paket.