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

Visual C# 使用 WMI 查詢遠端電腦硬體資訊完整實作

     編輯:關於C#

Windows Management Instrumentation (WMI) 提供統一介面查詢本機與遠端電腦系統資訊。無需在遠端部署客戶端程式,僅需具備管理權限帳號即可透過 RPC/DCOM 遠端查詢。本文完整示範建立 Windows Forms 專案、引用 System.Management、建立連線、執行 WQL 查詢並顯示遠端磁碟資訊的全流程。

專案建立與引用設定

  1. 新增 Windows Forms 專案:RemoteDiskInfo
  2. 方案總管 → 參考 → 右鍵「加入參考」 → .NET 標籤 → 勾選 System.Management
  3. 頂端引用:using System.Management;

介面設計

控制項名稱關鍵屬性
TextBoxtxtComputer輸入遠端電腦名稱或 IP
TextBoxtxtUser輸入具 WMI 權限的帳號
TextBoxtxtPasswordPasswordChar='*',輸入密碼
ButtonbtnQueryText="取得硬碟資訊",FlatStyle=Flat
ListBoxlstResult顯示查詢結果
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)
ObjectQueryWQL 查詢語句(SQL-like 語法)
ManagementObjectSearcher綁定範圍與查詢,執行 Get() 取得結果集合
ManagementObject單一 WMI 實例,索引器存取屬性值

常見 WMI 查詢擴展

修改 WQL 即可查詢其他資訊:

  • CPU:SELECT Name, MaxClockSpeed, NumberOfCores FROM Win32_Processor
  • 記憶體:SELECT Capacity, Speed FROM Win32_PhysicalMemory
  • 網路卡:SELECT Name, MACAddress, Speed FROM Win32_NetworkAdapter WHERE NetEnabled = True
  • 作業系統:SELECT Caption, Version, BuildNumber FROM Win32_OperatingSystem
  • 服務:SELECT Name, State, StartMode FROM Win32_Service

權限與防火牆注意事項

  • 查詢帳號需為遠端電腦「Administrators」群組成員,或具備「WMI Control」→「Root/CIMV2」→「安全性」→「啟用帳號」與「遠端啟用」權限
  • 遠端電腦防火牆需開放:DCOM (TCP 135)、WMI (動態埠,建議設定固定埠)、檔案與印表機共享 (TCP 445)
  • 工作群組環境需啟用「本地安全性原則」→「網路存取:本地帳戶共用模式」→「經典」

進階:非同步查詢與事件訂閱

ManagementObjectSearcher.Get() 為同步阻塞。大量查詢可用 GetAsync() 搭配 ObjectReady 事件。亦可訂閱 WMI 內建事件(如 __InstanceCreationEvent 監控程式啟動、磁碟插入等)。

總結

WMI 是 Windows 系統管理自動化的核心基礎設施。C# System.Management 命名空間提供優雅的物件導向封裝,讓開發者以極簡程式碼實現跨機器硬體/軟體資產掃描、監控與管理。掌握 WQL 語法與權限設定,即可構建企業級資產管理系統。

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