(.Net)使用WMI远程控制windows服务(转载)
2011-05-27 10:13
471 查看
最近碰到需要利用WMI来远程控制机器的windows服务的问题(拒绝访问),google一下天行健给出了大部分代码,看上去还挺不错的。
[align=left]using System;[/align]
[align=left]using System.Management;[/align]
[align=left]namespace ZZ.Wmi[/align]
[align=left]{[/align]
[align=left] public class Win32ServiceManager[/align]
[align=left] {[/align]
[align=left] private string strPath;[/align]
[align=left] private ManagementClass managementClass;[/align]
[align=left] public Win32ServiceManager():this(".",null,null)[/align]
[align=left] {[/align]
[align=left] }[/align]
[align=left] public Win32ServiceManager(string host,string userName,string password)[/align]
[align=left] {[/align]
[align=left] this.strPath = "\\\\"+host+"\\root\\cimv2:Win32_Service";[/align]
[align=left] this.managementClass = new ManagementClass(strPath);[/align]
[align=left] if(userName!=null&&userName.Length>0)[/align]
[align=left] {[/align]
[align=left] ConnectionOptions connectionOptions = new ConnectionOptions();[/align]
[align=left] connectionOptions.Username = userName;[/align]
[align=left] connectionOptions.Password = password;[/align]
[align=left] ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;[/align]
[align=left] this.managementClass.Scope = managementScope;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] // 验证是否能连接到远程计算机[/align]
[align=left] public static bool RemoteConnectValidate(string host,string userName,string password)[/align]
[align=left] {[/align]
[align=left] ConnectionOptions connectionOptions = new ConnectionOptions();[/align]
[align=left] connectionOptions.Username = userName;[/align]
[align=left] connectionOptions.Password = password;[/align]
[align=left] ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] managementScope.Connect();[/align]
[align=left] }[/align]
[align=left] catch[/align]
[align=left] {[/align]
[align=left] }[/align]
[align=left] return managementScope.IsConnected;[/align]
[align=left] }[/align]
[align=left] // 获取指定服务属性的值[/align]
[align=left] public object GetServiceValue(string serviceName,string propertyName)[/align]
[align=left] {[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] return mo[propertyName];[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的所有服务数据[/align]
[align=left] public string [,] GetServiceList()[/align]
[align=left] {[/align]
[align=left] string [,] services = new string [this.managementClass.GetInstances().Count,4];[/align]
[align=left] int i = 0;[/align]
[align=left] foreach(ManagementObject mo in this.managementClass.GetInstances())[/align]
[align=left] {[/align]
[align=left] services[i,0] = (string)mo["Name"];[/align]
[align=left] services[i,1] = (string)mo["DisplayName"];[/align]
[align=left] services[i,2] = (string)mo["State"];[/align]
[align=left] services[i,3] = (string)mo["StartMode"];[/align]
[align=left] i++;[/align]
[align=left] }[/align]
[align=left] return services;[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的指定服务数据[/align]
[align=left] public string [,] GetServiceList(string serverName)[/align]
[align=left] {[/align]
[align=left] return GetServiceList(new string []{serverName});[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的的指定服务数据[/align]
[align=left] public string [,] GetServiceList(string [] serverNames)[/align]
[align=left] {[/align]
[align=left] string [,] services = new string [serverNames.Length,4];[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] for(int i = 0;i<serverNames.Length;i++)[/align]
[align=left] {[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serverNames[i]+"\"");[/align]
[align=left] services[i,0] = (string)mo["Name"];[/align]
[align=left] services[i,1] = (string)mo["DisplayName"];[/align]
[align=left] services[i,2] = (string)mo["State"];[/align]
[align=left] services[i,3] = (string)mo["StartMode"];[/align]
[align=left] }[/align]
[align=left] return services;[/align]
[align=left] }[/align]
[align=left] // 停止指定的服务[/align]
[align=left] public string StartService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] if((string)mo["State"]=="Stopped")//!(bool)mo["AcceptStop"][/align]
[align=left] mo.InvokeMethod("StartService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 暂停指定的服务[/align]
[align=left] public string PauseService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以暂停[/align]
[align=left] if((bool)mo["acceptPause"]&&(string)mo["State"]=="Running")[/align]
[align=left] mo.InvokeMethod("PauseService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 恢复指定的服务[/align]
[align=left] public string ResumeService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以恢复[/align]
[align=left] if((bool)mo["acceptPause"]&&(string)mo["State"]=="Paused")[/align]
[align=left] mo.InvokeMethod("ResumeService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 停止指定的服务[/align]
[align=left] public string StopService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以停止[/align]
[align=left] if((bool)mo["AcceptStop"])//(string)mo["State"]=="Running"[/align]
[align=left] mo.InvokeMethod("StopService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
}
}
在使用的过程中还碰到一个小问题就是利用listview控件显示多列信息时候,用add方法加入一条记录却首尾右移了一列。最后用insert方法才解决的。回到正题,使用WMI在本机测试的时候其实并不需要用户名和密码最好就是注释掉相关语句(web的时候则考虑使用webconfig中的impersonate进行模拟windows登陆,假如远程控制的话则需要密码,另外还得开启WMI和RPC服务(远程或本机时候均要满足此条件),至于账号我使用的是administrator用户组的用户名,可能如果是其他组的用户则需要考虑右键我的电脑/管理/展开服务和应用程序/右键WMI/属性/安全页签/选择CIMV2目录/点击安全设置加入相关账号,下面的就很简单了。
在搜索过程中某个人坚定的说局域网内肯定不可能进行的,但是事实胜于毫无依据的判断,也有人说和需要connectionoptions中的domain属性需要设置下,但是在我的实际测试中(没有域)并没有需要这个属性的地方。
希望我的文章能帮助遇到类似问题的同志。
参考文章:天行健转帖的c#控制远程计算机服务 http://www.cnblogs.com/waxic/archive/2007/04/24/725419.html
[align=left]using System;[/align]
[align=left]using System.Management;[/align]
[align=left]namespace ZZ.Wmi[/align]
[align=left]{[/align]
[align=left] public class Win32ServiceManager[/align]
[align=left] {[/align]
[align=left] private string strPath;[/align]
[align=left] private ManagementClass managementClass;[/align]
[align=left] public Win32ServiceManager():this(".",null,null)[/align]
[align=left] {[/align]
[align=left] }[/align]
[align=left] public Win32ServiceManager(string host,string userName,string password)[/align]
[align=left] {[/align]
[align=left] this.strPath = "\\\\"+host+"\\root\\cimv2:Win32_Service";[/align]
[align=left] this.managementClass = new ManagementClass(strPath);[/align]
[align=left] if(userName!=null&&userName.Length>0)[/align]
[align=left] {[/align]
[align=left] ConnectionOptions connectionOptions = new ConnectionOptions();[/align]
[align=left] connectionOptions.Username = userName;[/align]
[align=left] connectionOptions.Password = password;[/align]
[align=left] ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;[/align]
[align=left] this.managementClass.Scope = managementScope;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] // 验证是否能连接到远程计算机[/align]
[align=left] public static bool RemoteConnectValidate(string host,string userName,string password)[/align]
[align=left] {[/align]
[align=left] ConnectionOptions connectionOptions = new ConnectionOptions();[/align]
[align=left] connectionOptions.Username = userName;[/align]
[align=left] connectionOptions.Password = password;[/align]
[align=left] ManagementScope managementScope = new ManagementScope( "\\\\" +host+ "\\root\\cimv2",connectionOptions) ;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] managementScope.Connect();[/align]
[align=left] }[/align]
[align=left] catch[/align]
[align=left] {[/align]
[align=left] }[/align]
[align=left] return managementScope.IsConnected;[/align]
[align=left] }[/align]
[align=left] // 获取指定服务属性的值[/align]
[align=left] public object GetServiceValue(string serviceName,string propertyName)[/align]
[align=left] {[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] return mo[propertyName];[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的所有服务数据[/align]
[align=left] public string [,] GetServiceList()[/align]
[align=left] {[/align]
[align=left] string [,] services = new string [this.managementClass.GetInstances().Count,4];[/align]
[align=left] int i = 0;[/align]
[align=left] foreach(ManagementObject mo in this.managementClass.GetInstances())[/align]
[align=left] {[/align]
[align=left] services[i,0] = (string)mo["Name"];[/align]
[align=left] services[i,1] = (string)mo["DisplayName"];[/align]
[align=left] services[i,2] = (string)mo["State"];[/align]
[align=left] services[i,3] = (string)mo["StartMode"];[/align]
[align=left] i++;[/align]
[align=left] }[/align]
[align=left] return services;[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的指定服务数据[/align]
[align=left] public string [,] GetServiceList(string serverName)[/align]
[align=left] {[/align]
[align=left] return GetServiceList(new string []{serverName});[/align]
[align=left] }[/align]
[align=left] // 获取所连接的计算机的的指定服务数据[/align]
[align=left] public string [,] GetServiceList(string [] serverNames)[/align]
[align=left] {[/align]
[align=left] string [,] services = new string [serverNames.Length,4];[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] for(int i = 0;i<serverNames.Length;i++)[/align]
[align=left] {[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serverNames[i]+"\"");[/align]
[align=left] services[i,0] = (string)mo["Name"];[/align]
[align=left] services[i,1] = (string)mo["DisplayName"];[/align]
[align=left] services[i,2] = (string)mo["State"];[/align]
[align=left] services[i,3] = (string)mo["StartMode"];[/align]
[align=left] }[/align]
[align=left] return services;[/align]
[align=left] }[/align]
[align=left] // 停止指定的服务[/align]
[align=left] public string StartService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] if((string)mo["State"]=="Stopped")//!(bool)mo["AcceptStop"][/align]
[align=left] mo.InvokeMethod("StartService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 暂停指定的服务[/align]
[align=left] public string PauseService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以暂停[/align]
[align=left] if((bool)mo["acceptPause"]&&(string)mo["State"]=="Running")[/align]
[align=left] mo.InvokeMethod("PauseService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 恢复指定的服务[/align]
[align=left] public string ResumeService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以恢复[/align]
[align=left] if((bool)mo["acceptPause"]&&(string)mo["State"]=="Paused")[/align]
[align=left] mo.InvokeMethod("ResumeService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
[align=left] // 停止指定的服务[/align]
[align=left] public string StopService(string serviceName)[/align]
[align=left] {[/align]
[align=left] string strRst = null;[/align]
[align=left] ManagementObject mo = this.managementClass.CreateInstance();[/align]
[align=left] mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\"");[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] //判断是否可以停止[/align]
[align=left] if((bool)mo["AcceptStop"])//(string)mo["State"]=="Running"[/align]
[align=left] mo.InvokeMethod("StopService",null);[/align]
[align=left] }[/align]
[align=left] catch(ManagementException e)[/align]
[align=left] {[/align]
[align=left] strRst =e.Message;[/align]
[align=left] }[/align]
[align=left] return strRst;[/align]
[align=left] }[/align]
}
}
在使用的过程中还碰到一个小问题就是利用listview控件显示多列信息时候,用add方法加入一条记录却首尾右移了一列。最后用insert方法才解决的。回到正题,使用WMI在本机测试的时候其实并不需要用户名和密码最好就是注释掉相关语句(web的时候则考虑使用webconfig中的impersonate进行模拟windows登陆,假如远程控制的话则需要密码,另外还得开启WMI和RPC服务(远程或本机时候均要满足此条件),至于账号我使用的是administrator用户组的用户名,可能如果是其他组的用户则需要考虑右键我的电脑/管理/展开服务和应用程序/右键WMI/属性/安全页签/选择CIMV2目录/点击安全设置加入相关账号,下面的就很简单了。
在搜索过程中某个人坚定的说局域网内肯定不可能进行的,但是事实胜于毫无依据的判断,也有人说和需要connectionoptions中的domain属性需要设置下,但是在我的实际测试中(没有域)并没有需要这个属性的地方。
希望我的文章能帮助遇到类似问题的同志。
参考文章:天行健转帖的c#控制远程计算机服务 http://www.cnblogs.com/waxic/archive/2007/04/24/725419.html
相关文章推荐
- 使用WMI控制Windows进程 和服务
- vb.net中使用wmi关闭远程计算机上的进程
- [转载]ASP.NET Web 服务还是 .NET Remoting:如何选择,使用 Microsoft .NET 建立分布式应用程序
- 使用C#控制远程计算机的服务
- 如何使用windows远程控制centOS桌面
- 以Windows服务方式运行ASP.NET Core程序【转载】
- 基于visual c++之windows核心编程代码分析(66)实现Windows服务的远程控制
- 从Window系统托盘控制Windows服务---net_lover [原作]
- 通过Spring使用远程访问和web服务(转载)
- .NET Framework 4.6 and 4.5 > 开发指南 > 使用 WCF 的面向服务的应用程序 > Windows Communication Foundation (WCF)
- .Net服务组件(ServicedComponent)简介及其使用(转载)
- Windows系统中使用WMI获取远程服务器的信息
- 如何使用windows远程控制centOS桌面
- 使用C#控制远程计算机的服务[转]
- 使用Windows 7远程控制Ubuntu 16.04
- ASP.NET 下使用特定身份完成windows服务的功能操作
- C# ASP.NET 控制windows服务的 开启和关闭 以及重启
- 使用Windows 10远程控制Ubuntu 16.04
- 使用微软Remote Desktop 手机远程控制 windows