首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> C#/CSHARP教程
使用C#控制远程计算机的服务-.NET教程,C#语言
作者:网友供稿 点击:52
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
使用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名称空间对服务进行显示和操作。此外,我们还可以通过访问其他名称空间来访问计算机的一些硬件信息,软件信息以及网络等,有兴趣的读者可以研究一下。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用C#编写Windows Forms应用程序(转)-.NET教程,Windows开发
·C#学习杂记-.NET教程,C#语言
·将文本格式的文章转换为html/xml格式文本的功能封装到Javabean-JSP教程,Java技巧及代码
·用java小程序applet实现无限级树结构-JSP教程,Java技巧及代码
·《.net编程先锋C#》第一章 C#简介-.NET教程,C#语言
·企业人事信息管理系统1.0-ASP教程,数据库相关
·《.net编程先锋C#》第三章 第一个C#应用程序-.NET教程,C#语言
·《.net编程先锋C#》第二章 理论基础-公用语言 运行环境-.NET教程,C#语言
·Windows应用程序调试必备的--符号文件(Symbols)-.NET教程,评论及其它
·c#反编译微软msdn2003的帮助文档,并将反编译结果保存到一个sqlserver数据库中
最新文章
·vista的新特性:懒人的安全感_windows vista
·photoshop为情侣照片打造韩式梦幻相框_photoshop教程
·专访seobbs站长乐思蜀_站长访谈
·嘟嘟网络陈艺光:诚信是一种信仰_站长访谈
·俺自己黄修源:只问耕耘,不问收获_站长访谈
·李向华:如何提高论坛用户粘性_站长访谈
·给windows vista系统网络和共享中心“换脸”_windows vista
·胡宪东谈搜索优化的实战_站长心得
·网站快速成功的九个步骤_站长心得
·google pr数字背后的含意_google推广
相关主题
  • 使用C#控制远程计算机的服务-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭