Verhindern, dass ein Dienst gestoppt wird C++

Hallo,
ich habe auf meinem Windows PC einen Dienst, der auf keinen Fall vor dem Herunterfahren beendet werden soll. Das würd ich gern über ein Konsolenprogramm erreichen, was ich bisher verwendet habe, um den Dienst manuell zu stoppen/starten. Das ist ja einfach per
Code:
#include <windows.h>
....
int main() {
      ....
      SYSTEM("net stop Dienstname");
}
möglich.
Allerdings geht es ja jetzt eher darum, dass ich den Dienst vor dem Beenden schützen will.
Geht das auch per CMD-Befehl, oder gibt es da eine ganz andere Möglichkeit?

Danke schonmal im vorraus.
 
Also mit einem Cmd Befehl geht das sicher nicht. Du kannst zwar wählen, das z.B. ein Dienst vor dem Einloggen gestartet wird oder beim Booten, aber mit genügend Rechten(Admin) kann jeder Dienst beendet werden.
Du könntest natürlich 2 Dienste laufen lassen, die jeweils checken, ob der andere noch läuft.
Allerdings kenne ich keinen Grund warum ein Dienst gegen Beenden geschützt sein soll.

Was hast du denn vor?

MFG
Ace
 
Es geht darum, dass ich einen Dienst habe, der ein Backuparchiv mit dem aktuellen Inhalt verschiedener Ordner synchronisiert. Da aber nicht nur ich den PC nutze, sondern auch meine Freunde oder sonst wer, der hier gerad ist, kann es schonmal passieren dass bei sowas nachgeschaut wird. Jedenfalls weiß ich nicht, wie man einen Dienst programmiert, also muss ich dieses Problem wohl erst hintan stellen.

edit: Würde es nicht reichen, ein Programm im Autostart zu haben, das alle Dienste, die gestartet sind, nach einem bestimmten durchsucht, und falls dieser nicht gestartet ist, diesen startet?
 
@jmc: auf Anhieb würde ich sagen, dass Usermod Hooking hier nichts bringt - da das System dann trotzdem den Prozess terminieren kann (sitzt halt am längeren Hebel ;) ).

Als einfachste Lösung (ohne Rootkittechniken): Backupprozess als DLL generieren und die DLL an irgendein Programm heften, welches immer läuft (z.B Explorer). Wobei es allerdings vom Explorer es je nach Systemkonfiguration mehrere Instanzen geben kann (also entweder sicher sein, dass keiner die "Ordneroption -> Ordneransich in eigenem Prozess starten" aktiviert oder einen simplen Schutz gegen mehrfachstart einbauen).
Dann heftet man die DLL mittels IID King (version 2 nehmen, hat weniger Bugs) an den Explorer. Als Exportfuntion kann man irgendeine Dummyfunktion nehmen (damit IIDKing nicht rummeckert). Dadurch erreicht man folgendes: die DLL wird in die Importliste des Explorers eingetragen - bei jedem Start des Explorers wird sie vom PE Loader geladen (und dieser ruft die DLL Main auf). Die DLL Main kann dann einen Thread starten der z.B synchronisiert und dann returnen (return ist ein MUSS, da der PE loader auf diesen wartet).
Da ich davon ausgehe, dass der Backupdienst nicht von Dir ist: die DLL kann einfach auch in gewissen Zeitabständen überwachen ob der Dienst läuft und diesen Notfalls starten (und eine nette Meldung a la "Bitte den Dienst NICHT beenden, weil..." ausgeben).
Läuft zwar auf die Methode mit zweitem Überwachungsprogramm hinaus, hat aber den Vorteil, dass der Überwachungsprozess nicht im Eifer des Gefechts mitgekillt werden kann (-> daher einen großzügigen Checkinterval haben kann) und auch keinen "Überwacher des Überwachers" braucht.
Pseudocode
Code:
export dummyfunktion; //Compilerspezifisch, bitte nachschlagen
dummyfunktion(){}
DLL Main
{
   CreateThread(myCheckThread);
   return TRUE;
}
myCheckThread()
{
  while(TRUE)
  {
    if(!laeuft(Backupdienst))
      {
          MessageBox("Wer hat den Backupdienst beendet???");
          start(Backupdienst);
      }
    sleep(10000); //10 Sekunden pause
  }
}
 
Danke für die Hinweise und Lösungen, werde das bei Gelegenheit ausprobieren, hab unerwarteterweise zuviel zu tun momentan :)
 
Zurück
Oben