c# Start/Stop/Check Status远程计算机的Windows Service
- static void Main(string[] args)
- {
- ConnectionOptions op = new ConnectionOptions();
// 登陆远程计算机的远程,- op.Username = "Domain\\Domainuser";
- op.Password = "password";
- // 该处不能使用ip必须是"计算机名称.域名\root\cimv2"
- ManagementScope scope = new ManagementScope(@"\\Servername.Domain\root\cimv2", op);
- scope.Connect();
- ManagementPath path = new ManagementPath("Win32_Service");
- using(ManagementClass services = new ManagementClass(scope, path, null))
- {
- foreach (ManagementObject service in services.GetInstances())
- {
- Console.WriteLine("{0}:{1}",service.GetPropertyValue("Name").ToString(),service.GetPropertyValue("State").ToString());
- }
- }
- Console.ReadKey();
- }
如何远程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来连通远程机:
- ConnectionOptions options = new ConnectionOptions();
- // If we are connecting to a remote host and want to
- // connect as a different user, we need to set some options
- //options.Username =
- //options.Password =
- //options.Authority =
- //options.EnablePrivileges =
- // If we are connecting to a remote host, we need to specify the hostname:
- //string providerPath = @"\\Hostname\root\CIMv2";
- string providerPath = @"root\CIMv2";
- ManagementScope scope = new ManagementScope(providerPath, options);
- 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);
- ManagementPath path = new ManagementPath("Win32_Service.Name='SomeWindowsService'");
- ManagementObject obj = new ManagementObject(scope, path, new ObjectGetOptions());
- ManagementBaseObject outParams = obj.InvokeMethod("StartService", (ManagementBaseObject)null, null);
- uint returnCode = System.Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
上边这种方法是一种同步的方法,当然我们也可以使用异步接收InvokeMethod执行结果。
- ManagementOperationObserver observer = new ManagementOperationObserver();
- // The ObjectReadyHandler method will need a prototype of
- // public void ObjectReadyHandler(object sender, ObjectReadyEventArgs e) { ... }
- observer.ObjectReady += ObjectReadyHandler;
- obj.InvokeMethod(observer, "StartService", new object[]);
ManagementOperationObserver有两个事件可以订约,你可以订约ObjectReady,也可以订约Completed事件。
WMI proxy classes
你可以使用.NET Framework包含的一个强类型WMI代理类生成工具,你可以是使用一下命令生成对类Win32_Service
的代理类:
MgmtClassGen.exe Win32_Service /L CS /O some.namespace /N root\cimv2 /P ServiceProxy.cs
执行这些代码后,你将得到一个ServiceProxy.cs文件,在使用该代理类的时候,你还需要结合ConnectionOptions使用:
- string condition = "Name LIKE 'SQL%'";
- ServiceProxy.ServiceCollection sc = ServiceProxy.GetInstances(scope, condition);
- foreach (ServiceProxy s in sc)
- {
- string name = s.Name;
- ...
- s.StartService();
- }
Service Controller
System.Management.dll下微软封装好了一个这样的类,该类也是我们大多数人对本地服务进行操作时,搜选方案,当时远程机也可以,但该类在操作远程机时,必须要启动你的软件以有权限操作其他机子的账户(比如:账户A在你的远程机上也有该账户,在远程机上该账户也有对WMI操作权限)。
所以说,当在控制远程机上的服务时,使用该类的局限性很大,而且不可以切换用户。
- ServiceController controller = new ServiceController("servicename", "hostname");
- if (ServiceControllerStatus.Stopped == controller.Status)
- {
- controller.Start();
- // You can use the following line to wait for service to finish starting
- // you can supply a TimeSpan object to this method to timeout after that period.
- controller.WaitForStatus(ServiceControllerStatus.Running);
- }
运行结果,果然不负众望。
参考:
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/
c# Start/Stop/Check Status远程计算机的Windows Service的更多相关文章
- ECS Win2008 远程时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限"的解决方法
问题描述 ECS Windows 2008 远程登陆时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限",如下图所示: 问题分析 组策略中做了设置不允许管理员组成 ...
- Win7 远程桌面 错误代码:5 异常处理(您的远程桌面会话即将结束 此计算机的虚拟内存可能不足。请关闭其他程序,然后重试连接远程计算机。如果问题仍然存在,请联系网络管理员或技术支持。)
问题表现: 在用windows7 远程桌面连接其他电脑时,出现错误提示对话框—-标题为“严重错误(错误代码:5)”,内容为“您的远程桌面会话即将结束 此计算机的虚拟内存可能不足.请关闭其他程序,然后重 ...
- win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误
win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误 解决方法如下: Step 1:打开"本地安全策略"- Wi ...
- (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法
原文:http://www.chunfengxiyu.com/ws2008-mstsc-privilege.html WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服 ...
- 关于win8.1“连接被远程计算机关闭”的一种解决方案
我就是连接的时候出现"连接被远程计算机关闭",然后想着可能是win8更新之后网络协议 出问题了,后来无意中发现e信在第一次启动的时候会在网络适配器中会多出很多网卡,其中三个是带感叹 ...
- "客户端无法连接到远程计算机"错误的解决方法
问题: 客户端无法连接到远程计算机. 可能没有启用远程连接或者计算机太忙不能接受新的连接. 也可能是网络问题阻止连接.请稍后重新尝试连接. 如果问题仍然存在 请与管理员联系. 解决方法: 1.首先确认 ...
- L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误(转)
L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误 错误描述:“ L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误” 只有这个没有错误码. ...
- C#判断远程计算机的指定端口是否打开的代码
如下的内容段是关于C#判断远程计算机的指定端口是否打开的内容,应该能对小伙伴有一些用. using System.Net;if(!string.IsNullOrEmpty(txtPort.Text)) ...
- WIN10远程计算机不支持所需的FIPS安全级别解决
win10系统的电脑在远程xp系统或者其他系统的电脑时,提示错误,远程计算机可能不支持所需的FIPS安全级别,如果出现一以下2种错误,可以解决! 1 第一步:打开win10下的,控制面板 2 第二 ...
随机推荐
- FAQ软件卸载
今天安装了一个PDF 编辑软件pdftk,下载时提示有50多M,感觉不好用,卸载后提示释放空间只有2M,郁闷了.上网查寻,如下命令 sudo dpkg -p package_name卸载软件包及其配置 ...
- NSQ:分布式的实时消息平台
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其 ...
- Pentium II paging mechanism
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To understand the str ...
- 依赖注入Bean属性
一.Bean属性依赖注入 对于类成员变量,注入方式有三种 •构造函数注入 •属性setter方法注入 •接口注入 Spring支持前两种 1.构造函数 属性注入 使用构造方法注入,在Spring配置文 ...
- 【转】CSS(10)盒子模型
CSS中, Box Model叫盒子模型(或框模型),Box Model规定了元素框处理元素内容(element content).内边距(padding).边框(border) 和 外边距(marg ...
- install zabbix-agent on CENTOS
in ubuntu--https://www.digitalocean.com/community/tutorials/how-to-install-zabbix-on-ubuntu-configur ...
- 软件的NABCD----安装部分
N:需求 有些软件安装需要很多的插件,很很多的安装步骤,甚至文件夹移动等麻烦的步骤 A:做法 做成一键安装的程序 B:好处 默认D盘安装,节省C盘空间,没有赘余插件,一键安装,省时省力. C:竞争 和 ...
- Object C语法学习笔记(一)
1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...
- android 直接启动其他应用的Service
最近在做一个小插件,没有图标没有activity,利用其他APK启动它的service. 直奔主题,插件A,安装插件的应用B. B安装A后,由于A刚被安装,没有注册广播接收器,这里不考虑AIDL.需求 ...
- 20145211 《Java程序设计》第3周学习总结——绝知此事要躬行
教材学习内容总结 4.1何为面向对象 面向对象,面向过程都是一种思想,没有高低之分.面向对象,就像是对冰箱操作,冰箱是一个介质,用法就像是c语言中的结构体,功能定义在对象上.面向对象,角色转变,让我们 ...