Erkennen ist, wenn ein Windows-Dienst gelöscht wurde
9
Gibt es eine Möglichkeit zu erkennen, wann ein Windows-Dienst gelöscht wurde? Ich habe das Ereignisprotokoll überprüft, aber es werden keine gelöschten Aktionen erfasst, die nur hinzugefügt wurden.
Ich glaube, es gibt eine Möglichkeit, Überwachungsprotokolle zu verwenden, aber ich bin mir nicht sicher, wie ich das tun soll.
Während in Ereignis- oder Überwachungsprotokollen keine Spur von Dienstlöschungen vorhanden ist, können Sie eine kleine Konsolen-App erstellen, die erkennt, ob ein Dienst vorhanden ist, und diese App Windows Task Schedulerso anhängen, dass die Ausführung basierend auf der Häufigkeit oder einem von Ihnen festgelegten Trigger geplant ist kann an Ihre Anforderungen angepasst werden, sodass Sie eine Benachrichtigung erhalten, wenn ein Dienst hinzugefügt oder entfernt wurde usw.
Die Konsole App ist so ausgelegt , dass auf dem ersten Lauf, es alle Dienste auf dem System und auf den nachfolgenden Läufen protokolliert wird es Änderungen an den Leistungen erfolgen über Tracking servicesRemovedund
servicesAddedentscheiden wir können das , was Maßnahmen zu ergreifen , wenn ein Dienst hat wurde geändert
Konsolen-App: ServiceDetector.exe
staticvoidMain(string[] args){var path =@"C:\AdminLocation\ServicesLog.txt";var currentServiceCollection =ServiceController.GetServices().Select(s => s.ServiceName).ToList();//Queries the most current Services from the machineif(!File.Exists(path))//Creates a Log file with current services if not present, usually means the first run{// Assumption made is that this is the first run
using (var text =File.AppendText(path)){
currentServiceCollection.ForEach((s)=> text.WriteLine(s));}return;}// Fetches the recorded services from the Logvar existingServiceCollection =File.ReadAllLines(path).ToList();var servicesRemoved = existingServiceCollection.Except(currentServiceCollection).ToList();var servicesAdded = currentServiceCollection.Except(existingServiceCollection).ToList();if(!servicesAdded.Any()&&!servicesRemoved.Any()){Console.WriteLine("No services have been added or removed");return;}//If any services has been addedif(servicesAdded.Any()){Console.WriteLine("One or more services has been added");
using (var text =File.AppendText(path)){
servicesAdded.ForEach((s)=> text.WriteLine(s));}return;}//Service(s) may have been deleted, you can choose to record it or not based on your requirementsConsole.WriteLine("One or more services has been removed");}
Vielen Dank für den Vorschlag. Das Problem dabei ist, dass es sich um einen Dienst handeln kann, dessen Namen ich nicht besonders kenne.
BillyDay
@ BillyDay, ahh ich sehe, hat die Antwort aktualisiert
Clint
Ich denke, das ist der beste Ansatz. Ich werde einen Dienst erstellen, der beim Start und in der Schleife ausgeführt wird und erkennt, wann ein Dienst gelöscht wird, und entweder in eine Datei schreiben oder ein Ereignis auslösen. Danke
Ich gehe davon aus, dass eine Abfrage ServiceController.GetServices()nicht in Frage kommt, da Ihr Programm möglicherweise nicht ausgeführt wird, wenn der Dienst deinstalliert wird.
Warum nicht einfach eine mit diesem Dienst verknüpfte Datei überprüfen ... zB myService.exe
Johnny 5.
Sie können auch die Registrierung überprüfen, um sicherzustellen, dass der Dienst HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services vorhanden ist. Wenn Sie sicherstellen möchten, dass kein Dienst gelöscht wurde, müssen Sie Ihren eigenen Cache hinzufügen
Johnny 5.
0
Es gibt viele Möglichkeiten, Instrumente zu bauen, bis Sie lernen, was gute Instrumente ausmacht. Meine Anleitung stammt im Wesentlichen direkt aus dem Wikipedia-Eintrag https://en.wikipedia.org/wiki/Instrumentation .
Die Lösung für das Problem der Messung von Indikatoren ist vorhanden, aber Sie müssen sich nicht vorstellen, wie "Push-basierte" Instrumente einem anderen System signalisieren sollen. Wie mein E-Artikel erklärt, sollten Instrumente immer Daten abrufen, niemals pushen. Ereignisgesteuerte Signalisierung ist ein potenzieller Fehlerpunkt, den Sie nicht benötigen.
Um Unentschlossenheit oder Zweifel beim Erstellen einer separaten Anwendung auszuräumen, sind Monitore normalerweise unabhängige ( nicht integrierte, wie Wikipedia sagt) Prozesse. Wenn Sie also sagen, dass Ihr Monitor möglicherweise nicht ausgeführt wird, haben Sie sich nicht dafür entschieden, einen echten nicht integrierten Monitor zu erstellen, der immer eingeschaltet ist. Ihr Verbraucher - System Modell nicht richtig Instrumentierung, weil es integriert die Prüfung in einem eigenen Prozess.
Trennen Sie diese Verantwortlichkeiten und fahren Sie fort. Entscheiden Sie, wie oft das Instrument nach gelöschten Diensten suchen soll, und rufen Sie die Daten mit einem Timer ab. Wenn Sie den vorgeschlagenen API-Aufruf simon-pearson verwenden, können Sie auch erkennen, wann Dienste hinzugefügt wurden. Natürlich muss der Monitor eine Kopie der Serviceliste lokal zwischenspeichern, damit Indikatoren darauf schließen können, was hinzugefügt oder entfernt wurde.
Sie haben Recht, dass beim Löschen eines Windows-Dienstes ein Ereignis zum Systemereignisprotokoll hinzugefügt wird (Quelle: /superuser/1238311/how-can-we-detect-if-a-windows- Service-wird-gelöscht-ist-da-eine-Ereignis-Protokoll-ID-für-i ).
AFAIK Es gibt keine Prüfungsrichtlinie, um die Löschung eines Dienstes zu prüfen, und ich denke, wenn dies der Fall wäre, würde es hier aufgelistet: https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/ Basic-Audit-Prozess-Tracking
Ich gehe davon aus, dass eine Abfrage
ServiceController.GetServices()
nicht in Frage kommt, da Ihr Programm möglicherweise nicht ausgeführt wird, wenn der Dienst deinstalliert wird.quelle
Es gibt viele Möglichkeiten, Instrumente zu bauen, bis Sie lernen, was gute Instrumente ausmacht. Meine Anleitung stammt im Wesentlichen direkt aus dem Wikipedia-Eintrag https://en.wikipedia.org/wiki/Instrumentation .
Instrumentierung How-to
http://www.powersemantics.com/e.html
Die Lösung für das Problem der Messung von Indikatoren ist vorhanden, aber Sie müssen sich nicht vorstellen, wie "Push-basierte" Instrumente einem anderen System signalisieren sollen. Wie mein E-Artikel erklärt, sollten Instrumente immer Daten abrufen, niemals pushen. Ereignisgesteuerte Signalisierung ist ein potenzieller Fehlerpunkt, den Sie nicht benötigen.
Um Unentschlossenheit oder Zweifel beim Erstellen einer separaten Anwendung auszuräumen, sind Monitore normalerweise unabhängige ( nicht integrierte, wie Wikipedia sagt) Prozesse. Wenn Sie also sagen, dass Ihr Monitor möglicherweise nicht ausgeführt wird, haben Sie sich nicht dafür entschieden, einen echten nicht integrierten Monitor zu erstellen, der immer eingeschaltet ist. Ihr Verbraucher - System Modell nicht richtig Instrumentierung, weil es integriert die Prüfung in einem eigenen Prozess.
Trennen Sie diese Verantwortlichkeiten und fahren Sie fort. Entscheiden Sie, wie oft das Instrument nach gelöschten Diensten suchen soll, und rufen Sie die Daten mit einem Timer ab. Wenn Sie den vorgeschlagenen API-Aufruf simon-pearson verwenden, können Sie auch erkennen, wann Dienste hinzugefügt wurden. Natürlich muss der Monitor eine Kopie der Serviceliste lokal zwischenspeichern, damit Indikatoren darauf schließen können, was hinzugefügt oder entfernt wurde.
quelle