c# Start/Stop/Check Status远程计算机的Windows Service
1 static void Main(string[] args) 2 { 3 ConnectionOptions op = new ConnectionOptions();
// 登陆远程计算机的远程, 4 op.Username = "Domain\\Domainuser"; 5 op.Password = "password"; 6 // 该处不能使用ip必须是"计算机名称.域名\root\cimv2" 7 ManagementScope scope = new ManagementScope(@"\\Servername.Domain\root\cimv2", op); 8 scope.Connect(); 9 ManagementPath path = new ManagementPath("Win32_Service"); 10 using(ManagementClass services = new ManagementClass(scope, path, null)) 11 { 12 foreach (ManagementObject service in services.GetInstances()) 13 { 14 Console.WriteLine("{0}:{1}",service.GetPropertyValue("Name").ToString(),service.GetPropertyValue("State").ToString()); 15 } 16 } 17 18 Console.ReadKey(); 19 }
如何远程Stop/Start远程机子上的服务?
在gfsoso上搜出别人总结的经验: http://www.gkspk.com/view/programming/working-with-windows-services-using-csharp-and-wmi/
远程控制可以有以下几种方式:
- WMI Queries via classes in the
System.Management
namespace, - Strongly-typed WMI proxy classes generated using
MgmtClassGen.exe
, and - The
System.ServiceProcess.ServiceController
class.
WMI queries
首先我们需要使用ConnectionOptions来连通远程机:
1 ConnectionOptions options = new ConnectionOptions(); 2 3 // If we are connecting to a remote host and want to 4 // connect as a different user, we need to set some options 5 //options.Username = 6 //options.Password = 7 //options.Authority = 8 //options.EnablePrivileges = 9 10 // If we are connecting to a remote host, we need to specify the hostname: 11 //string providerPath = @"\\Hostname\root\CIMv2"; 12 string providerPath = @"root\CIMv2"; 13 14 ManagementScope scope = new ManagementScope(providerPath, options); 15 scope.Connect();
我们使用WMI支持一种查询方式叫做WQL,它的用法是类似于SQL。我们可以使用WQL去查询某台服务器的上的服务运行状态:
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Service WHERE Name LIKE 'SQL%'"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); foreach (ManagementObject o in searcher.Get()) { string name = o["Name"]; ... }
我们可以使用ManagementObject去对单个远程的WindowsService进行控制:比如停止服务(Invoke函数:StopService)或者启动服务(Invoke 函数:StartService);
1 ManagementPath path = new ManagementPath("Win32_Service.Name='SomeWindowsService'"); 2 ManagementObject obj = new ManagementObject(scope, path, new ObjectGetOptions()); 3 ManagementBaseObject outParams = obj.InvokeMethod("StartService", (ManagementBaseObject)null, null); 4 uint returnCode = System.Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
上边这种方法是一种同步的方法,当然我们也可以使用异步接收InvokeMethod执行结果。
1 ManagementOperationObserver observer = new ManagementOperationObserver(); 2 // The ObjectReadyHandler method will need a prototype of 3 // public void ObjectReadyHandler(object sender, ObjectReadyEventArgs e) { ... } 4 observer.ObjectReady += ObjectReadyHandler; 5 obj.InvokeMethod(observer, "StartService", new object[0]);
ManagementOperationObserver有两个事件可以订约,你可以订约ObjectReady,也可以订约Completed事件。
WMI proxy classes
你可以使用.NET Framework包含的一个强类型WMI代理类生成工具,你可以是使用一下命令生成对类Win32_Service
的代理类:
1 MgmtClassGen.exe Win32_Service /L CS /O some.namespace /N root\cimv2 /P ServiceProxy.cs
执行这些代码后,你将得到一个ServiceProxy.cs文件,在使用该代理类的时候,你还需要结合ConnectionOptions使用:
1 string condition = "Name LIKE 'SQL%'"; 2 ServiceProxy.ServiceCollection sc = ServiceProxy.GetInstances(scope, condition); 3 foreach (ServiceProxy s in sc) 4 { 5 string name = s.Name; 6 ... 7 s.StartService(); 8 }
Service Controller
System.Management.dll下微软封装好了一个这样的类,该类也是我们大多数人对本地服务进行操作时,搜选方案,当时远程机也可以,但该类在操作远程机时,必须要启动你的软件以有权限操作其他机子的账户(比如:账户A在你的远程机上也有该账户,在远程机上该账户也有对WMI操作权限)。
所以说,当在控制远程机上的服务时,使用该类的局限性很大,而且不可以切换用户。
1 ServiceController controller = new ServiceController("servicename", "hostname"); 2 if (ServiceControllerStatus.Stopped == controller.Status) 3 { 4 controller.Start(); 5 // You can use the following line to wait for service to finish starting 6 // you can supply a TimeSpan object to this method to timeout after that period. 7 controller.WaitForStatus(ServiceControllerStatus.Running); 8 }
运行结果,果然不负众望。
参考:
1,)http://www.codeproject.com/Articles/36268/Monitor-and-Manage-Services-on-Remote-Machines
2,)http://www.codeitive.com/0HJgVkjVeq/check-status-of-services-that-run-in-a-remote-computer-using-c.html
3,)http://www.gkspk.com/view/programming/working-with-windows-services-using-csharp-and-wmi/
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。