首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 使用 WMI 開發網路管理應用程式

     編輯:關於C語言

什麼是 WMI?

WMI (Windows Management Instrumentation) 是微軟實作的 WBEM (Web-Based Enterprise Management) 標準,提供統一介面查詢與管理系統硬體、軟體、網路設定等資源。Windows 2000 內建,NT 4.0 需另裝核心元件。

核心服務程式:WinMgmt.exe(位於 System32\Wbem),透過「組件服務」或「服務」管理啟停與權限。

.NET 操作 WMI 核心類別(命名空間 System.Management)

類別用途
ConnectionOptions連線認證參數(使用者、密碼、授權、地區)
ManagementScope代表連線範圍(機器 + 命名空間,如 \\Server\root\cimv2)
ObjectQuery / SelectQueryWQL 查詢字串封裝(類 SQL 語法)
ManagementObjectSearcher執行查詢,回傳 ManagementObjectCollection
ManagementObjectCollection查詢結果集合,可迭代
ManagementObject單一管理物件,可讀取屬性、呼叫方法、異動資料

建立遠端連線兩種方式

方式一:建構函式直接連線(可能拋出例外)

var options = new ConnectionOptions
{
    Username = "domain\\user",
    Password = "password",
    Authority = "ntlmdomain:DOMAIN" // 選填
};
var scope = new ManagementScope(@"\\RemotePC\root\cimv2", options);
// 隱含呼叫 Connect()

方式二:分步連線(可捕捉連線錯誤)

var scope = new ManagementScope(@"\\RemotePC\root\cimv2");
scope.Options = options;
scope.Connect(); // 明確連線,可 try-catch

查詢與操作範例:列出所有邏輯磁碟

var query = new SelectQuery("SELECT * FROM Win32_LogicalDisk");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach (ManagementObject disk in searcher.Get())
    {
        Console.WriteLine($"磁碟:{disk["DeviceID"]}");
        Console.WriteLine($"  檔案系統:{disk["FileSystem"]}");
        Console.WriteLine($"  總大小:{Convert.ToInt64(disk["Size"]) / 1024 / 1024 / 1024} GB");
        Console.WriteLine($"  可用空間:{Convert.ToInt64(disk["FreeSpace"]) / 1024 / 1024 / 1024} GB");
    }
}

常用 WQL 查詢範例

  • 處理序:SELECT * FROM Win32_Process
  • 網路介面卡:SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE
  • 服務:SELECT * FROM Win32_Service WHERE State = 'Running'
  • BIOS:SELECT * FROM Win32_BIOS

呼叫方法範例:建立處理序(遠端啟動 Notepad)

var processClass = new ManagementClass(scope, new ManagementPath("Win32_Process"), null);
var inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = "notepad.exe";
var outParams = processClass.InvokeMethod("Create", inParams, null);
Console.WriteLine($"Process ID:{outParams["ProcessId"]},回傳碼:{outParams["ReturnValue"]}");

權限與安全性

  • 遠端連線需目標機器開啟 WMI 服務、防火牆開放 135、445 及 DCOM 動態埠。
  • 本機管理員預設擁有完整權限;可透過「電腦管理 → WMI 控制 → 安全性」設定特定使用者權限(啟用帳戶、遠端啟用、執行方法等)。
  • 建議使用最小權限原則,避免在程式碼中硬編碼密碼,改用 Windows 整合驗證或安全儲存。

效能與最佳實務

  1. 查詢時指定具體屬性(SELECT Name, Size FROM ...),避免 SELECT * 造成網路與序列化負擔。
  2. 善用 EnumerationOptions 設定 ReturnImmediately、BlockSize 進行分頁/非同步列舉。
  3. ManagementObject 實作 IDisposable,請用 using 確保釋放 COM 資源。
  4. 大量查詢考慮快取 ManagementScope 連線物件,減少重複握手。

結語

WMI 是 Windows 系統管理的瑞士刀,System.Management 讓 C# 開發者能以強型別、物件導向方式存取豐富的系統資訊。掌握連線、查詢、呼叫方法三大核心流程,即可開發出強大的網路資產管理、監控與自動化部署工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved