使用C#控制远程计算机的服务(2)

时间:2006-10-12 来源: 作者: 点击:
// 停止指定的服务 public string StopService(string serviceName) { string strRst = null; ManagementObject mo = this.managementClass.CreateInstance(); mo.Path = new ManagementPath(this.strPath+".Name=\""+serviceName+"\""); try { //判断是否可以停止 if(
  
  // 停止指定的服务
     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          {
            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名称空间对服务进行显示和操作。此外,我们还可以通过访问其他名称空间来访问计算机的一些硬件信息,软件信息以及网络等,有兴趣的读者可以研究一下。
------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容