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();}
}

