繁体   English   中英

如何使用c#监控windows服务

[英]How to monitor windows services using c#

如何使用 c# 监视 Windows 服务,并且我还必须使用 CSV 文件保存这些服务名称、开始时间和服务结束时间。 如果有任何新服务启动,它应该使用现有的 CSV 文件自动写入服务名称、启动时间和服务结束时间。

如果有人在 2021 年寻找解决方案,您可以使用服务控制器、异步任务和 WaitForStatus() 方法来实现:

更新:我意识到我最初的解决方案不起作用,所以我完全重写了它:

类别定义

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.ServiceProcess; // not referenced by default

public class ExtendedServiceController: ServiceController
{
    public event EventHandler<ServiceStatusEventArgs> StatusChanged;
    private Dictionary<ServiceControllerStatus, Task> _tasks = new Dictionary<ServiceControllerStatus, Task>();

    new public ServiceControllerStatus Status
    {
        get
        {
            base.Refresh();
            return base.Status;
        }
    }

    public ExtendedServiceController(string ServiceName): base(ServiceName)
    {
        foreach (ServiceControllerStatus status in Enum.GetValues(typeof(ServiceControllerStatus)))
        {
            _tasks.Add(status, null);
        }
        StartListening();
    }

    private void StartListening()
    {
        foreach (ServiceControllerStatus status in Enum.GetValues(typeof(ServiceControllerStatus)))
        {
            if (this.Status != status && (_tasks[status] == null || _tasks[status].IsCompleted))
            {
                _tasks[status] = Task.Run(() =>
                {
                    try
                    {
                        base.WaitForStatus(status);
                        OnStatusChanged(new ServiceStatusEventArgs(status));
                        StartListening();
                    }
                    catch
                    {
                        // You can either raise another event here with the exception or ignore it since it most likely means the service was uninstalled/lost communication
                    }
                });
            }
        }
    }

    protected virtual void OnStatusChanged(ServiceStatusEventArgs e)
    {
        EventHandler<ServiceStatusEventArgs> handler = StatusChanged;
        handler?.Invoke(this, e);
    }
}

public class ServiceStatusEventArgs : EventArgs
{
    public ServiceControllerStatus Status { get; private set; }
    public ServiceStatusEventArgs(ServiceControllerStatus Status)
    {
        this.Status = Status;
    }
}

用法

static void Main(string[] args)
{
    ExtendedServiceController xServiceController = new ExtendedServiceController("myService");
    xServiceController.StatusChanged += xServiceController_StatusChanged;
    Console.Read();

    // Added bonus since the class inherits from ServiceController, you can use it to control the service as well.
}

// This event handler will catch service status changes externally as well
private static void xServiceController_StatusChanged(object sender, ServiceStatusEventArgs e)
{
    Console.WriteLine("Status Changed: " + e.Status);
}

您可以使用ServiceControllerManagementObjectSearcher列出正在运行的服务。

以下是使用ManagementObjectSearcher的示例:

using System.Management;

...

StringBuilder sb = new StringBuilder();
string format = "{0},{1},{2},{3},{4}";

// Header line
sb.AppendFormat(format, "DisplayName", 
                        "ServiceName", 
                        "Status", 
                        "ProcessId", 
                        "PathName");
sb.AppendLine();

ManagementObjectSearcher searcher = 
           new ManagementObjectSearcher("SELECT * FROM Win32_Service");

foreach( ManagementObject result in searcher.Get() )
{
    sb.AppendFormat(format, result["DisplayName"], 
                            result["Name"], 
                            result["State"], 
                            result["ProcessId"], 
                            result["PathName"]
                   );
    sb.AppendLine();
}

File.WriteAllText(
         @"C:\temp\ManagementObjectSearcher_services.csv", 
         sb.ToString()
);

要获得开始和停止时间,您似乎必须查询Windows事件日志。

此博客文章显示如何监视事件日志以在服务停止或启动时收到通知: https//dotnetcodr.com/2014/12/02/getting-notified-by-a-windows-service-status-改变功能于C-NET /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM