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.

Jede Hilfe wird sehr geschätzt.

Vielen Dank

BillyDay
quelle

Antworten:

6

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

static void Main(string[] args)
{
    var path = @"C:\AdminLocation\ServicesLog.txt";

    var currentServiceCollection = ServiceController.GetServices().Select(s => s.ServiceName).ToList(); //Queries the most current Services from the machine

    if (!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 Log
    var 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 added
    if (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 requirements
    Console.WriteLine("One or more services has been removed");

}

Planungsaufgabe

Windows Start> Taskplaner> Grundlegende Aufgabe erstellen> Auslöser festlegen> Exe anhängen> Fertig stellen

Clint
quelle
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
BillyDay
0

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.

Simon-Pearson
quelle
Genau mein Prozess läuft möglicherweise nicht.
BillyDay
Ok, ich denke du hast kein Glück dann @BillyDay
Simon-Pearson
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 .

Instrumentierung How-to

http://www.powersemantics.com/e.html

  • Nicht integriert
  • Nur Primärdaten
  • Ziehen, nicht drücken
  • Organisiert nach Prozessen
  • Niemals offline

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.

RBJ
quelle