.NET Diagnostics - III,使用 C# 枚举系统服务和依赖项






1.60/5 (4投票s)
2001年3月19日

107012

776
如何获取系统上所有系统服务的列表,并找出它们的依赖项。
引言
在编写一些诊断工具并探索 System.Diagnostics
命名空间的系列文章中,本文展示了如何找出系统上正在运行的所有系统服务,以及最重要的,找到它们的依赖项。我发现后一部分非常有趣。每次我在系统上打开“服务”对话框或任务管理器查看正在运行的所有服务时,我都会想,如果关闭其中一项以释放一些资源会发生什么。但随后你必须考虑,如果此服务是系统上运行的另一个服务或应用程序的一部分会怎样。这个实用程序枚举并显示系统上正在运行的所有系统服务。它还列出了特定服务所依赖的所有服务以及依赖此服务的服务。
你是如何做到的?
.NET 框架提供了 System.ServiceProcess
命名空间。此命名空间包含用于安装和运行系统服务的类。在此命名空间中,您将找到一个名为 SystemController
的类。SystemController
在 NT 术语中只不过是系统服务。该类具有一个静态方法 GetServices()
,它返回一个 SystemController
对象数组。此数组包含系统上运行的所有服务。
ServiceController [] controllers =
ServiceController.GetServices();
获取此数组后,枚举每个元素以获取有关每个服务的详细信息。SystemController
类具有许多属性,它们的名称不言自明。我不会详细介绍每个属性。我建议您查阅框架文档以获取更多详细信息。
DisplayName
- 在服务小程序中为此服务显示的描述性名称。Status
- 服务状态,例如,正在运行、已停止等。ServiceType
- 对象引用的服务类型。ServiceName
服务的简称。CanStop
- 指示是否可以随时停止该服务。CanShutDown
- 指示是否可以随时关闭该服务。CanPauseAndContinue
- 如果服务可以停止和继续。DependentServices
- 依赖此服务的服务列表。ServicesDependOn
- 此服务所依赖的服务列表。
ServiceController
类具有一些可用于启动和停止服务的方法。我没有在与本文附带的实用程序项目中展示这些方法的使用。但它们的使用非常简单。
查看与本文附带的源代码中的 InitList
方法。此函数展示了如何使用 SystemController
类中的所有属性。
// Check the status of this service to see if
// it can be stopped
bool bCanStop = controllers[i].CanStop;
item.SetSubItem(3, bCanStop ? "Yes" : "No");
// Check if the service recieves notification when
// system shuts down.
bool bCanShutDown = controllers[i].CanShutdown;
item.SetSubItem(4, bCanShutDown ? "Yes" : "No");
// Check if the service can be paused and continued.
bool bPauseNContinue = controllers[i].CanPauseAndContinue;
item.SetSubItem(5, bPauseNContinue ? "Yes" : "No");