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

C# 使用 WMI 遠端查詢電腦硬體資訊完整教學

     編輯:關於C語言

前言:為什麼選擇 WMI?

Windows Management Instrumentation (WMI) 是 Windows 內建的管理基礎設施,提供統一介面查詢系統硬體、軟體、網路等資訊。對比傳統「遠端部署 Agent 程式再通訊」的架構,WMI 具有:

  • 零部署:目標機器只需開啟 WMI 服務與防火牆規則
  • 標準化:使用 WQL (SQL-like 查詢語言) 存取標準化類別 (Win32_*)
  • 遠端原生支援:ManagementScope 直接指定目標電腦名稱/IP

開發環境準備

  1. Visual Studio 建立 Windows Forms 專案
  2. 加入參考:System.Management.dll (非預設引用)
  3. 引入命名空間:using System.Management;

核心程式碼實作

1. 連線設定與認證

private ConnectionOptions BuildConnectionOptions(string username, string password)
{
    return new ConnectionOptions
    {
        Username = username,           // 目標機器具備 WMI 權限的帳號
        Password = password,           // 對應密碼
        Impersonation = ImpersonationLevel.Impersonate,
        Authentication = AuthenticationLevel.PacketPrivacy, // 加密傳輸
        EnablePrivileges = true        // 啟用特殊權限 (如遠端關機)
    };
}

2. 建立管理範圍並連線

private ManagementScope CreateScope(string targetMachine, ConnectionOptions options)
{
    // root\cimv2 是預設命名空間,包含大部分硬體/作業系統類別
    string path = $@"\\{targetMachine}\root\cimv2";
    var scope = new ManagementScope(path, options);
    scope.Connect(); // 實際建立連線,會拋出例外若失敗
    return scope;
}

3. 查詢邏輯磁碟資訊 (Win32_LogicalDisk)

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; }
}

常用 WMI 類別速查表

類別名稱用途常用屬性
Win32_ComputerSystem電腦系統整體資訊Manufacturer, Model, TotalPhysicalMemory, NumberOfProcessors
Win32_ProcessorCPU 詳細資訊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_BIOSBIOS 資訊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);
    }
}

權限與防火牆必要設定 (目標機器)

  1. 服務啟動:services.msc → Windows Management Instrumentation 設為自動/執行中
  2. 防火牆規則:啟用「Windows Management Instrumentation (WMI)」輸入規則 (TCP 135 + 動態埠)
  3. DCOM 權限:dcomcnfg → 元件服務 → 電腦 → 我的電腦 → 內容 → COM 安全性 → 啟動與啟用權限/存取權限 → 加入使用者/群組 (需「遠端啟動」、「遠端存取」)
  4. WMI 命名空間安全性:wmimgmt.msc → WMI 控制 → 安全性 → Root/CIMV2 → 安全性 → 加入帳號授予「啟用帳戶」、「遠端啟用」
  5. UAC 遠端限制 (非網域環境):登錄 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 新增 DWORD LocalAccountTokenFilterPolicy = 1

錯誤處理與除錯技巧

  • 捕捉 ManagementException (WMI 專屬) 與 UnauthorizedAccessException (權限)
  • 使用 wbemtest.exe (系統內建工具) 手動測試連線與查詢
  • 記錄完整堆疊追蹤與目標機器資訊,便於事後分析

現代替代方案

.NET Core / .NET 5+ 專案建議改用:

  • CIM / MI (Microsoft.Management.Infrastructure):跨平台、效能較佳、支援非同步
  • PowerShell Remoting (Invoke-Command):腳本化管理、內建雙跳認證
  • SSH + 系統指令 (Linux/macOS 目標):lshw, dmidecode, df -h

結語

WMI 是 Windows 系統管理的瑞士刀,掌握 System.Management 命名空間的核心類別 (ManagementScope, ObjectQuery, ManagementObjectSearcher) 與 WQL 查詢語法,即可建立強大的資產掃描、監控代理或自動化運維工具。關鍵在於正確設定目標機器的權限與防火牆,這往往比程式碼本身更具挑戰性。

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