当前位置: 首页 > 编程日记 > 正文

C#控制远程计算机的服务

在.net中提供了一些类来显示和控制Windows系统上的服务,并可以实现对远程计算机服务服务的访问,如System.ServiceProcess命名空间下面的ServiceController 类,System.Management下面的一些WMI操作的类。虽然用ServiceController可以很方便的实现对服务的控制,而且很直观、简洁和容易理解。但是我认为他的功能同通过WMI来操作服务相比,那可能就有些单一了,并且对多个服务的操作可能就比较麻烦,也无法列出系统中的所有服务的具体数据。这里要讲的就是如何使用System.Management组件来操作远程和本地计算机上的服务。
WMI作为Windows 2000操作系统的一部分提供了可伸缩的,可扩展的管理架构.公共信息模型(CIM)是由分布式管理任务标准协会(DMTF)设计的一种可扩展的、面向对象的架构,用于管理系统、网络、应用程序、数据库和设备。Windows管理规范也称作CIM for Windows,提供了统一的访问管理信息的方式。如果需要获取详细的WMI信息请读者查阅MSDN。System.Management组件提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统、设备和应用程序设置检测点有关的。
但是上面并不是我们最关心的,下面才是我们需要谈的话题。
毫无疑问,我们要引用System.Management.Dll程序集,并要使用System.Management命名空间下的类,如ManagementClass,ManagementObject等。下面用一个名为Win32ServiceManager的类把服务的一些相关操作包装了一下,代码如下:
using System;
using System.Management;
namespace ZZ.Wmi
{
public class Win32ServiceManager
{
private string strPath;
private ManagementClass managementClass;
public Win32ServiceManager():this(".",null,null)
{
}
public Win32ServiceManager(string host,string userName,string password)
{
this.strPath = ""+host+"//root//cimv2:Win32_Service";
this.managementClass = new ManagementClass(strPath);
if(userName!=null&&userName.Length>0)
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = userName;
connectionOptions.Password = password;
ManagementScope managementScope = new ManagementScope( "" +host+ "//root//cimv2",connectionOptions) ;
this.managementClass.Scope = managementScope;
}
}
// 验证是否能连接到远程计算机
public static bool RemoteConnectValidate(string host,string userName,string password)
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = userName;
connectionOptions.Password = password;
ManagementScope managementScope = new ManagementScope( "" +host+ "//root//cimv2",connectionOptions) ;
try
{
managementScope.Connect();
}
catch
{
}
return managementScope.IsConnected;
}
// 获取指定服务属性的值
public object GetServiceValue(string serviceName,string propertyName)
{
ManagementObject mo = this.managementClass.CreateInstance();
mo.Path = new ManagementPath(this.strPath+".Name=/""+serviceName+"/"");
return mo[propertyName];
}
// 获取所连接的计算机的所有服务数据
public string [,] GetServiceList()
{
string [,] services = new string [this.managementClass.GetInstances().Count,4];
int i = 0;
foreach(ManagementObject mo in this.managementClass.GetInstances())
{
services[i,0] = (string)mo["Name"];
services[i,1] = (string)mo["DisplayName"];
services[i,2] = (string)mo["State"];
services[i,3] = (string)mo["StartMode"];
i++;
}
return services;
}
// 获取所连接的计算机的指定服务数据
public string [,] GetServiceList(string serverName)
{
return GetServiceList(new string []{serverName});
}
// 获取所连接的计算机的的指定服务数据
public string [,] GetServiceList(string [] serverNames)
{
string [,] services = new string [serverNames.Length,4];
ManagementObject mo = this.managementClass.CreateInstance();
for(int i = 0;i<serverNames.Length;i++)
{
mo.Path = new ManagementPath(this.strPath+".Name=/""+serverNames[i]+"/"");
services[i,0] = (string)mo["Name"];
services[i,1] = (string)mo["DisplayName"];
services[i,2] = (string)mo["State"];
services[i,3] = (string)mo["StartMode"];
}
return services;
}
// 停止指定的服务
public string StartService(string serviceName)
{
string strRst = null;
ManagementObject mo = this.managementClass.CreateInstance();
mo.Path = new ManagementPath(this.strPath+".Name=/""+serviceName+"/"");
try
{
if((string)mo["State"]=="Stopped")//!(bool)mo["AcceptStop"]
mo.InvokeMethod("StartService",null);
}
catch(ManagementException e)
{
strRst =e.Message;
}
return strRst;
}
// 暂停指定的服务
public string PauseService(string serviceName)
{
string strRst = null;
ManagementObject mo = this.managementClass.CreateInstance();
mo.Path = new ManagementPath(this.strPath+".Name=/""+serviceName+"/"");
try
{
//判断是否可以暂停
if((bool)mo["acceptPause"]&&(string)mo["State"]=="Running")
mo.InvokeMethod("PauseService",null);
}
catch(ManagementException e)
{
strRst =e.Message;
}
return strRst;
}
// 恢复指定的服务
public string ResumeService(string serviceName)
{
string strRst = null;
ManagementObject mo = this.managementClass.CreateInstance();
mo.Path = new ManagementPath(this.strPath+".Name=/""+serviceName+"/"");
try
{
//判断是否可以恢复
if((bool)mo["acceptPause"]&&(string)mo["State"]=="Paused")
mo.InvokeMethod("ResumeService",null);
}
catch(ManagementException e)
{
strRst =e.Message;
}
return strRst;
}
// 停止指定的服务
public string StopService(string serviceName)
{
string strRst = null;
ManagementObject mo = this.managementClass.CreateInstance();
mo.Path = new ManagementPath(this.strPath+".Name=/""+serviceName+"/"");
try
{
//判断是否可以停止
if((bool)mo["AcceptStop"])//(string)mo["State"]=="Running"
mo.InvokeMethod("StopService",null);
}
catch(ManagementException e)
{
strRst =e.Message;
}
return strRst;
}
}
}
在Win32ServiceManager中通过RemoteConnectValidate静态方法来测试连接成功与否;另外提供了GetServiceValue方法和GetServiceList方法以及它的重载来获取服务信息;后面的四个方法就是对服务的状态控制了。
下面建立一个简单的窗口来使用它。
大致的界面如下:

通过vs.net 2003可以很快做出上面的窗体,下面列出了一些增加的代码:


using ZZ.Wmi;
namespace ZZForm
{
public class Form1 : System.Windows.Forms.Form
{
//……
private Win32ServiceManager serviceManager;
public Form1()
{
InitializeComponent();
this.serviceManager = null;
}
//……
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//修改服务状态
private void buttonChangeState_Click(object sender, System.EventArgs e)
{
switch(((Button)sender).Text)
{
case "启动":
string startRst = this.serviceManager.StartService(this.listViewService.SelectedItems[0].SubItems[0].Text);
if(startRst==null)
MessageBox.Show("操作成功,请点击获取刷新按钮刷新结果!");
else
MessageBox.Show(startRst);
break;
case "暂停":
string startPause = this.serviceManager.PauseService(this.listViewService.SelectedItems[0].SubItems[0].Text);
if(startPause==null)
MessageBox.Show("操作成功,请点击获取刷新按钮刷新结果!");
else
MessageBox.Show(startPause);
break;
case "继续":
string startResume = this.serviceManager.ResumeService(this.listViewService.SelectedItems[0].SubItems[0].Text);
if(startResume==null)
MessageBox.Show("操作成功,请点击获取刷新按钮刷新结果!");
else
MessageBox.Show(startResume);
break;
case "停止":
string startStop = this.serviceManager.StopService(this.listViewService.SelectedItems[0].SubItems[0].Text);
if(startStop==null)
MessageBox.Show("操作成功,请点击获取刷新按钮刷新结果!");
else
MessageBox.Show(startStop);
break;
}
}
//获取和刷新数据
private void buttonLoadRefresh_Click(object sender, System.EventArgs e)
{
if(this.textBoxHost.Text.Trim().Length>0)
{
if(this.textBoxHost.Text.Trim()==".")
{
this.serviceManager = new Win32ServiceManager();
}
else
{
if(Win32ServiceManager.RemoteConnectValidate(this.textBoxHost.Text.Trim(),this.textBoxName.Text.Trim(),this.textBoxPassword.Text.Trim()))
{
this.serviceManager = new Win32ServiceManager(this.textBoxHost.Text.Trim(),this.textBoxName.Text.Trim(),this.textBoxPassword.Text.Trim());
}
else
{
MessageBox.Show("连接到远程计算机验证错误.");
return;
}
}
string [,] services = serviceManager.GetServiceList();
this.listViewService.BeginUpdate();
this.listViewService.Items.Clear();
for(int i=0;i<services.GetLength(0);i++)
{
ListViewItem item = new ListViewItem(new string[]{services[i,0],services[i,1],services[i,2],services[i,3]});
this.listViewService.Items.Add(item);
}
this.listViewService.EndUpdate();
}
else
MessageBox.Show("请输入计算机名或IP地址");
}
}
}
说明,其实一个服务的属性和方法除了上面这几个还有很多,我们可以通过实例化ManagementClass类,使用它的Properties属性和Methods属性列出所有的属性和方法。上面的Win32ServiceManager中生成的每个服务实例都是ManagementObejct类型的,其实还有一种强类型的类,可以通过编程和工具来生成。
总结,通过引用System.Management命名空间,上面简单的实现了通过访问/root/cimv2:Win32_Service名称空间对服务进行显示和操作。此外,我们还可以通过访问其他名称空间来访问计算机的一些硬件信息,软件信息以及网络等,有兴趣的读者可以研究一下。

相关文章:

百度WordPress结构化数据插件上线

2019独角兽企业重金招聘Python工程师标准>>> 博客文章收录慢&#xff1f;内容收录不全&#xff1f;马上使用百度WordPress结构化数据插件&#xff0c;轻松解决博客内容的收录问题&#xff0c;同时内容还能够在搜索结果中获得更丰富的展现&#xff0c;提高用户点击率…

MailMail、RegeX等程序的云端版

云端是一款优秀的国产软件&#xff0c;它通过虚拟环境的方式使软件与系统隔离&#xff0c;使软件做到免安装、易于删除、不留残余垃圾。 &#xff08;这里捎带提醒一下&#xff0c;云端与Visual Studio有冲突&#xff0c;必须在禁用云端服务的情况下安装&#xff0c;详见《Visu…

java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题

2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一、静态成员变量&#xff08;Static&#xff09; * 1、静态成员变量为类变量&#xff0c;所有对象共享同一内存空间 * 2、静态成员变量的声明和定义仅在首次加载类时执行一次 * 3、首次加载类…

什么?我要对AI礼貌?人机交互面临的道德漏洞

作者 | 库珀来源 | 数据实战派头图 | 付费下载于 IC Photo如果你在一条道路上行驶&#xff0c;突然前面拐弯处出现一辆无人驾驶汽车&#xff0c;你会继续坚持你的道路优先权&#xff0c;还是让位使它先过去&#xff1f;目前&#xff0c;我们大多数人在涉及其他人的情况下能表现…

C#多线程共享数据

在多线程编程中,我们经常要使用数据共享.C#中是如何实现的呢?很简单,只要把你要共享的数据设置成静态的就可以了.关键字static .如下: static Queue q1new Queue(); static int b0; 在这里我定义了一个整形变量b和队列q1. 接下去就可以创建多线程代码了.如下: MyThread m…

异常-----Java compiler level does not match解决方法

假如你现在还在为自己的技术担忧&#xff0c;假如你现在想提升自己的工资&#xff0c;假如你想在职场上获得更多的话语权&#xff0c;假如你想顺利的度过35岁这个魔咒&#xff0c;假如你想体验BAT的工作环境&#xff0c;那么现在请我们一起开启提升技术之旅吧&#xff0c;详情请…

求几亿个数中不重复元素的个数

题目&#xff1a; 有2.5亿个无符号整数&#xff08;但在文件里面&#xff09;&#xff0c;要求找出这2.5亿个数字里面&#xff0c;不重复的数字的个数&#xff08;那些只出现一次的数字的数目&#xff09;&#xff1b;另外&#xff0c;可用的内存限定为600M&#xff1b;要求算法…

进一步提升用户信息安全保护意识 小米安全与隐私宣传月完满落幕

6月29日&#xff0c;第二届小米安全与隐私宣传月活动完美落幕。活动通过多形式、多层次、全方位展示了小米在信息安全与用户隐私保护方面的实践和成就&#xff0c;进一步提升小米全体员工保护消费者个人信息的安全意识&#xff0c;为小米全线产品的安全防护水平奠定基础。 闭幕…

已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法&#xff0c;找出a跟b中数据的大者。答案&#xff1a; int max(int a,int b){return (ababs(a-b))/2;}类似的 请定义一个宏&#xff0c;比较两个数a、b的大小&#xff0c;不能使用大于、小于、if语句 答案&#xff1…

flume源码学习8-hdfs sink的具体写入流程

上一篇说了HDFSEventSink的实现&#xff0c;这里根据hdfs sink的配置和调用分析来看下sink中整个hdfs数据写入的过程&#xff1a; 线上hdfs sink的几个重要设置 12345678hdfs.path hdfs://xxxxx/%{logtypename}/%Y%m%d/%H&#xff1a; hdfs.rollInterval 60 hdfs.rollSize 0…

详解zabbix中文版安装部署

一、zabbix简介&#xff08;摘自百度百科&#xff09;zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供柔软的通知机制以让系统管理员快速定位/解决存在…

赠书 | 图解机器学习算法,看这文就够了!

机器学习指的是计算机根据给定的问题、课题或环境进行学习&#xff0c;并利用学习结果解决问题或课题等的一整套机制&#xff08;图 1-1&#xff09;。 图 1-1 分类的示意图与机器学习共同成为热门话题的还有人工智能和深度学习。这里梳理一下它们之间的关系&#xff08;图 1-…

C#获得文件版本信息及只读文件的删除

获取文件的版本信息: FileVersionInfo myFileVersionInfo1 FileVersionInfo.GetVersionInfo("D://TEST.DLL"); textBox1.Text"版本号: " myFileVersionInfo1.FileVersion; 更改文件属性&#xff0c;删除只读文件&#xff1a; 下例欲将E:/test.txt文件…

组策略 从入门到精通(二) 如何区别跨越WAN网的计算机对组策略的套用

如果客户机与DC中间跨越了网络&#xff0c;造成传输速率慢的情况&#xff0c;我们希望通过策略中的一些元素&#xff0c;达成对这些计算机的另类处理。但我们并不知道这些计算机哪些与我们DC之间属于低速连接&#xff0c;哪些属于高速连接&#xff0c;那么我们要如何通过组策略…

插入记录时单引号的处理

由于Content, Title中可能包含单引号&#xff0c;直接使用sql的insert命令会报错&#xff0c;对此有两种处理方法&#xff0c;一种将单引号替换成两个单引号&#xff0c;第2种方法是使用存储过程。 表myBBS的格式定义如下&#xff1a; CREATE TABLE [dbo].[myBBS] ( [ID] [bi…

仅用 480 块 GPU 跑出万亿参数!全球首个“低碳版”巨模型 M6 来了

继今年 3 月阿里达摩院发布国内首个千亿参数多模态大模型 M6&#xff08;MultiModality-to-MultiModality MultitaskMega-transformer&#xff0c;以下简称 M6&#xff09; 之后&#xff0c;6 月 25 日&#xff0c;达摩院宣布对 M6 进行全新升级&#xff0c;带来“低碳版”巨模…

怎样将jpg转换成pdf软件

为什么80%的码农都做不了架构师&#xff1f;>>> 怎样将jpg转换成pdf软件 序言&#xff1a; 企业或个人通常会遇到设备终端软件的兼容性和支持性问题&#xff0c;比如&#xff0c;JPG转PDF文本&#xff0c;这给等于给用户设置了一个门槛&#xff0c;遇到需要将JPG转换…

二叉树的层次遍历 II

给出一棵二叉树&#xff0c;返回其节点值从底向上的层次序遍历&#xff08;按从叶节点所在层到根节点所在的层遍历&#xff0c;然后逐层从左往右遍历&#xff09; 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3/ \9 20/ \15 7 按照从下往上的层次遍历为&#xff1a; [[15,7],[…

jquery autocomplete实现solr查询字段自动填充并执行查询

2019独角兽企业重金招聘Python工程师标准>>> 页面引入三个JS&#xff1a; <script type"text/javascript" src"js/jquery-1.7.2.js"></script> <script type"text/javascript" src"js/jquery-ui.js">&l…

C#使用CDO发送邮件

可以引用的COM组件列表&#xff0c;发现里面有一个名为Microsoft CDO For Exchange 2000 Library的COM组件&#xff0c;就是这个&#xff0c;我们可以用它来连接SMTP Server&#xff0c;使用用户名/密码验证发送邮件。 下面是实现的一个例子&#xff1a; Smtp Server使用的Smtp…

干货 | 当 YOLOv5 遇见 OpenVINO,实现自动检测佩戴口罩

YOLOv5网络YOLOv5代码链接&#xff1a;https://github.com/ultralytics/yolov5YOLOv5 于2020年6月横空出世&#xff01;一经推出&#xff0c;便得到CV圈的瞩目&#xff0c;目前在各大目标检测竞赛、落地实战项目中得到广泛应用。 YOLOv5在COCO上的性能表现&#xff1a;YOLOv5一…

Ubuntu 16.04安装双显卡驱动方法收集

说明&#xff1a;不一定有效&#xff0c;要不断尝试。 http://www.linuxwang.com/html/2150.html http://blog.csdn.net/feishicheng/article/details/70662094>如有问题&#xff0c;请联系我&#xff1a;easonjim#163.com&#xff0c;或者下方发表评论。<

C#中的类型转换

C# 出来也有些日子了&#xff0c;最近由于编程的需要&#xff0c;对 C# 的类型转换做了一些研究&#xff0c;其内容涉及 C# 的装箱/拆箱/别名、数值类型间相互转换、字符的 ASCII 码和 Unicode 码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值…

解构 StyleCLIP:文本驱动、按需设计,媲美人类 P 图师

来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09;作者 | 神经三羊StyleCLIP 是一种新型「P 图法」&#xff0c;它结合了 StyleGAN 和 CLIP&#xff0c;可以仅依据文本描述&#xff0c;对图像进行修改和处理。提起 StyleGAN 大家都不陌生。这个由 NVIDIA 发布的新型生成…

nexus 4 下 DualBootInstallation 安装 ubuntu touch

最近折腾ubuntu for phone ubuntu也算是雷声大雨点小&#xff0c;从edge手机开始&#xff0c;到说兼容一大部分谷歌机&#xff0c;到现在缩水说只适配nexus 4 节操掉了一地啊&#xff0c;对付这种情况&#xff0c;ubuntu touch也就可以只装着玩玩了&#xff0c;还好ubuntu 官方…

我的家庭私有云计划-13

嗯&#xff0c;昨天算由感而发啊&#xff0c;大家看看就好了。 嗯&#xff0c;接着说咱们的云。 先说啊&#xff0c;我没打算在这个领域里面完全自研&#xff0c;我还没那么疯&#xff0c;这个呢属于一体化解决方案&#xff0c;我认为还是社会分工合作的结果&#xff0c;不强调…

C语言return函数

return函数 说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍&#xff0c;都使用了void main( )这一形式 &#xff0c;其实这是错误的。 C/C 中从来没有定义过void main( ) 。C 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着&#xff1a; The defi…

怎样写出一个较好的高速排序程序

写出一个较好的高速排序程序 高速排序是经常使用的排序算法之中的一个&#xff0c;但要想写出一个又快又准的使用程序&#xff0c;就不是那么简单了须要注意的事项 首先要写正确。通常使用递归实现。其递归相当于二叉树展开&#xff0c;因此假设要用迭代实现的话须要使用一个队…

写代码时发现......还得是 SpringBoot !一篇拿下

关注了很多技术类公众号的读者肯定有这样一个感受&#xff0c;SpringBoot相关的文章铺天盖地&#xff0c;并且SpringBoot相关的文章阅读量、收藏量都很高&#xff0c;这也从侧面反映了SpringBoot技术的火爆。一切都在证明&#xff0c;SpringBoot已经成为了Java程序员必备的技能…

Python的 if .else.elif语句详解

If 语句 是用来判断的 Python 编程中 if 语句用于控制程序执行 用来检测一个条件&#xff1a;如果条件为 &#xff08;真&#xff09;true&#xff0c;就会运行这个语法块&#xff0c;如果为Fales 就跳过不执行。 elif是依附于if存在的&#xff0c;两者之间的运算逻辑相同&…