Windows Management Instrumentation (WMI) 提供統一介面查詢本機與遠端電腦系統資訊。無需在遠端部署客戶端程式,僅需具備管理權限帳號即可透過 RPC/DCOM 遠端查詢。本文完整示範建立 Windows Forms 專案、引用 System.Management、建立連線、執行 WQL 查詢並顯示遠端磁碟資訊的全流程。
RemoteDiskInfousing System.Management;| 控制項 | 名稱 | 關鍵屬性 |
|---|---|---|
| TextBox | txtComputer | 輸入遠端電腦名稱或 IP |
| TextBox | txtUser | 輸入具 WMI 權限的帳號 |
| TextBox | txtPassword | PasswordChar='*',輸入密碼 |
| Button | btnQuery | Text="取得硬碟資訊",FlatStyle=Flat |
| ListBox | lstResult | 顯示查詢結果 |
| Label | - | 對應三個 TextBox 提示文字 |
表單 FormBorderStyle=FixedSingle、MaximizeBox=False。
private void btnQuery_Click(object sender, EventArgs e)
{
const long MB = 1048576; // 1024*1024
// 1. 連線選項:帳號密碼
ConnectionOptions conn = new ConnectionOptions();
conn.Username = txtUser.Text;
conn.Password = txtPassword.Text;
// 可選:conn.Authority = "ntlmdomain:DOMAIN"; // 網域環境
// 2. 管理範圍:\\電腦\root\cimv2
string scopePath = @"\\" + txtComputer.Text + @"\root\cimv2";
ManagementScope scope = new ManagementScope(scopePath, conn);
try
{
scope.Connect(); // 建立連線
// 3. WQL 查詢:Win32_LogicalDisk DriveType=3 (本地固定磁碟)
ObjectQuery query = new ObjectQuery(
"SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3");
// 4. 執行查詢
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection disks = searcher.Get();
lstResult.Items.Clear();
foreach (ManagementObject disk in disks)
{
string name = disk["Name"].ToString();
long size = Convert.ToInt64(disk["Size"]);
long free = Convert.ToInt64(disk["FreeSpace"]);
long used = size - free;
lstResult.Items.Add("磁碟機: " + name);
lstResult.Items.Add(" 總容量: " + (size / MB) + " MB");
lstResult.Items.Add(" 已用: " + (used / MB) + " MB");
lstResult.Items.Add(" 可用: " + (free / MB) + " MB");
lstResult.Items.Add(""); // 空行分隔
}
}
catch (Exception ex)
{
MessageBox.Show("連線 " + txtComputer.Text + " 失敗: " + ex.Message, "錯誤");
}
}
| 類別 | 用途 |
|---|---|
ConnectionOptions | 封裝認證資訊(帳號、密碼、授權、加密等) |
ManagementScope | 定義 WMI 命名空間路徑(如 \\Host\root\cimv2) |
ObjectQuery | WQL 查詢語句(SQL-like 語法) |
ManagementObjectSearcher | 綁定範圍與查詢,執行 Get() 取得結果集合 |
ManagementObject | 單一 WMI 實例,索引器存取屬性值 |
修改 WQL 即可查詢其他資訊:
SELECT Name, MaxClockSpeed, NumberOfCores FROM Win32_ProcessorSELECT Capacity, Speed FROM Win32_PhysicalMemorySELECT Name, MACAddress, Speed FROM Win32_NetworkAdapter WHERE NetEnabled = TrueSELECT Caption, Version, BuildNumber FROM Win32_OperatingSystemSELECT Name, State, StartMode FROM Win32_ServiceManagementObjectSearcher.Get() 為同步阻塞。大量查詢可用 GetAsync() 搭配 ObjectReady 事件。亦可訂閱 WMI 內建事件(如 __InstanceCreationEvent 監控程式啟動、磁碟插入等)。
WMI 是 Windows 系統管理自動化的核心基礎設施。C# System.Management 命名空間提供優雅的物件導向封裝,讓開發者以極簡程式碼實現跨機器硬體/軟體資產掃描、監控與管理。掌握 WQL 語法與權限設定,即可構建企業級資產管理系統。