检测是Windows服务已被删除的时间


9

有没有一种方法可以检测Windows服务何时已删除?我已经检查了事件日志,但它没有选择仅添加的已删除操作。

我相信可能有一种使用审核日志的方法,但是我不确定该怎么做?

任何帮助深表感谢。

谢谢

Answers:


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>完成


感谢您的建议,问题是它可能是我不特别知道要删除的服务名称的任何服务。
BillyDay

@BillyDay,嗯,我知道了,更新了答案
Clint

我认为这是最好的方法。我将创建一个在启动和循环时运行的服务,并检测何时删除服务并写入文件或引发事件。谢谢
BillyDay

0

没错,删除Windows服务确实会导致将事件添加到系统事件日志中(源:https : //superuser.com/questions/1238311/how-can-we-detect-if-a-windows-服务已删除,其中有一个用于i的事件日志ID)。

AFAIK没有审核策略来审核服务的删除,我想如果可以,我会在这里列出它:https : //docs.microsoft.com/zh-cn/windows/security/threat-protection/auditing/基本审计过程跟踪

我认为轮询ServiceController.GetServices()是不可能的,因为卸载服务时您的程序可能未运行?


确实我的进程可能没有运行。
BillyDay

好的,我认为您很不走运,然后@BillyDay
simon-pearson

为什么不检查与该服务关联的文件呢,例如myService.exe
约翰尼3

您还可以检查注册表以确保该服务存在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services,如果您想确保未删除任何服务,则必须添加自己的缓存
约翰尼5

0

在您了解什么构成良好的仪器之前,有很多方法可以构建仪器。我的操作方法基本上直接取自Wikipedia条目https://en.wikipedia.org/wiki/Instrumentation

仪器操作方法

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

  • 非整合
  • 仅主要数据
  • 拉不推
  • 按流程组织
  • 永不离线

存在解决指标问题的解决方案,但是您在概念上还停留在如何也使“基于推送”的仪器信号发出另一个系统的概念上。正如我的E文章所解释的那样,仪器应始终提取数据而绝不推送数据。事件驱动的信号是您不需要的潜在故障点。

为了消除您对构建单独的应用程序可能产生的犹豫不决或疑虑,监视器通常是独立的(如Wikipedia所述,未集成)。因此,说您的显示器“可能不会运行”意味着您没有选择构建真正的非集成显示器,该显示器始终处于打开状态。您的使用者系统无法正确地对检测建模,因为它在自己的流程中集成了检查。

将这些职责分开,然后继续。确定仪器应该多长时间合理轮询一次已删除的服务,并使用计时器轮询数据。如果您使用建议的simon-pearson建议的API调用,则还可以检测何时添加了服务。当然,监视器需要在本地缓存服务列表的副本,以便指示器可以推断已添加或删除的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.