Определить, когда служба Windows была удалена

9

Есть ли способ определить, когда служба Windows была удалена? Я проверил журнал событий, но он не собирает только добавленные удаленные действия.

Я считаю, что может быть способ использовать журналы аудита, но я не уверен, как это сделать?

Буду признателен за любую оказанную помощь.

Спасибо

BillyDay
источник

Ответы:

6

Хотя в журналах событий или аудита нет следов удаления службы , вы можете создать небольшое консольное приложение, которое обнаружит, существует ли служба, и подключить его к такому приложению Windows Task Scheduler, которое планируется запустить на основе частоты или триггера, который вы используете. можете настроить в соответствии с вашими требованиями , так что вы получите предупреждение, если служба была добавлена или удалена и т. д ..

Консольное приложение разработано таким образом, чтобы при первом запуске оно регистрировало все службы в системе, а при последующих запусках оно отслеживало изменения, внесенные в службы через него, servicesRemovedи servicesAddedс помощью этого мы можем решить, какое действие предпринять, когда служба имеет был изменен

Консольное приложение: 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");

}

Планирование задачи

Пуск Windows> Планировщик задач> Создать основную задачу> Установить триггер> Прикрепить свой exe> Готово

Clint
источник
Спасибо за предложение, проблема в том, что это может быть любая служба, я не знаю имя службы, которая будет удалена.
BillyDay
@BillyDay, ааа, понятно, обновил ответ
Клинт
Я думаю, что это лучший подход. Я создам службу, которая запускается при запуске и зацикливается, и обнаруживает, когда служба удаляется, и либо записывает в файл, либо вызывает и событие. Спасибо
BillyDay
0

Вы правы, что удаление службы Windows действительно приводит к добавлению события в системный журнал событий (источник: /superuser/1238311/how-can-we-detect-if-a-windows- служба-это-удалено-там-есть-log-id-for-i ).

AFAIK нет политики аудита для аудита удаления службы, и я думаю, что если бы там было, я думаю, что это будет указано здесь: https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/ базовый аудит-процесс отслеживания

Я предполагаю, что опрос ServiceController.GetServices()исключен, потому что ваша программа может не работать, когда служба удалена?

симон-пирсон
источник
Точно мой процесс не может быть запущен.
BillyDay
Хорошо, я думаю, что тебе не повезло @BillyDay
Саймон-Пирсон
Почему бы просто не проверить файл, связанный с этой службой ... например, myService.exe
johnny 5
Вы также можете проверить реестр, чтобы убедиться, что сервис существует HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services, если вы хотите убедиться, что какой-либо сервис не был удален, вам нужно будет добавить собственный кеш
johnny 5
0

Есть много способов построить инструментарий, пока вы не узнаете, что такое хороший инструментарий. Мои инструкции по сути взяты непосредственно из записи в Википедии https://en.wikipedia.org/wiki/Instrumentation .

Инструментарий Инструкции

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

  • Неинтегрированные
  • Только первичные данные
  • Тянуть не толкать
  • Организовано процессом
  • Никогда не в сети

Решение проблемы измерения индикаторов существует, но вы застряли в концепции, как также использовать «нажимную» аппаратуру для сигнализации другой системы. Как объясняется в моей статье, инструменты всегда должны извлекать данные, а не выдвигать их. Сигнализация, управляемая событиями, является потенциальной точкой отказа, которая вам не нужна.

Чтобы устранить любые нерешительность или сомнения, которые могут возникнуть у вас по поводу создания отдельного приложения, мониторы обычно являются независимыми ( не интегрированными, как говорит Википедия) процессами. То есть, если вы говорите, что ваш монитор «может не работать», значит, вы не выбрали реальный неинтегрированный монитор, который всегда включен. Ваша потребительская система неправильно моделирует контрольно-измерительные приборы, потому что она интегрирует проверку в свой собственный процесс.

Разделите эти обязанности и продолжайте. Решите, как часто прибор должен разумно опрашивать удаленные сервисы и опрашивать данные с помощью таймера. Если вы используете вызов API, предложенный Саймон-Пирсоном, вы также можете определить, когда были добавлены сервисы. Конечно, монитор должен локально кэшировать копию списка услуг, чтобы индикаторы могли определить, что было добавлено или удалено.

RBJ
источник