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去查询某台服务器的上的服务运行状态:

  1. ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Service WHERE Name LIKE 'SQL%'");
  2. ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
  3.  
  4. foreach (ManagementObject o in searcher.Get())
  5. {
  6. string name = o["Name"];
  7. ...
  8. }

我们可以使用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[]);

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使用:

  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/

c# Start/Stop/Check Status远程计算机的Windows Service的更多相关文章

  1. ECS Win2008 远程时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限"的解决方法

    问题描述 ECS Windows 2008 远程登陆时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限",如下图所示: 问题分析 组策略中做了设置不允许管理员组成 ...

  2. Win7 远程桌面 错误代码:5 异常处理(您的远程桌面会话即将结束 此计算机的虚拟内存可能不足。请关闭其他程序,然后重试连接远程计算机。如果问题仍然存在,请联系网络管理员或技术支持。)

    问题表现: 在用windows7 远程桌面连接其他电脑时,出现错误提示对话框—-标题为“严重错误(错误代码:5)”,内容为“您的远程桌面会话即将结束 此计算机的虚拟内存可能不足.请关闭其他程序,然后重 ...

  3. win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误

    win 10 远程连接出现 "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后.” 错误 解决方法如下: Step 1:打开"本地安全策略"- Wi ...

  4. (转)WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服务登录的权限”的解决办法

    原文:http://www.chunfengxiyu.com/ws2008-mstsc-privilege.html WS2008远程桌面连接时提示:“要登录到此远程计算机,您必须被授予允许通过终端服 ...

  5. 关于win8.1“连接被远程计算机关闭”的一种解决方案

    我就是连接的时候出现"连接被远程计算机关闭",然后想着可能是win8更新之后网络协议 出问题了,后来无意中发现e信在第一次启动的时候会在网络适配器中会多出很多网卡,其中三个是带感叹 ...

  6. "客户端无法连接到远程计算机"错误的解决方法

    问题: 客户端无法连接到远程计算机. 可能没有启用远程连接或者计算机太忙不能接受新的连接. 也可能是网络问题阻止连接.请稍后重新尝试连接. 如果问题仍然存在 请与管理员联系. 解决方法: 1.首先确认 ...

  7. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误(转)

    L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误   错误描述:“ L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误” 只有这个没有错误码. ...

  8. C#判断远程计算机的指定端口是否打开的代码

    如下的内容段是关于C#判断远程计算机的指定端口是否打开的内容,应该能对小伙伴有一些用. using System.Net;if(!string.IsNullOrEmpty(txtPort.Text)) ...

  9. WIN10远程计算机不支持所需的FIPS安全级别解决

    win10系统的电脑在远程xp系统或者其他系统的电脑时,提示错误,远程计算机可能不支持所需的FIPS安全级别,如果出现一以下2种错误,可以解决!   1 第一步:打开win10下的,控制面板 2 第二 ...

随机推荐

  1. FAQ软件卸载

    今天安装了一个PDF 编辑软件pdftk,下载时提示有50多M,感觉不好用,卸载后提示释放空间只有2M,郁闷了.上网查寻,如下命令 sudo dpkg -p package_name卸载软件包及其配置 ...

  2. NSQ:分布式的实时消息平台

    NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其 ...

  3. Pentium II paging mechanism

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To understand the str ...

  4. 依赖注入Bean属性

    一.Bean属性依赖注入 对于类成员变量,注入方式有三种 •构造函数注入 •属性setter方法注入 •接口注入 Spring支持前两种 1.构造函数 属性注入 使用构造方法注入,在Spring配置文 ...

  5. 【转】CSS(10)盒子模型

    CSS中, Box Model叫盒子模型(或框模型),Box Model规定了元素框处理元素内容(element content).内边距(padding).边框(border) 和 外边距(marg ...

  6. install zabbix-agent on CENTOS

    in ubuntu--https://www.digitalocean.com/community/tutorials/how-to-install-zabbix-on-ubuntu-configur ...

  7. 软件的NABCD----安装部分

    N:需求 有些软件安装需要很多的插件,很很多的安装步骤,甚至文件夹移动等麻烦的步骤 A:做法 做成一键安装的程序 B:好处 默认D盘安装,节省C盘空间,没有赘余插件,一键安装,省时省力. C:竞争 和 ...

  8. Object C语法学习笔记(一)

    1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...

  9. android 直接启动其他应用的Service

    最近在做一个小插件,没有图标没有activity,利用其他APK启动它的service. 直奔主题,插件A,安装插件的应用B. B安装A后,由于A刚被安装,没有注册广播接收器,这里不考虑AIDL.需求 ...

  10. 20145211 《Java程序设计》第3周学习总结——绝知此事要躬行

    教材学习内容总结 4.1何为面向对象 面向对象,面向过程都是一种思想,没有高低之分.面向对象,就像是对冰箱操作,冰箱是一个介质,用法就像是c语言中的结构体,功能定义在对象上.面向对象,角色转变,让我们 ...