使用WMI来连接远端计算机

1. wmi连接前提

利用wmi来连接远端计算机首先要具有远端计算机管理员的用户名和密码。如果计算机在域中的话,要有域管理员用户名和密码,或者是把域帐户加入本机管理员组中也可以。

2. 相关类的用法--- ConnectionOptions和ManagementScope

ConnectionOptions用于设置连接选项,比如设置所连接机器的域,用户名,密码等。ManagementScope用于连接的实际操作。

   1:  using System;

   2:  using System.Collections.Generic;

   3:  using System.Text;

   4:  using System.Management;

   5:   

   6:  namespace TJVictor.WMI

   7:  {

   8:      public class WMIBaseClass

   9:      {

  10:          #region Property

  11:          private ConnectionOptions connection;

  12:   

  13:          private ManagementScope scope;

  14:          public ManagementScope Scope

  15:          {

  16:              get { return scope; }

  17:              set { scope = value; }

  18:          }

  19:   

  20:          private string domain;

  21:          public string Domain

  22:          {

  23:              get { return domain; }

  24:              set { domain = value; }

  25:          }

  26:   

  27:          private string ip;

  28:          public string Ip

  29:          {

  30:              get { return ip; }

  31:              set { ip = value; }

  32:          }

  33:   

  34:          private string user;

  35:          public string User

  36:          {

  37:              get { return user; }

  38:              set { user = value; }

  39:          }

  40:   

  41:          private string password;

  42:          public string Password

  43:          {

  44:              get { return password; }

  45:              set { password = value; }

  46:          }

  47:   

  48:          private string nameSpace;

  49:          public string NameSpace

  50:          {

  51:              get { return nameSpace; }

  52:              set { nameSpace = value; }

  53:          }

  54:          #endregion

  55:   

  56:          #region Construction

  57:          public WMIBaseClass()

  58:          {

  59:              this.domain = string.Empty;

  60:              this.ip = string.Empty;

  61:              this.user = string.Empty;

  62:              this.password = string.Empty;

  63:              this.nameSpace = "root//cimv2";

  64:          }

  65:   

  66:          public WMIBaseClass(string ip, string user, string password)

  67:          {

  68:              this.domain = string.Empty;

  69:              this.ip = ip;

  70:              this.user = user;

  71:              this.password = password;

  72:              this.nameSpace = "root//cimv2";

  73:          }

  74:   

  75:          public WMIBaseClass(string domain, string ip, string user, string password)

  76:          {

  77:              this.domain = domain;

  78:              this.ip = ip;

  79:              this.user = user;

  80:              this.password = password;

  81:              this.nameSpace = "root//cimv2";

  82:          }

  83:   

  84:          public WMIBaseClass(string domain, string ip, string user, string password, string nameSpace)

  85:          {

  86:              this.domain = domain;

  87:              this.ip = ip;

  88:              this.user = user;

  89:              this.password = password;

  90:              this.nameSpace = nameSpace;

  91:          }

  92:          #endregion

  93:   

  94:          #region protected function

  95:          protected virtual void Connection()

  96:          {

  97:              this.scope = Cache.CacheClass.Get(this.ip) as ManagementScope;

  98:              if (this.scope == null)

  99:              {

 100:                  connection = new ConnectionOptions();

 101:                  if (!domain.Equals(string.Empty))

 102:                      connection.Authority = "ntlmdomain:" + this.domain;

 103:                  if (!user.Equals(string.Empty))

 104:                      connection.Username = this.user;

 105:                  if (!password.Equals(string.Empty))

 106:                      connection.Password = this.password;

 107:                  string temp = string.Empty;

 108:                  if (ip.Equals(string.Empty))

 109:                      temp = "////" + "." + "//" + this.nameSpace;////" + this.ip + "//" + this.nameSpace;

 110:                  else

 111:                      temp = "

113:                  scope = new ManagementScope(temp, connection);

115:                  if (!scope.IsConnected)

 116:                      scope.Connect();

118:                  Cache.CacheClass.Insert(this.ip, scope);

 119:              }

 120:              else

 121:              {

 122:                  if (!scope.IsConnected)

 123:                      scope.Connect();

 124:              }

 125:          }

 126:   

 127:          protected virtual void DisConnection(string key)

 128:          {

 129:              Cache.CacheClass.Remove(key);

 130:          }

 131:   

 132:          protected virtual ManagementObjectCollection GetSelectQueryCollection(string wqlSelect, string condition)

 133:          {

 134:              SelectQuery query = new SelectQuery(string.Format(wqlSelect, condition));

 135:              ManagementObjectSearcher mos = new ManagementObjectSearcher(scope, query);

 136:              return mos.Get();

 137:          }

 138:   

 139:          protected virtual ManagementObjectSearcher GetObjectSearcher(string wqlSelect, string condition)

 140:          {

 141:              SelectQuery query = new SelectQuery(string.Format(wqlSelect, condition));

 142:              return new ManagementObjectSearcher(scope, query);

 143:          }

 144:          #endregion

 145:      }

 146:  }





3. 代码说明



由于连接远端机器是所有wmi操作的第一步,所以我们把连接wmi作为一个基类,以后所有对wmi操作的类都继承这个类。



其中Connection()函数就是建立远端连接。其实很简单,如果只要把域、用户名、密码、IP、wmi命名空间等属性设置完成,就可以利用wmi提供的scope.Connect();来尝试连接远端机器。



Wmi中没有释放连接的函数。也就是说,当这个类被GC回收后,远端连接也就自动被释放了,否则与远端机器一直都处于连接状态。

 

你可能感兴趣的:(计算机)