Windows Management Instrumentation (WMI) 是 Windows 內建的管理基礎設施,提供統一介面查詢系統硬體、軟體、網路等資訊。對比傳統「遠端部署 Agent 程式再通訊」的架構,WMI 具有:
ManagementScope 直接指定目標電腦名稱/IPusing System.Management;private ConnectionOptions BuildConnectionOptions(string username, string password)
{
return new ConnectionOptions
{
Username = username, // 目標機器具備 WMI 權限的帳號
Password = password, // 對應密碼
Impersonation = ImpersonationLevel.Impersonate,
Authentication = AuthenticationLevel.PacketPrivacy, // 加密傳輸
EnablePrivileges = true // 啟用特殊權限 (如遠端關機)
};
}
private ManagementScope CreateScope(string targetMachine, ConnectionOptions options)
{
// root\cimv2 是預設命名空間,包含大部分硬體/作業系統類別
string path = $@"\\{targetMachine}\root\cimv2";
var scope = new ManagementScope(path, options);
scope.Connect(); // 實際建立連線,會拋出例外若失敗
return scope;
}
public List GetRemoteDisks(string machine, string user, string pwd)
{
var result = new List();
var options = BuildConnectionOptions(user, pwd);
var scope = CreateScope(machine, options);
// WQL 查詢:DriveType=3 代表本地固定磁碟
string wql = "SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3";
var query = new ObjectQuery(wql);
var searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject disk in searcher.Get())
{
result.Add(new DiskInfo
{
Name = disk["Name"]?.ToString(),
TotalGB = Convert.ToInt64(disk["Size"]) / 1024 / 1024 / 1024,
FreeGB = Convert.ToInt64(disk["FreeSpace"]) / 1024 / 1024 / 1024,
UsedGB = (Convert.ToInt64(disk["Size"]) - Convert.ToInt64(disk["FreeSpace"])) / 1024 / 1024 / 1024
});
}
return result;
}
public class DiskInfo
{
public string Name { get; set; }
public long TotalGB { get; set; }
public long UsedGB { get; set; }
public long FreeGB { get; set; }
}
| 類別名稱 | 用途 | 常用屬性 |
|---|---|---|
| Win32_ComputerSystem | 電腦系統整體資訊 | Manufacturer, Model, TotalPhysicalMemory, NumberOfProcessors |
| Win32_Processor | CPU 詳細資訊 | Name, NumberOfCores, NumberOfLogicalProcessors, MaxClockSpeed |
| Win32_LogicalDisk | 邏輯磁碟 (分割區) | Name, Size, FreeSpace, VolumeName, FileSystem |
| Win32_PhysicalMemory | 實體記憶體模組 | Capacity, Speed, Manufacturer, PartNumber |
| Win32_NetworkAdapterConfiguration | 網路介面卡設定 | IPAddress, MACAddress, DHCPEnabled, DNSDomain |
| Win32_OperatingSystem | 作業系統資訊 | Caption, Version, BuildNumber, LastBootUpTime |
| Win32_BIOS | BIOS 資訊 | Manufacturer, SMBIOSBIOSVersion, ReleaseDate |
public void RemoteShutdown(string machine, string user, string pwd, bool reboot = true)
{
var options = BuildConnectionOptions(user, pwd);
var scope = CreateScope(machine, options);
// Win32_OperatingSystem 提供 Win32Shutdown 方法
var query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
var searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject os in searcher.Get())
{
// Flags: 0=Logoff, 4=Forced Logoff, 1=Shutdown, 5=Forced Shutdown, 2=Reboot, 6=Forced Reboot
int flag = reboot ? 6 : 5; // 強制重啟 / 強制關機
var inParams = os.GetMethodParameters("Win32Shutdown");
inParams["Flags"] = flag;
inParams["Reserved"] = 0;
os.InvokeMethod("Win32Shutdown", inParams, null);
}
}
services.msc → Windows Management Instrumentation 設為自動/執行中dcomcnfg → 元件服務 → 電腦 → 我的電腦 → 內容 → COM 安全性 → 啟動與啟用權限/存取權限 → 加入使用者/群組 (需「遠端啟動」、「遠端存取」)wmimgmt.msc → WMI 控制 → 安全性 → Root/CIMV2 → 安全性 → 加入帳號授予「啟用帳戶」、「遠端啟用」HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 新增 DWORD LocalAccountTokenFilterPolicy = 1ManagementException (WMI 專屬) 與 UnauthorizedAccessException (權限)wbemtest.exe (系統內建工具) 手動測試連線與查詢.NET Core / .NET 5+ 專案建議改用:
lshw, dmidecode, df -hWMI 是 Windows 系統管理的瑞士刀,掌握 System.Management 命名空間的核心類別 (ManagementScope, ObjectQuery, ManagementObjectSearcher) 與 WQL 查詢語法,即可建立強大的資產掃描、監控代理或自動化運維工具。關鍵在於正確設定目標機器的權限與防火牆,這往往比程式碼本身更具挑戰性。