2016-04-06 21 views
1

Ich habe einen Dienst, für den ich Datenwert für FailureAction in der Registrierung festlegen möchte. Momentan ist in der Registrierung ein Wert festgelegt. Wert wird mit RegKey.SetValue ("FailureActions", Value) festgelegt;Welche REG-BINARY für FailureAction für Service festlegen

Ich mag würde wissen:

1) Wie diese Bytes Wert auf Recovery-Option des Dienstes entsprechen (wie, wie bestimmte Sequenz in der Registry, um herauszufinden, bedeutet ‚Erster Fehler‘ als ‚Starten Sie den Service-Einstellung ‚)

2) auch muss ich in der Registry FailureAction ändern, die entsprechen wird‚Weitere Fehler‘als‚Dienst neu starten‘

Hier ist meine Erkenntnis mit Versuch und Irrtum-Methode:

a) Ändern Sie die Einstellung der Wiederherstellung für den Dienst manuell und ändern Sie den Registrierungseintrag. Kopieren Sie diesen Wert und verwenden Sie ihn im Code. Er setzt 'Nachfolgende Fehler'

b) Ändern Sie den ursprünglichen Wert im Code. Er setzt 'Nachfolgende Fehler'

Aber Wert von a) und b) stimmt nicht überein, aber ich sehe dasselbe Ergebnis, wenn ich rechts auf Service klicke und die Wiederherstellungsoption sehe. Um das zu verstehen, würde ich gerne Antworten auf Frage 1) und 2) wissen.

Schätzen Sie Ihren Kommentar \ clue.

Antwort

2

Um die Bedeutung der Bytes im Datenwert von Failureregistrierungsschlüssel zu erklären, werde ich dieses Beispiel nehmen:

enter image description here

Die Bytes in dieser Darstellung dieser Struktur entsprechen:

typedef struct _SERVICE_FAILURE_ACTIONS { 
    DWORD  dwResetPeriod; 
    LPTSTR lpRebootMsg; 
    LPTSTR lpCommand; 
    DWORD  cActions; 
    SC_ACTION *lpsaActions; 
} SERVICE_FAILURE_ACTIONS, *LPSERVICE_FAILURE_ACTIONS; 

Die ersten vier Bytes 80 51 01 00 sind der Wert von dwResetPeriod Strukturelement. Es ist die Zeit, nach der die Fehlerzählung auf Null zurückgesetzt wird, wenn keine Fehler auftreten. Es wird in Sekunden gezählt. In diesem Beispiel ist der Reset-Zeitraum 0x15180 Sekunden (wegen Little Endian). Im Dezimalformat entspricht es 86400 Sekunden oder entspricht 24 Stunden. Wenn also in einem Zeitraum von 24 Stunden keine Fehler auftreten, wird der Fehlerzähler auf Null zurückgesetzt. Die folgenden vier Bytes 00 00 00 00 entsprechen lpRebootMsg. Weitere Informationen zum Mitglied dieser Struktur und zur nächsten finden Sie unter here

Die nächsten vier Bytes 00 00 00 00 entsprechen lpCommand. Die nächsten vier Bytes 03 00 00 00 entsprechen cActions. Dieses Mitglied ist die Anzahl der Elemente im Array lpsaActions. In diesem Fall haben wir 3 Elemente.

Die nächsten vier Bytes 14 00 00 00 entsprechen lpsaActions, was ein Zeiger auf ein Array vom Typ SA_ACTION ist.

Schließlich ist 01 00 00 00 60 EA 00 00 01 00 00 00 60 EA 00 00 00 00 00 00 00 00 00 00 der Inhalt eines Arrays vom Typ SC_ACTION von lpsaActions gezeigt. Wir haben 3 Instanzen dieser Struktur, die den 3 Zeilen von Bytes entsprechen.Die Struktur SC_ACTION wird unten erklärt:

typedef struct _SC_ACTION { 
    SC_ACTION_TYPE Type; 
    DWORD   Delay; 
} SC_ACTION, *LPSC_ACTION; 

Mehr Infos über SC_ACTION und SC_ACTION_TYPE können here finden.

Also, erste Zeile 01 00 00 00 60 EA 00 00 bedeutet: "Im Falle eines Ausfalls, starten Sie den Dienst (01 00 00 00) nach 60 sec (60 EA 00 00 == zu 0xEA60 ms == 60000 ms == 60 sec)." Die zweite Zeile bedeutet dasselbe. Die dritte Zeile bedeutet "Im Fehlerfall keine Maßnahme ergreifen (00 00 00 00) nach 0 Sekunden (00 00 00 00)"

Wie funktioniert das? Jedes Mal, wenn ein Service fehlschlägt, inkrementiert der Service-Controller einen Fehlerzähler N und führt die Aktion N-1 aus, die in dem Array angegeben ist, auf das lpsaActions zeigt. In unserem Fall, wenn der Dienst zum ersten Mal fehlschlägt, wird N auf 1 erhöht und der Controller führt die durch 0 indizierten Aktionen aus, was bedeutet, dass der Dienst nach 60 Sekunden neu gestartet wird. Beim zweiten Mal wird die N auf 2 erhöht und die Aktion N-1 = 1 wird genommen, was bedeutet, dass der Dienst nach 60 Sekunden neu gestartet wird. Beim dritten Mal, wenn der Dienst fehlschlägt, führt der Controller die letzte Aktion im Array aus, die in unserem Fall keine Aktion ausführt. Wenn N größer als cActions ist, wiederholt der Service Controller die letzte Aktion im Array. In diesem Fall wird der Dienst nicht mehr gestartet.

+0

@Magg das ist eine gute Antwort, Sie sollten es als solche markieren! – khargoosh