C# ServiceController类剖析

开发 后端
这里介绍C# ServiceController类可以很方便的实现对服务的控制,而且很直观、简洁和容易理解。但是我认为他的功能同通过WMI来操作服务相比。

C#语言有很多值得学习的地方,这里我们主要介绍C# ServiceController类,包括介绍WMI作为Windows 2000操作系统的一部分等方面。

在.net中提供了一些类来显示和控制Windows系统上的服务,并可以实现对远程计算机服务服务的访问,如System.ServiceProcess命名空间下面的C# ServiceController类。

C# ServiceController类可以很方便的实现对服务的控制,而且很直观、简洁和容易理解。但是我认为他的功能同通过WMI来操作服务相比,那可能就有些单一了,并且对多个服务的操作可能就比较麻烦,也无法列出系统中的所有服务的具体数据。这里要讲的就是如何使用System.Management组件来操作远程和本地计算机上的服务。

WMI作为Windows 2000操作系统的一部分提供了可伸缩的,可扩展的管理架构.公共信息模型(CIM)是由分布式管理任务标准协会(DMTF)设计的一种可扩展的、面向对象的架构,用于管理系统、网络、应用程序、数据库和设备。Windows管理规范也称作CIM for Windows,提供了统一的访问管理信息的方式。如果需要获取详细的WMI信息请读者查阅MSDN。System.Management组件提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统、设备和应用程序设置检测点有关的。

但是上面并不是我们最关心的,下面才是我们需要谈的话题。

毫无疑问,我们要引用System.Management.Dll程序集,并要使用System.Management命名空间下的类,如 ManagementClass,ManagementObject等。下面用一个名为Win32ServiceManager的类把服务的一些相关操作包装了一下,代码如下:

  1. usingSystem;  
  2. usingSystem.Management;  
  3. namespaceZZ.Wmi  
  4. {  
  5. publicclassWin32ServiceManager  
  6. {  
  7. privatestringstrPath;  
  8. privateManagementClassmanagementClass;  
  9. publicWin32ServiceManager():this(".",null,null)  
  10. {  
  11. }  
  12. publicWin32ServiceManager(stringhost,stringuserName,stringpassword)  
  13. {  
  14. this.strPath="\\\\"+host+"\\root\\cimv2:Win32_Service";  
  15. this.managementClass=newManagementClass(strPath);  
  16. if(userName!=null&&userName.Length>0)  
  17. {  
  18. ConnectionOptionsconnectionOptions=newConnectionOptions();  
  19. connectionOptions.Username=userName;  
  20. connectionOptions.Password=password;  
  21. ManagementScopemanagementScope=newManagementScope
    ("\\\\"+host+"\\root\\cimv2",connectionOptions);  
  22. this.managementClass.Scope=managementScope;  
  23. }  
  24. }  
  25. //验证是否能连接到远程计算机  
  26. publicstaticboolRemoteConnectValidate(stringhost,stringuserName,stringpassword)  
  27. {  
  28. ConnectionOptionsconnectionOptions=newConnectionOptions();  
  29. connectionOptions.Username=userName;  
  30. connectionOptions.Password=password;  
  31. ManagementScopemanagementScope=newManagementScope
    ("\\\\"+host+"\\root\\cimv2",connectionOptions);  
  32. try  
  33. {  
  34. managementScope.Connect();  
  35. }  
  36. catch  
  37. {  
  38. }  
  39. returnmanagementScope.IsConnected;  
  40. }  
  41. //获取指定服务属性的值  
  42. publicobjectGetServiceValue(stringserviceName,stringpropertyName)  
  43. {  
  44. ManagementObjectmo=this.managementClass.CreateInstance();  
  45. mo.Path=newManagementPath(this.strPath+".Name=\""+serviceName+"\"");  
  46. returnmo[propertyName];  
  47. }  
  48. //获取所连接的计算机的所有服务数据  
  49. publicstring[,]GetServiceList()  
  50. {  
  51. string[,]services=newstring[this.managementClass.GetInstances().Count,4];  
  52. inti=0;  
  53. foreach(ManagementObjectmointhis.managementClass.GetInstances())  
  54. {  
  55. services[i,0]=(string)mo["Name"];  
  56. services[i,1]=(string)mo["DisplayName"];  
  57. services[i,2]=(string)mo["State"];  
  58. services[i,3]=(string)mo["StartMode"];  
  59. i++;  
  60. }  
  61. returnservices;  
  62. }  
  63. //获取所连接的计算机的指定服务数据  
  64. publicstring[,]GetServiceList(stringserverName)  
  65. {  
  66. returnGetServiceList(newstring[]{serverName});  
  67. }  
  68. //获取所连接的计算机的的指定服务数据  
  69. publicstring[,]GetServiceList(string[]serverNames)  
  70. {  
  71. string[,]services=newstring[serverNames.Length,4];  
  72. ManagementObjectmo=this.managementClass.CreateInstance();  
  73. for(inti=0;i  
  74. {  
  75. mo.Path=newManagementPath(this.strPath+".Name=\""+serverNames[i]+"\"");  
  76. services[i,0]=(string)mo["Name"];  
  77. services[i,1]=(string)mo["DisplayName"];  
  78. services[i,2]=(string)mo["State"];  
  79. services[i,3]=(string)mo["StartMode"];  
  80. }  
  81. returnservices;  
  82. }  
  83. //停止指定的服务  
  84. publicstringStartService(stringserviceName)  
  85. {  
  86. stringstrRst=null;  
  87. ManagementObjectmo=this.managementClass.CreateInstance();  
  88. mo.Path=newManagementPath(this.strPath+".Name=\""+serviceName+"\"");  
  89. try  
  90. {  
  91. if((string)mo["State"]=="Stopped")//!(bool)mo["AcceptStop"]  
  92. mo.InvokeMethod("StartService",null);  
  93. }  
  94. catch(ManagementExceptione)  
  95. {  
  96. strRst=e.Message;  
  97. }  
  98. returnstrRst;  
  99. }  
  100. //暂停指定的服务  
  101. publicstringPauseService(stringserviceName)  
  102. {  
  103. stringstrRst=null;  
  104. ManagementObjectmo=this.managementClass.CreateInstance();  
  105. mo.Path=newManagementPath(this.strPath+".Name=\""+serviceName+"\"");  
  106. try  
  107. {  
  108. //判断是否可以暂停  
  109. if((bool)mo["acceptPause"]&&(string)mo["State"]=="Running")  
  110. mo.InvokeMethod("PauseService",null);  
  111. }  
  112. catch(ManagementExceptione)  
  113. {  
  114. strRst=e.Message;  
  115. }  
  116. returnstrRst;  
  117. }  
  118. //恢复指定的服务  
  119. publicstringResumeService(stringserviceName)  
  120. {  
  121. stringstrRst=null;  
  122. ManagementObjectmo=this.managementClass.CreateInstance();  
  123. mo.Path=newManagementPath(this.strPath+".Name=\""+serviceName+"\"");  
  124. try  
  125. {  
  126. //判断是否可以恢复  
  127. if((bool)mo["acceptPause"]&&(string)mo["State"]=="Paused")  
  128. mo.InvokeMethod("ResumeService",null);  
  129. }  
  130. catch(ManagementExceptione)  
  131. {  
  132. strRst=e.Message;  
  133. }  
  134. returnstrRst;  

以上介绍C# ServiceController类。

【编辑推荐】

  1. C#线程同步详细分析
  2. C#探讨木马程序浅谈
  3. C# Pop3Connection类简介
  4. C#数据类型简单介绍
  5. C#计算素数序列浅谈
责任编辑:佚名 来源: 51CTO.com
相关推荐

2009-09-02 18:14:33

C# WebClien

2009-09-07 13:42:56

C# Pop3类

2009-08-27 17:14:36

C# Socket

2009-09-01 16:29:03

QuickSort C

2009-09-11 11:09:36

C#引用类型

2009-09-01 11:04:59

C#调用扩展方法

2009-09-11 11:17:04

C#引用类型

2009-08-27 16:29:18

C#动态编译

2009-08-27 17:51:34

C#匿名方法

2009-08-31 17:26:32

C#异常处理

2009-09-03 16:58:49

C#内存管理

2009-08-28 10:44:46

C#字符数组转换

2009-09-18 10:00:17

C#数组操作

2009-09-02 13:36:58

C#实现多个接口

2009-08-28 11:16:51

C#日期型数

2009-09-04 17:56:22

C#删除数据

2009-08-28 15:32:39

C#利用WMI获取数据

2009-08-31 15:39:11

C#编写操作TreeV

2009-09-09 14:04:18

C# XML解析XML解析方法

2009-09-02 17:14:28

C#修饰符
点赞
收藏

51CTO技术栈公众号