在企業級網路環境中,系統管理員常面臨管理數百台電腦的挑戰。傳統遠端控制軟體通常需要在受控端安裝客戶端程式,這不僅部署繁瑣,且一旦使用者關閉客戶端,管理功能即失效。Windows Management Instrumentation (WMI) 提供了更優雅的解決方案:利用 Windows 內建的管理基礎設施,無需額外部署客戶端,即可對遠端電腦執行關機、重啟等管理操作。本文將詳細示範如何使用 Visual C# 開發一款基於 WMI 的遠端電腦控制工具。
在 Form1.cs 設計檢視中,從工具箱拖入以下元件並設定屬性:
| 元件類型 | 名稱 | 關鍵屬性設定 |
|---|---|---|
| Form | Form1 | Text: WMI遠端電腦控制工具 FormBorderStyle: FixedSingle MaximizeBox: False |
| Label | label1 | Text: 電腦名稱或 IP 位址: |
| Label | label2 | Text: 具備 WMI 權限的帳號: |
| Label | label3 | Text: 密碼: |
| Label | label4 | Text: 選擇控制類型: |
| TextBox | textBox1 | Text: (空白) |
| TextBox | textBox2 | Text: (空白) |
| TextBox | textBox3 | Text: (空白) PasswordChar: * |
| ComboBox | comboBox1 | Items 加入: 「重新啟動」、「遠端關機」 |
| Button | button1 | Text: 執行 FlatStyle: Flat |
配置版面如下圖所示:

圖 1:表單設計介面配置
雙擊 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
{
// 定義管理範圍 (目標電腦的 root\cimv2 命名空間)
ManagementScope scope = new ManagementScope(
"\\\\" + textBox1.Text + "\\root\\cimv2", options);
scope.Connect(); // 建立連線
// 查詢作業系統物件
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection results = searcher.Get();
// 針對每個作業系統物件執行操作
foreach (ManagementObject mo in results)
{
string[] args = { "" };
if (comboBox1.Text == "重新啟動")
{
mo.InvokeMethod("Reboot", args); // 呼叫重啟方法
MessageBox.Show("重啟指令已送出!", "成功");
}
else if (comboBox1.Text == "遠端關機")
{
mo.InvokeMethod("Shutdown", args); // 呼叫關機方法
MessageBox.Show("關機指令已送出!", "成功");
}
else
{
MessageBox.Show("請選擇正確的操作類型!", "錯誤");
}
}
}
catch (Exception ex)
{
MessageBox.Show("連線 " + textBox1.Text + " 失敗:" + ex.Message, "錯誤");
}
}
用於封裝連線認證資訊,Username 與 Password 屬性分別對應遠端電腦的管理帳號密碼。
代表 WMI 連線的管理範圍。路徑格式為 \\電腦名稱或IP\\root\\cimv2,其中 root\\cimv2 是存放作業系統、硬體等核心管理類別的標準命名空間。
WMI 中代表作業系統的類別,提供 Reboot() 與 Shutdown() 兩個關鍵方法,分別對應重啟與關機功能。
用於呼叫 WMI 物件的方法。第一個參數為方法名稱,第二個參數為物件陣列 (此處兩個方法皆不需參數,故傳入空陣列)。
執行畫面如下:

圖 2:程式執行介面
| 問題現象 | 可能原因 | 解決方法 |
|---|---|---|
| 連線失敗,錯誤 0x800706BA | RPC 服務未啟動或防火牆封鎖 | 確認目標電腦「遠端程序呼叫 (RPC)」服務啟動,並開放 TCP 135、445 連接埠 |
| 存取被拒絕 (Access Denied) | 帳號權限不足 | 確認帳號為目標電腦的 Administrators 群組成員 |
| WMI 服務未啟動 | 服務預設為手動 | 在「服務」中將「Windows Management Instrumentation」設為自動並啟動 |
掌握此核心架構後,您可以輕鬆擴展更多功能:
WMI 是 Windows 平台上最強大的管理基礎設施之一。透過 System.Management 命名空間,C# 開發者可以輕鬆建立無需客戶端部署的遠端管理工具。本文示範的關機/重啟功能只是冰山一角,WMI 涵蓋了幾乎所有系統管理層面,是每位 .NET 開發者與系統管理員必備的技能。