C#测试调用ServiceController类查询及操作服务的基本用法
微软提供的System.ServiceProcess.ServiceController包支持获取系统服务信息,同时支持启动、停止、刷新服务等操作,其中最重要的类为ServiceController,该类的常用属性及函数如下表所示:
序号 | 名称 | 类型 | 说明 |
---|---|---|---|
1 | DisplayName | 属性 | 服务的显示名称 |
2 | ServiceName | 属性 | 服务的系统名称 |
3 | Status | 属性 | 服务状态,包括Stopped(已停止)、StartPending(正在启动)、StopPending(正在停止)、Running(正在运行)、ContinuePending(正在恢复)、PausePending(正在暂停)、Paused(已暂停)等状态 |
4 | MachineName | 属性 | 服务所在计算机名(默认 “.” 表示本地) |
5 | CanStop | 属性 | 服务是否支持停止 |
6 | CanPauseAndContinue | 属性 | 服务是否支持暂停/恢复 |
7 | DependentServices | 属性 | 依赖此服务的其他服务 |
8 | ServicesDependedOn | 属性 | 此服务依赖的其他服务 |
9 | Start | 函数 | 启动服务 |
10 | Stop | 函数 | 停止服务 |
11 | Pause | 函数 | 暂停服务 |
12 | Continue | 函数 | 恢复暂停的服务 |
13 | Refresh | 函数 | 刷新服务信息 |
14 | WaitForStatus | 函数 | 等待服务进入指定状态 |
15 | ExecuteCommand | 函数 | 向服务发送自定义命令 |
16 | GetServices | 静态函数 | 获取本地服务列表 |
VS2022新建Winform项目,在Nuget包管理器中搜索并安装System.ServiceProcess. ServiceController包。
使用ServiceController.GetServices函数获取本机服务列表,并逐个列出服务名、状态等信息,示例代码及运行效果如下所示:
lstServices.Items.Clear();ServiceController[] services = ServiceController.GetServices();for (int i = 0; i < services.Length; i++)
{ListViewItem lvi = new ListViewItem(Convert.ToString(i + 1));lvi.SubItems.Add(services[i].DisplayName + "_" + services[i].ServiceName);lvi.SubItems.Add(services[i].Status.ToString());lvi.Tag = services[i];lstServices.Items.Add(lvi);
}
选择某一服务采用定时器方式进行监控,如果服务停止,则提示并重新启动服务,示例代码及运行效果如下所示:
m_monitorService.Refresh();if(m_monitorService.Status== ServiceControllerStatus.Stopped)
{if(MessageBox.Show($"{m_monitorService.DisplayName}服务已停止,是否重新启动?","警告", MessageBoxButtons.YesNo)== DialogResult.Yes){m_monitorService.Start();}
}