Seite 1 von 2
Endlosschleife durch unvorhersebaren neutstart
Verfasst: 09 Mai 2016, 18:30
von Cdn
Hallo zusammen,
ich stehe vor folgendem Problem. Ich versuche mit Hilfe von OPSI und AutoIT eine Software zu installieren. Diese startet aber unvorhersehbar neu. Auf manchen Clients einmal auf manchen gar nicht auf anderen bis zu 3 mal.
Nun ist es so, dass OPSI durch den Neustart keine Rückmeldung bekommt, dass das Paket erfolgreich installiert wurden ist und startet die Installation beim nächsten Herunterfahren oder Booten erneut. Dies geht immer so weiter.
Der Parameter /LetThemGo hilft da leider auch nicht, da in diesem Fall beim Herunterfahren der Rechner direkt herunterfährt, bevor das Paket installiert werden kann. Je nach Client kann ich hier auch keine feste Zeit vergeben, da dies sehr stark variiert.
Rebootflags habe ich mir auch schon angeschaut. Bringt mich hier allerdings auch nicht weiter...
Jemand eine gute Idee? Bin über jede Hilfe glücklich

Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 09 Mai 2016, 18:58
von SisterOfMercy
Try to find out exactly what it is doing and then try to disable that.
For instance, maybe it is installing microsoft visual c++ runtime 2012 and restarting. If it is possible to disable a check for that visual c++ runtime then you could install the needed runtime yourself, either in the same product or as a different product. Of course you would have to set a dependency for that product.
Edit this file:
\\opsi\opsi_workbench\$ProductId$\OPSI\control
and add this:
Code: Alles auswählen
[ProductDependency]
action: setup
requiredProduct: microsoft-vc-runtime-2010
requiredStatus: installed
requirementType: before
Rebootflags can work, but you would have to have a bit more control of the product.
Code: Alles auswählen
comment "handle Rebootflag"
Set $RebootFlag$ = GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\winst] RebootFlag")
if not (($RebootFlag$ = "1") or ($RebootFlag$ = "2") or ($RebootFlag$ = "3"))
Set $RebootFlag$ = "1"
Registry_SaveRebootFlag /32bit
endif
if ($RebootFlag$ = "1")
if FileExists("%ScriptPath%\delsub3264.ins")
comment "Start uninstall sub section"
Sub "%ScriptPath%\delsub3264.ins"
endif
endif
if ($RebootFlag$ = "1") or ($RebootFlag$ = "2")
comment "installing"
if ($INST_SystemType$ = "x86 System")
Message "Installing " + $ProductId$ + "..."
comment "Start setup program"
Winbatch_install_32 /32Bit /WaitForProcessEnding "stupidprogram.exe"
Sub_check_exitcode
comment "Patch Registry"
Registry_install /32Bit
Registry_install_AllProfiles /AllNTUserDats
comment "Create shortcuts"
LinkFolder_install
endif
if ($INST_SystemType$ = "64 Bit System")
Message "Installing " + $ProductId$ + "..."
comment "Start setup program"
Winbatch_install_64 /64Bit /WaitForProcessEnding "stupidprogram.exe"
Sub_check_exitcode
comment "Patch Registry"
Registry_install /32Bit
Registry_install_AllProfiles /AllNTUserDats
comment "Create shortcuts"
LinkFolder_install
endif
comment "handle Rebootflag"
Set $RebootFlag$ = "3"
Registry_SaveRebootFlag /32bit
ExitWindows /ImmediateReboot
endif
if ($RebootFlag$ = "3")
if ($INST_SystemType$ = "x86 System")
comment "Copy files"
Files_install_32 /32Bit
Files_install_AllProfiles /AllNtUserProfiles
endif
if ($INST_SystemType$ = "64 Bit System")
comment "Copy files"
Files_install_64 /64Bit
Files_install_AllProfiles /AllNtUserProfiles
endif
comment "handle Rebootflag"
Set $RebootFlag$ = "0"
Registry_SaveRebootFlag /32bit
endif
[Registry_SaveRebootFlag]
openkey [HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\winst]
set "RebootFlag" = "$RebootFlag$"
What it the program you're trying to install?
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 09 Mai 2016, 19:16
von Cdn
Okay dann komme ich dem Wunsch mal nach auf Deutsch zu antworten

Naja das ist schwierig, weil ich nicht wirklich weiß was alles im Hintergrund installiert wird. Die Software ist eine Spezialsoftware.
Rebootflags machen dann ja nur Sinn, wenn ich die benötigte Software zuvor installiere oder?
Eine andere Idee wäre die Rückmeldung an OPSI zu umgehen und den Status "Installed" manuell zu senden. Ist dies möglich?
Da ich durch das AutoIT Skript sowieso keine adäquate Rückmeldung bekomme ob die Installation wirklich erfolgreich war, hätte ich keine Nachteile dadurch.
Desten Dank für die schnelle Antwort!
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 09 Mai 2016, 19:28
von SisterOfMercy
Cdn hat geschrieben:Okay dann komme ich dem Wunsch mal nach auf Deutsch zu antworten

Naja das ist schwierig, weil ich nicht wirklich weiß was alles im Hintergrund installiert wird. Die Software ist eine Spezialsoftware.
"special"... you mean retarded?

Already tried to unpack the installation files? If you can at least find out the dependencies, maybe you can make it so all clients have to reboot the same number of times.
Cdn hat geschrieben:Eine andere Idee wäre die Rückmeldung an OPSI zu umgehen und den Status "Installed" manuell zu senden. Ist dies möglich?
Yes, that's possible. I don't know if both servicecalls are needed, but I think this worked.
Code: Alles auswählen
[actions]
opsiServiceCall_setProductActionRequest
opsiServiceCall_setProductInstallationStatus
[opsiServiceCall_setProductActionRequest]
"method": "setProductActionRequest"
"params": [
"$ProductId$",
"%HostID%",
"none"
]
[opsiServiceCall_setProductInstallationStatus]
"method": "setProductInstallationStatus"
"params": [
"$ProductId$",
"%HostID%",
"installed"
]
Cdn hat geschrieben: Da ich durch das AutoIT Skript sowieso keine adäquate Rückmeldung bekomme ob die Installation wirklich erfolgreich war, hätte ich keine Nachteile dadurch.
Oh, yeah. I keep forgetting about AutoIt, and I was thinking about AutoHotKey.
Somebody has created a bot for an idle game (clicker heroes) in AutoHotKey. This has image recognition. I haven't tried it, but maybe very nasty installs can be scripted with AutoHotKey, with that image recognition.
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 09 Mai 2016, 19:40
von Cdn
Ja veraltet nicht unbedingt, aber nicht gerade "schön" geschrieben. Aupacken bringt nicht viel, da das Ganze gar nicht gepackt ist aber aus 10.000 Einzeldateien besteht.
Na die Idee die du da in den Raum geworfen hast mit dem bot könnte ganz insteressant sein. Hast du da weitere Informationen?
Ich habe hier im Forum gerade eben folgendes gefunden:
Code: Alles auswählen
comment "Setting Office (older version) to not_installed"
DefVar $UninstallProductId$
DefVar $InstallationStatus$
DefVar $ActionRequest$
DefVar $ClientId$
DefVar $DnsDomainName$
DefStringList $ServiceResult$
Set $InstallationStatus$ = 'installed'
Set $ActionRequest$ = 'none'
Set $ServiceResult$ = getReturnListFromSection('opsiServiceCall_getDomain')
Set $DnsDomainName$ = takestring(0, $ServiceResult$)
Set $ClientId$ = lower(EnvVar("COMPUTERNAME")) + "." + $DnsDomainName$
Set $UninstallProductId$ = 'experimental'
opsiServiceCall_setProductInstallationStatus
opsiServiceCall_setActionRequestStatus
[opsiServiceCall_getDomain]
"method": "getDomain"
"params": [
]
[opsiServiceCall_setProductInstallationStatus]
"method": "setProductInstallationStatus"
"params": [
"$UninstallProductId$",
"$ClientId$",
"$InstallationStatus$"
]
[opsiServiceCall_setActionRequestStatus]
"method": "setProductActionRequest"
"params": [
"$UninstallProductId$",
"$ClientId$",
"$ActionRequest$"
]
erhalte hier aber eine Fehlermeldung im Skript wegen der Zeile die danach kommt:
EDIT: Funktioniert jetzt. Fehler gefunden
Section opsiServiceCall_setActionRequestStatus (Command in line 113): Files copy ":" expected
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 10 Mai 2016, 10:46
von andré
Was du auch machen kannst, ist einfach zu Beginn des Skriptes einen Parameter hochzuzählen und den in die Registry zu schreiben. Wenn der einen bestimmten Wert hat, brichst du ab. Zumindest kannst du damit die Bootschleife unterbrechen, evtl kannst du den Erfolg der Installation manuell prüfen, indem du checken lässt, ob alle Dateien daliegen, die daliegen sollen. Ich habe ein Paket gebaut, das Windows-Updates über das WSUS Offline-Update installiert und da es da manchmal Updates gibt, die immer wieder installiert werden, habe ich die erlaubten Neustarts auf 10 beschränkt.
Edit: Weil mir das gerade einfällt: RebootFlag kannst du u.U. zusätzlich brauchen.
Geht ungefähr so:
Code: Alles auswählen
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")
; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
LogError "Zu viele Neustarts."
isFatalError
endif
if not ($Start_Flag$ = "10" )
; zähle das Start_Flag nach oben
Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
Registry_SaveStartFlag
else
; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
; als Fehlercode wird das Start_flag auf 20 gesetzt
Set $Start_Flag$ = "20"
Registry_SaveStartFlag
ExitWindows /ImmediateReboot
endif
; alles gewünschte ausführen
[Registry_SaveStartFlag]
openKey [$WinstRegKey$]
set "StartFlag" = "$Start_Flag$"
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 10 Mai 2016, 17:48
von Cdn
andré hat geschrieben:Was du auch machen kannst, ist einfach zu Beginn des Skriptes einen Parameter hochzuzählen und den in die Registry zu schreiben. Wenn der einen bestimmten Wert hat, brichst du ab. Zumindest kannst du damit die Bootschleife unterbrechen, evtl kannst du den Erfolg der Installation manuell prüfen, indem du checken lässt, ob alle Dateien daliegen, die daliegen sollen. Ich habe ein Paket gebaut, das Windows-Updates über das WSUS Offline-Update installiert und da es da manchmal Updates gibt, die immer wieder installiert werden, habe ich die erlaubten Neustarts auf 10 beschränkt.
Edit: Weil mir das gerade einfällt: RebootFlag kannst du u.U. zusätzlich brauchen.
Geht ungefähr so:
Code: Alles auswählen
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")
; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
LogError "Zu viele Neustarts."
isFatalError
endif
if not ($Start_Flag$ = "10" )
; zähle das Start_Flag nach oben
Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
Registry_SaveStartFlag
else
; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
; als Fehlercode wird das Start_flag auf 20 gesetzt
Set $Start_Flag$ = "20"
Registry_SaveStartFlag
ExitWindows /ImmediateReboot
endif
; alles gewünschte ausführen
[Registry_SaveStartFlag]
openKey [$WinstRegKey$]
set "StartFlag" = "$Start_Flag$"
Danke für die Anregung. Da ist mir noch was anderes eingefallen: Könnte ich nicht einfach nachschauen ob eine exe Datei in einer bestimmten Version vorliegt und die Installation dann erfolgreich abgeschlossen ist? Das würde doch Sinn machen
Man kann wohl mit getFileInfoMap die Dateiversion auslesen, wie dies genau funktioniert habe ich allerdings noch nicht verstanden. Ich müsste dann ja das Pendant zu isFatalError haben um falls die Dateiversion vorhanden ist den Setup abzubrechen und ein Installed success zu erreichen.
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 11 Mai 2016, 11:19
von andré
Das Gegenteil von isFatalError ist standardmäßig gegeben.
Du kannst unter
so vorgehen, dass du die Datei prüfst (müsstest du mal im Handbuch schauen, das kenne ich jetzt auch nicht aus dem Kopf), dann entscheidest du, dass alles gut ging, oder eben nicht. Wenn es gut ging, wird das StartFlag zurück auf 0 gesetzt, da ja die Installation vorbei ist. Am besten ist wohl, wenn du mehrere Dateien prüfst, und/oder die Dateien, die als letztes kopiert werden, weil dann die wahrscheinlichkeit höher ist, dass der Rest auch kopiert wurde.
Könnte dann so aussehen:
Code: Alles auswählen
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")
; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
LogError "Zu viele Neustarts."
isFatalError
endif
if not ($Start_Flag$ = "10" )
; zähle das Start_Flag nach oben
Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
Registry_SaveStartFlag
else
; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
; als Fehlercode wird das Start_flag auf 20 gesetzt
Set $Start_Flag$ = "20"
Registry_SaveStartFlag
ExitWindows /ImmediateReboot
endif
;alles gewünschte ausführen
Files_alle_Dateien_kopieren
; Wenn die gewünschte Datei vorhanden ist
; alternativ kann nach dem Kopiervorgang eine Aktion durchgeführt werden, die die Versionsnummer prüft.
; Dann wird bspw ein if ($Version$ = "gewünschte Versionsnummer") abgefragt, statt die Existenz eines Files.
if (FileExists($die_letzte_kopierte_datei))
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
Comment "Installation erfolgreich"
; wenn die gewünschte Datei nicht vorhanden ist
else
logError "Die gewünschte Datei war noch nicht dabei. Reboot und dann Neubeginn des Skripts"
ExitWindows /ImmediateReboot
endif
Wenn das Skript standardmäßig einen Reboot benötigt, würde ich noch einen if-Block um das bisherige Skript drumherum machen.
Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 11 Mai 2016, 17:06
von Cdn
andré hat geschrieben:Das Gegenteil von isFatalError ist standardmäßig gegeben.
Du kannst unter
so vorgehen, dass du die Datei prüfst (müsstest du mal im Handbuch schauen, das kenne ich jetzt auch nicht aus dem Kopf), dann entscheidest du, dass alles gut ging, oder eben nicht. Wenn es gut ging, wird das StartFlag zurück auf 0 gesetzt, da ja die Installation vorbei ist. Am besten ist wohl, wenn du mehrere Dateien prüfst, und/oder die Dateien, die als letztes kopiert werden, weil dann die wahrscheinlichkeit höher ist, dass der Rest auch kopiert wurde.
Könnte dann so aussehen:
Code: Alles auswählen
Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst"
Set $Start_Flag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"StartFlag")
; wenn das Start_flag auf 20 steht, wurde zu oft neu gestartet.
if ($Start_Flag$ = "20")
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
LogError "Zu viele Neustarts."
isFatalError
endif
if not ($Start_Flag$ = "10" )
; zähle das Start_Flag nach oben
Set $Start_Flag$ = calculate($Start_Flag$ + "+1")
Registry_SaveStartFlag
else
; bei mehr als zehn Neustarts soll die Installation abgebrochen werden
; als Fehlercode wird das Start_flag auf 20 gesetzt
Set $Start_Flag$ = "20"
Registry_SaveStartFlag
ExitWindows /ImmediateReboot
endif
;alles gewünschte ausführen
Files_alle_Dateien_kopieren
; Wenn die gewünschte Datei vorhanden ist
; alternativ kann nach dem Kopiervorgang eine Aktion durchgeführt werden, die die Versionsnummer prüft.
; Dann wird bspw ein if ($Version$ = "gewünschte Versionsnummer") abgefragt, statt die Existenz eines Files.
if (FileExists($die_letzte_kopierte_datei))
Set $Start_Flag$ = "0"
Registry_SaveStartFlag
Comment "Installation erfolgreich"
; wenn die gewünschte Datei nicht vorhanden ist
else
logError "Die gewünschte Datei war noch nicht dabei. Reboot und dann Neubeginn des Skripts"
ExitWindows /ImmediateReboot
endif
Wenn das Skript standardmäßig einen Reboot benötigt, würde ich noch einen if-Block um das bisherige Skript drumherum machen.
Ach Perfekt André besten Dank dafür. Habe nur noch ein Problem:
Ich bräuchte wie du schon gesagt hast einen Block für den ersten Neustart.
klappt leider nicht, da hierfür der Wert ja erst einmal auf 0 gesetzt werden muss. ..opsi.org/winst gibt es aber noch gar nicht... Und RebootFlag entsprechend auch nicht..
Sonst sollte es laufen denke ich

Re: Endlosschleife durch unvorhersebaren neutstart
Verfasst: 12 Mai 2016, 11:31
von Cdn
Jemand eine Idee dazu? Denke hier muss auch noch eine Fallunterscheidung eingebaut werden für den Registrystring, falls es ein 64 Bit System ist, sollte es ja GetRegistryStringValue64 heißen richtig?