在 Windows 環境下,磁碟配額是系統管理員控制使用者磁碟空間使用的重要機制。透過 WMI (Windows Management Instrumentation),開發人員可以使用 C# 程式碼以程式化方式建立、修改與查詢磁碟配額設定。本文將詳細介紹如何使用 System.Management 命名空間操作 Win32_DiskQuota 類別,實作磁碟配額的自動化管理。
System.Management.dll| 類別 | 用途 |
|---|---|
| Win32_DiskQuota | 代表單一使用者在特定磁碟區上的配額設定 |
| Win32_Account | 代表使用者帳戶 (含網域/本機帳戶) |
| Win32_LogicalDisk | 代表邏輯磁碟區 (如 C:、D: 等) |
using System;
using System.Management;
namespace DiskQuotaManager
{
class Program
{
static void Main(string[] args)
{
try
{
// 1. 連接 WMI 命名空間並取得 DiskQuota 類別
ManagementClass quotaClass = new ManagementClass("Win32_DiskQuota");
// 2. 建立新的配額實例
ManagementObject quota = quotaClass.CreateInstance();
// 3. 設定配額限制 (單位:Bytes)
quota["Limit"] = 400_000_000; // 硬性限制:約 381 MB
quota["WarningLimit"] = 200_000_000; // 警告閾值:約 190 MB
// 4. 取得目標使用者帳戶物件
// 注意:Domain 應替換為實際電腦名稱或網域名稱
ManagementObject account = new ManagementObject(
"Win32_Account.Domain='YOUR_COMPUTER_NAME',Name='TargetUser'");
account.Get();
// 5. 取得目標磁碟區物件
ManagementObject disk = new ManagementObject(
"Win32_LogicalDisk.DeviceID='F:'");
disk.Get();
// 6. 關聯使用者與磁碟區
quota["QuotaVolume"] = disk;
quota["User"] = account;
// 7. 寫入 WMI 儲存庫 (提交變更)
quota.Put();
Console.WriteLine("磁碟配額設定成功!");
// 8. 驗證:列出所有現有配額項目
foreach (ManagementObject obj in quotaClass.GetInstances())
{
Console.WriteLine($"配額項目路徑: {obj.Path}");
}
}
catch (ManagementException me)
{
Console.WriteLine($"WMI 錯誤: {me.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"發生錯誤: {ex.Message}");
}
}
}
}
WMI 的 Limit 與 WarningLimit 屬性單位皆為 Bytes。常見換算:
建議使用常數或輔助方法進行換算,提升程式碼可讀性:
const long GB = 1024L * 1024 * 1024;
quota["Limit"] = 2 * GB; // 2 GB
Win32_Account 的路徑格式為:
Win32_Account.Domain='<網域或電腦名稱>',Name='<使用者名稱>'
Environment.MachineName 取得)ManagementException 處理 WMI 特有錯誤 (如權限不足、類別不存在)Win32_Volume 的 QuotasEnabled 屬性)// 查詢特定磁碟區所有使用者的配額使用情況
string query = "SELECT * FROM Win32_DiskQuota WHERE QuotaVolume='Win32_LogicalDisk.DeviceID=\"F:\"'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject q in searcher.Get())
{
Console.WriteLine($"使用者: {q["User"]}");
Console.WriteLine($"已用空間: {Convert.ToInt64(q["DiskSpaceUsed"]) / (1024*1024)} MB");
Console.WriteLine($"限制: {Convert.ToInt64(q["Limit"]) / (1024*1024)} MB");
Console.WriteLine($"警告閾值: {Convert.ToInt64(q["WarningLimit"]) / (1024*1024)} MB");
Console.WriteLine("---");
}
| 問題 | 可能原因 | 解決方案 |
|---|---|---|
| Access Denied | 權限不足 | 以系統管理員身分執行;確認目標磁碟區已啟用配額 |
| Invalid parameter | 使用者/磁碟路徑錯誤 | 使用 WBEMTest 驗證物件路徑;確認 Domain 名稱正確 |
| Quota not enabled | 磁碟區未啟用配額 | 先在磁碟區屬性啟用配額管理,或透過 Win32_Volume 啟用 |
透過 WMI 的 Win32_DiskQuota 類別,C# 開發人員可以完整掌控磁碟配額的生命週期:建立、修改、查詢與刪除。關鍵在於正確建立使用者帳戶與邏輯磁碟的物件關聯,並妥善處理權限與單位換算。此技術適用於伺服器自動化部署、多使用者環境資源管控等企業級應用場景。