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的更多相关文章

  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. Ubuntu 14.04 LTS 安装 VNC Viewer

    1.修改镜像源: /etc/apt/sources.list将"http://archive.ubuntu.com/ubuntu/"替换为: http://cn.archive.u ...

  2. Jquery scrollTop animate 實現動態滾動到頁面頂部

    這個方法之前都是用的錨點實現的,但是效果僵硬,動感不足! 之後參考了一些網站,發現都是用的js,於是自己想到用jquery 來做一個插件也來實現以下這個小功能. $.fn.backTop = func ...

  3. nginx调优

    Nginx is an open-source Web Server. It is a high-performance HTTP server that uses very low server r ...

  4. 去除字符串中空格的方法(2016.1.12P141-2)

    // forif来处理空格 // 方法一 String str = " ww sse rr"; String str1;// 定义一个中间变量 String str2 = &quo ...

  5. Anti-pattern

    https://en.wikipedia.org/wiki/Anti-pattern https://zh.wikipedia.org/wiki/反面模式 An anti-pattern is a c ...

  6. Lazarus解决无法识别中文路径的方法

    procedure TForm1.Button1Click(Sender: TObject); var FileN:string; begin if self.OpenDialog1.Execute ...

  7. phpcms v9 模板调用代码大全

    另:每个栏目会对应当前所选模型的三个模板文件:  这些模板文件所在位置:phpcms/templates/default/content/ 目录下,如果想修改模板文件,只需要到此目录下找到对应的模板文 ...

  8. 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

      分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...

  9. Windows下查看机器监听端口

    1.查看所有端口占用情况 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 2.查看指定端口的占用情况      netstat -an |findstr :21 

  10. Strom简介,以及安装,和官方案例测试

    一:简介 1.strom的两种形式 2.strom的特性 3.使用场景 4.集群架构 5.集群架构进程 6.组件 Nimbus 7.从节点Supervisor 8.组件worker 9.组件Execu ...