天天看點

WMI在網絡程式設計中的應用(1)

C#網絡程式設計
       之十一——WMI在網絡程式設計中的應用(1)
-----------------------------------------------------------
  WMI是Windows Management Instrumentation的簡稱,即“視窗管理規範”。早在W
indows NT4.0時就已經開始支援WMI了,但WMI核心元件并沒有随着NT4.0一起釋出,如果
要在NT4.0下支援WMI,就需要安裝WMI的核心元件,你可以在VS.NET企業建構版中的第五
張盤中的“WMI”目錄中找到它。在NT4.0下安裝WMI核心元件,必須保證NT 4.0版本為S
ervice Pack 4.0或者更新的版本。如果您的機器使用的系統是Windows 2000或以後的版
本,那麼就沒有這麼麻煩了,因為WMI是預設安裝的。
  WMI的功能是十分強大的,通過WMI可以實作很多原來被認為很困難的工作,并且它
也是.Net FrameWork SDK的很好的補充,尤其在現在,.Net FrameWork SDK功能還并不
十分完備,有效的利用WMI的确可以簡化很多本來很困難的問題。
  利用WMI不僅可以解決本地機的很多問題,而且還可以用來編寫網絡應用程式,比如
通過WMI擷取遠端計算機的各種資料資訊、控制遠端計算機的各種行為,而這就像操作本
地機一樣友善。而這隻有一個前提條件,那就是必須知道遠端計算機的超級使用者和對應
的密碼。
  一、簡介C#中操作WMI使用的類庫
  .Net FrameWork SDK對WMI提供了全面的支援,.Net FrameWork SDK為C#能夠操作W
MI提供了一個專門的命名空間System.Management。在命名空間System.Management中提
供了大量用以處理和WMI相關的類、接口和枚舉。
  命名空間System.Management中的成員是很複雜的,由于篇幅所限完全介紹這些成員
是不可能的,也是沒有要的。根據我的經驗,認為要了解以及掌握在C#中使用WMI,下面
六個類應該是學習的重點,分别是ConnectionOptions、ManagementScope、ObjectQuer
y、ManagementObjectSearcher、ManagementObject-Collection和ManagementObject。
下面就簡單介紹一下六個類。
  1.ConnectionOptions類
  ConnectionOptions類主要的功能是為建立的WMI連接配接提供所需的所有設定。在利用
WMI對遠端計算機進行操作的時候,首先要進行WMI連接配接,WMI連接配接主要是使用的是Manag
ementScope類,成功完成WMI連接配接就要提供遠端計算機WMI使用者名和密碼。ConnectionOp
tions類可以通過其屬性來提供這些資訊。下表是ConnectionOptions類的一些主要屬性
及其簡單的說明:
   
屬性 說明
Authority 擷取或設定将用于驗證指定使用者的權利
Locale 擷取或設定将用于連接配接操作的區域設定
Password 提供用于WMI連接配接操作的密碼
Username 提供用于WMI連接配接操作的使用者名
   2.ManagementScope類
  通過ManagementScope類能夠建立和遠端計算機(或者本地計算機)的WMI連接配接,表
示管理可操作範圍。建立WMI連接配接可以通過二種方法:
  (1)利用構造函數,當使用下面構造函數初始化ManagementScope類執行個體,同時也就
建立了WMI連接配接,具體如下:
public ManagementScope(
 string path ,
 ConnectionOptions options
) ;
  其中,參數path表示ManagementScope的伺服器和命名空間,options包含有關連接配接
的選項的ConnectionOptions。
  使用構造函數是有風險的,因為如果不能根據提供的選項建立WMI連接配接,程式會抛出
異常。下列代碼是利用此構造函數建構建立ManagementScope執行個體,并建立于遠端計算機
majinhu的WMI連接配接:
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "WMI使用者名";
Conn.Password = "此使用者名對應密碼";
System.Management.ManagementScope Ms = new ManagementScope("majinhu//roo
t//cimv2", Conn) ;
  
(2)利用ManagementScope中提供的Connect方法。ManagementScope中的成員是非常少的
,最常用的方法和屬性各一個:常用屬性是Options,主要為WMI建立提供參數;常用方
法是Connect,通過它可以建立于遠端計算機的WMI連接配接。下列是利用Connect方法建立W
MI連接配接的具體代碼:
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "WMI使用者名";
Conn.Password = "此使用者名對應密碼";
System.Management.ManagementScope Ms = new ManagementScope("majinhu//roo
t//cimv2" ) ;
Ms.Options = Conn;
Ms.Connect();  
  3.ObjectQuery類
  ObjectQuery類或其派生類用于在Management ObjectSearcher中指定查詢。程式中
一般采用查詢字元串來構造ObjectQuery執行個體。其中的查詢字元串是一種類似SQL語言的
WQL語言。下面的ObjectQuery類構造函數中最常見的一種,具體文法如下:
public ObjectQuery(string query);
  其中,參數query代表查詢的字元串。
  4.ManagementObjectSearcher類
  ManagementObjectSearcher主要是根據指定的查詢檢索WMI對象的集合。Managemen
tObjectSearcher組成成員也非常簡單,其Get方法是非常重要的,Management ObjectS
earcher通過Get方法進行WMI查詢,并把得到的結果集合。Get方法的傳回值是一個Mana
gementObjectCollection執行個體,它包含比對指定查詢的對象。下表是其Management Obj
ectSearcher類的常用屬性及其說明:
屬性 說明
Options 有關如何搜尋對象的選項
Query 在搜尋器中調用的查詢
Scope 在其中查找對象的範圍
  5.ManagementObjectCollection類
  ManagementObjectCollection類非常簡單,它主要表示 WMI 執行個體的不同集合其中包
括命名空間、範圍和查詢觀察程式等。建立ManagementObjectCollection類沒有構造函
數。
  6.ManagementObject類
  ManagementObject類為單個管理對象或類。通過ManagementObject中的方法可以調
用ManagementObject對應的對象,進而執行相應的操作。ManagementObject類是一個内
容豐富的類,下面是其常用屬性和方法的清單:
屬性或方法 說明
ClassPath 對象的類的路徑
Options 檢索對象時要使用的其他資訊
Path 對象的WMI路徑
Scope 此對象在其中駐留的範圍
Clone 建立對象的一個副本
CopyTo 将對象複制到另一個位置
Delete 删除對象
Get 綁定到管理對象
GetRelated 擷取與該對象(聯系對象)相關的對象的集合
GetRelationships 擷取該對象的關聯的集合
InvokeMethod 調用對應的對象方法
Put 送出對對象所做的更改
 二、WMI網絡應用之一——擷取遠端計算機的資訊
  如果不使用WMI,想要擷取遠端計算機的系統資料,最常用的方法就是在遠端計算機
上運作一個用戶端程式,本地機通過和這個用戶端程式來擷取遠端計算機的系統資料。
這種實作方法無論是程式設計還是後面的程式分發都是及其困難的。而使用WMI,一切就
顯得非常簡單。下面介紹的這個示例,其功能是利用WMI擷取遠端計算機硬碟資料。各位
隻需對這個程式稍加修改,就可以獲得遠端計算機的其他資料。下面是具體的實作步驟
:
  1.首先啟動Visual Studio .Net,依次選擇“檔案”、“建立”、“項目”菜單後
,在彈出“建立項目”對話框中将“項目類型”設定為“Visual C#項目”,将“模闆”
設定為“Windows應用程式”,在“名稱”文本框中輸入“獲得遠端計算機硬碟資訊”,
在“位置”的文本框中輸入“E:/VS.NET項目”,然後單擊“确定”按鈕,這樣項目就建
立好了。
  2.由于Visual Studio .Net預設的編譯環境中并沒有包括命名空間System.Managem
ent的容器檔案System.Management.dll,是以首先要在項目檔案中引入此DLL檔案。首先
選中“解決方案資料總管”中的“引用”,然後單擊滑鼠右鍵,在彈出的菜單中,選
擇“添加引用”,在彈出的“添加引用”對話框中,選擇“.Net”頁面,在“元件名稱
”欄中選擇“System.Managemen”後,單擊“選擇”按鈕。此時在“標明的元件”欄中
就加入了“System.Managemen”,然後單擊“确定”按鈕,現在Visual Studio .Net集
成開發環境中就引入命名空間System.Managemen。
  3.在“解決方案資料總管”視窗中,輕按兩下Form1.cs檔案,進入Form1.cs檔案的編
輯界面。
  4.在Form1.cs檔案的開頭,在系統預設的導入命名空間後面添加:
  using System.Management;
  用來引用WMI操作類位于的命名空間。
  5.把Visual Studio .Net目前視窗切換到“Form1.cs(設計)”視窗,設計窗體。

  6.按照下表調整各元件屬性對應的值:
元件類型 元件名稱 屬性 設定結果
Form Form1 Text 擷取遠端計算機硬碟資訊
    FormBorderStyle FixedSingle
    MaximizeBox False
TextBox textBox3 PasswordChar *
Button button1 FlatStyle Flat
  7.把Visual Studio .Net的目前視窗切換到Form1.cs檔案的編輯視窗,并用下列代
碼替換Form1.cs中的button1的Click事件對應的處理代碼。下列代碼的作用是對遠端計
算機進行WMI查詢,提取查詢得到資料并顯示結果:
private void button1_Click(object sender, System.EventArgs e)
{
long mb = 1048576; //1024x1024
//設定生成的WMI所需的所有設定
System.Management.ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = textBox2.Text; //使用者名
Conn.Password = textBox3.Text; //密碼
  //設定用于執行WMI操作的範圍
  System.Management.ManagementScope Ms = new ManagementScope( "" +   
textBox1.Text + "//root//cimv2", Conn);
try
{
  //連接配接到實際操作的WMI範圍
  Ms.Connect();
  //設定通過WMI要查詢的内容
  ObjectQuery Query = new ObjectQuery("select FreeSpace ,Size ,Name from W
in32_LogicalDisk where DriveType=3");
  //WQL語句,設定的WMI查詢内容和WMI的操作範圍,檢索WMI對象集合
  ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Ms, Que
ry);
  //異步調用WMI查詢
ManagementObjectCollection ReturnCollection = Searcher.Get();
double free = 0;
double use = 0;
double total = 0;
listBox1.Items.Clear();
  //通過對産生的WMI的執行個體集合進行檢索,獲得硬碟資訊
foreach (ManagementObject Return in ReturnCollection)
{
listBox1.Items.Add("磁盤名稱:" + Return["Name"].ToString());
free = Convert.ToInt64(Return["FreeSpace"]) / mb; //獲得硬碟的可用空間
use = (Convert.ToInt64(Return["Size"]) - Convert.ToInt64(Return["FreeSpace"]
)) / mb;//獲得硬碟的已用空間
  //獲得硬碟的合計空間
total = Convert.ToInt64( Return["Size"]) / mb;
listBox1.Items.Add( " 總計:" + total.ToString() + "MB");
listBox1.Items.Add( "已用空間:" + use.ToString() + "MB");
listBox1.Items.Add( "可用空間:" + free.ToString() + "MB");
}
}
catch(Exception ee)
{
MessageBox.Show("連接配接" + textBox1.Text + "出錯,出錯資訊為:" + ee.Message, 
"出現錯誤!");
}
}
 8.按下快捷鍵F5運作程式。在正确輸入遠端計算機的IP位址或使用者名、超級使用者名和
密碼後,單擊“擷取硬碟資訊”按鈕,程式便會擷取的指定計算機的硬碟的資料并顯示
出來。
  怎麼樣,是否有一種做黑客的感覺?下面将介紹使用WMI完成一個更“酷”的程式—
—重新開機或關閉遠端計算機!
  三、WMI網絡應用之二——控制遠端計算機
  WMI不僅可以擷取想要的計算機資料,而且還可以用以遠端控制。遠端控制計算機不
僅是黑客們的夢想,也是大多數網絡管理者所渴望得到的,尤其在現代的網絡中,每一
個網絡管理者所面對的區域網路,都是由一個龐大的計算機群組成,如果有效的管理網絡
的每一台計算機就顯得格外重要了。目前網絡管理軟體通常的做法是在遠端計算機上運
行用戶端程式,在本地計算機上運作一個控制程式,通過這二個程式直接的通訊實作對
計算機的遠端控制。這種作法的缺點是十分明顯的,當用戶端關閉了背景程式,這種遠
程管理就無法實作了。
  其實做遠端控制軟體,WMI是一個很好的選擇,尤其是在Windows 2000、XP已經成為
了主流的作業系統,利用WMI編寫遠端控制軟體可以省略了已往遠端控制軟體最頭痛的一
個環節——分發用戶端程式。
  本節中介紹的遠端控制程式,能夠讓使用者重新開機和關閉遠端計算機。下面是C#中利
用WMI控制遠端計算機具體實作步驟:
  1.首先啟動Visual Studio .Net,依次選擇“檔案”、“建立”、“項目”菜單後
,在彈出“建立項目”對話框中将“項目類型”設定為“Visual C#項目”,将“模闆”
設定為“Windows應用程式”,在“名稱”文本框中輸入“利用WMI控制遠端計算機”,
在“位置”的文本框中輸入“E:/VS.NET項目”,然後單擊“确定”按鈕,這樣項目便建
立好了。
  2.重複“擷取遠端計算機硬碟資訊”項目中的第2至第4步。
  3.把Visual Studio .Net目前視窗切換到“Form1.cs(設計)”視窗,按照圖3進行
窗體設計:
  4.按照下表的資料調整各元件屬性對應的數值:
元件類型 元件名稱 屬性 設定結果
Form Form1 Text 利用WMI控制遠端計算機
    FormBorderStyle FixedSingle
    MaximizeBox False
TextBox textBox3 PasswordChar *
Button button1 FlatStyle Flat
ComboBox comboBox1 Items 重新啟動
遠端關機
  5.把Visual Studio .Net的目前視窗切換到Form1.cs檔案的編輯視窗,并用下列代
碼替換Form1.cs中的button1的Click事件對應的處理代碼。下列代碼的作用是對根據用
戶的選擇對遠端計算機進行進行相應的遠端控制:
private void button1_Click(object sender, System.EventArgs e)
{
  //确定WMI操作的範圍
  ConnectionOptions options = new ConnectionOptions();
options.Username = textBox2.Text; //使用者名
options.Password = textBox3.Text; //使用者密碼
try
{
ManagementScope Conn = new ManagementScope("" + textBox1.Text + "//root/
/cimv2", options);
Conn.Connect();
  //确定WMI操作的内容
ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(Conn, oq);
  //擷取WMI操作内容
ManagementObjectCollection queryCollection1 = query1.Get();
  //根據使用者選擇執行相應的遠端操作
foreach (ManagementObject mo in queryCollection1)
{
string [ ] ss= { "" };
if (comboBox1.Text == "重新啟動")
mo.InvokeMethod("Reboot", ss); //執行重新開機操作
else if (comboBox1.Text == "遠端關機")
mo.InvokeMethod("Shutdown", ss); //執行遠端關機
else
MessageBox.Show("選擇不正确的操作!", "錯誤!");
}
}
catch(Exception ee)
{
MessageBox.Show("連接配接" + textBox1.Text + "出錯,出錯資訊為:" + ee.Message )
; //報錯
}
}
  6.按下F5快捷鍵,就可以運作程式了。在程式的“計算機名稱或IP位址”文本框中
輸入要控制的遠端計算機名稱或IP位址,在“具有WMI權限的使用者名”和“密碼”文本框
中輸入具有WMI操作的帳戶和密碼,在“選擇控制類型”組合框中選擇對遠端計算機的控
制類型後,單擊“執行”按鈕,則程式就能夠對指定的遠端計算機進行相應的控制了。

  四、總結
  通過以上兩個示例,可見WMI的确是一個非常有用的東西,但由于它還比較新,國内
甚至國外還沒有完整的介紹資料,上述内容隻是帶諸位簡要的浏覽了一下WMI,其實通過
WMI完成很多功能還需要不斷的探索,希望本章的内容能夠對大家了解、掌握WMI的使用
方法有所幫助。
      

繼續閱讀