visual 如果不使用WMI,想要擷取遠端電腦的系統資料,最常用的方法就是在遠端電腦上運行一個用戶端程式,本地機通過和這個用戶端程式來擷取遠端電腦的系統資料。這種實現方法無論是程式設計還是後面的程式分發都是及其困難的。而使用WMI,一切就顯得非常簡單。下面介紹的這個樣本,其功能是利用WMI擷取遠端電腦硬碟資料。各位只需對這個程式稍加修改,就可以獲得遠端電腦的其他資料。下面是具體的實現步驟:
著作權聲明:任何獲得天極網授權的網站,轉載時請務必保留作者資訊和以下連結
天極開發ASP.NET專欄:
http://dev.yesky.com/msdn/msdnc
1. 首先啟動Visual Studio .Net,依次選擇"檔案"、"建立"、"項目"菜單後,在彈出"建立項目"對話方塊中將"項目類型"設定為"Visual C#項目",將"模板"設定為"Windows應用程式",在"名稱"文字框中輸入"獲得遠端電腦硬碟資訊",在"位置"的文字框中輸入"E:\VS.NET項目",然後單擊"確定"按鈕。這樣在"E:\VS.NET項目"目錄中就建立了一個新的檔案夾"獲得遠端電腦硬碟資訊",裡面存放的就是"獲得遠端電腦硬碟資訊"的專案檔。
2. 由於Visual Studio .Net預設的編譯環境中並沒有包括命名空間"System.Management"所位於的檔案"System.Management.dll",所以首先要在專案檔中引入此DLL檔案。具體的步驟如下:
選中【方案總管】中的【引用】,單擊滑鼠右鍵,在彈出的菜單中,選擇【添加引用】,具體如圖05所示:
圖05:添加引用
在彈出【添加引用】對話方塊中,選擇【.Net】頁面,在【組件名稱】欄中選擇【System.Managemen】後,單擊【選擇】按鈕,此時在【選定的組件】欄中就加入了【System.Managemen】,然後單擊【確定】按鈕,則在Visual Studio .Net整合式開發環境中就引入命名空間"System.Managemen"。具體如圖06所示:
圖06:添加引用
3. 在【方案總管】視窗中,雙擊Form1.cs檔案,進入Form1.cs檔案的編輯介面。
4. 在Form1.cs檔案的開頭,用下列匯入命名空間代碼替代系統預設的匯入命名空間代碼。
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Management ;
//WMI操作類位於的命名空間 5. 把Visual Studio .Net當前視窗切換到【Form1.cs(設計)】視窗,並從【工具箱】中的【Windows表單組件】中往表單中拖入下列組件,並執行相應操作:
三個TextBox組件,分別輸入遠端電腦名稱或IP地址,遠端電腦的超級使用者帳戶和口令。
一個ListBox組件,用以顯示遠端電腦硬碟資訊。
三個Label組件。
一個Button組件,名稱為button1,拖入表單後,雙擊此組件,則系統會在Form1.cs中自動產生其Click事件對應的處理代碼。
6. 按照表05中的資料調整各組件屬性對應的數值:
| 組件類型 |
組件名稱 |
屬性 |
設定結果 |
| Form |
Form1 |
Text |
擷取遠端電腦硬碟資訊 |
| Form1 |
FormBorderStyle |
FixedSingle |
| Form1 |
MaximizeBox |
False |
| Label |
label1 |
Text |
遠端電腦名或IP地址: |
| label2 |
Text |
擁有WMI許可權的使用者名稱: |
| label3 |
Text |
口令: |
| TextBox |
textBox1 |
Text |
"" |
| textBox2 |
Text |
"" |
| textBox3 |
PasswordChar |
* |
| textBox3 |
Text |
"" |
| Button |
button1 |
Text |
獲得硬碟資訊 |
| |
button1 |
FlatStyle |
Flat |
表05:【獲得遠端電腦硬碟資訊】項目表單中各組件的主要屬性設定數值表
並按照圖07中各組件的位置和排列順序調整表單中組件的位置和排列順序:
圖07:【獲得遠端電腦硬碟資訊】項目的設計介面
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 ( ) ;
//設定用於WMI串連操作的使用者名稱
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 Win32_LogicalDisk where DriveType=3" ) ;
//WQL語句,設定的WMI查詢內容和WMI的操作範圍,檢索WMI對象集合
ManagementObjectSearcher Searcher = new ManagementObjectSearcher ( Ms , Query ) ;
//非同步呼叫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地址或使用者名稱,遠端電腦超級使用者名稱和口令後,單擊【擷取硬碟資訊】按鈕,則程式會擷取的指定電腦的硬碟的資料並顯示出來,具體如圖08所示:
圖08:【獲得遠端電腦硬碟資訊】的運行介面
怎麼樣,是否有一種做駭客的感覺。下面將介紹使用WMI完成一項更"酷"的程式。通過此程式將重啟或關閉遠端電腦。