嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何擷取單一使用者的磁碟配額資訊?


如何擷取單一使用者的磁碟配額資訊?

嗨,Scripting Guy!如何擷取單一使用者的磁碟配額資訊?

-- AB

AB,您好。根據您電腦安裝的不同 Windows 版本,有幾種不同的方法可擷取單一使用者的磁碟配額資訊。如果您是執行 Windows XP 或 Windows 2003,可以透過 Win32_DiskQuota 類別來擷取使用者的磁碟配額資訊。例如,這裡有個指令碼可取得使用者 kenmyer 的磁碟配額資訊:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colQuotas = objWMIService.ExecQuery _
    ("Select * From Win32_DiskQuota Where " & _
        "User='Win32_Account.Domain=""fabrikam"",Name=""kenmyer""'")
    
For Each objQuota in colQuotas
    Wscript.Echo "Disk Space Used: " & objQuota.DiskSpaceUsed
    Wscript.Echo "Limit: " & objQuota.Limit 
    Wscript.Echo "Quota Volume: " & objQuota.QuotaVolume  
   
    intStatus = objQuota.Status 
    Select Case intStaus 
        Case 0 
            strStatus = "OK"
        Case 1
            strStatus = "Warning limit reached"
        Case 2
            strStatus = "Quota exceeded"
        Case Else
            strStatus = "Unknown"
     End Select
    Wscript.Echo "Status: " & strStatus 
    Wscript.Echo "Warning Limit: " & objQuota.WarningLimit
Next

是的,我們承認這個 WQL 查詢看起來有點嚇人 (到處都是雙引號!),但是這就是 Win32_DiskQuota 類別的設計:User 屬性就是參照屬性,是指向其他物件及其他類別的指標 (在此案例中,是 Win32_Account 類別)。令人慶幸的是,雖然指令碼不是那麼簡單明瞭,但也不是太難處理。如果您想取得使用者 carolphilips 的配額資訊,而它的帳戶位於 contoso 網域中時,該怎麼辦?這很簡單;只要將 kenmyer 取代為 carolphilips,然後將 fabrikam 取代為 contoso

Set colQuotas = objWMIService.ExecQuery _
    ("Select * From Win32_DiskQuota Where " & _
        "User='Win32_Account.Domain=""contoso"",Name=""carolphilips""'")

至少剩下的指令碼相當簡單;我們只是回應不同屬性的值。唯一增加的新東西就是 Select Case 陳述式,它可將 Status 屬性傳回的數值轉換為可讀取的字串。例如,如果 Status 傳回 2,指令碼會將此轉換為 Quota exceeded 字串。除此之外,您想對這個指令碼作的就是將所有的配額除以 1024。這會將這些值 (傳回為 KB) 轉換為 MB。

與此同時,這個指令碼會傳回電腦的所有磁碟機上 kenmyer 的配額資訊。如果您只想要一個磁碟機的配額資訊時,該怎麼辦?這就是您的問題了,對吧!沒有問題;但是因為 QuotaVolume 屬性是其他的參照屬性,以下的 WQL 查詢就更難以理解了:

至少剩下的指令碼相當簡單;我們只是回應不同屬性的值。唯一增加的新東西就是 Select Case 陳述式,它可將 Status 屬性傳回的數值轉換為可讀取的字串。例如,如果 Status 傳回 2,指令碼會將此轉換為 Quota exceeded 字串。除此之外,您想對這個指令碼作的就是將所有的配額除以 1024。這會將這些值 (傳回為 KB) 轉換為 MB。

與此同時,這個指令碼會傳回電腦的所有磁碟機上 kenmyer 的配額資訊。如果您只想要一個磁碟機的配額資訊時,該怎麼辦?這就是您的問題了,對吧!沒有問題;但是因為 QuotaVolume 屬性是其他的參照屬性,以下的 WQL 查詢就更難以理解了:

Set objQuota = objWMIService.Get _
    ("Win32_DiskQuota.QuotaVolume='Win32_LogicalDisk.DeviceID=""C:""'," & _
        "User='Win32_Account.Domain=""tomservo"",Name=""Administrators""'")

如果您需要取得不同磁碟機的資訊,只要複製前面的查詢,然後將 C:取代成適當的磁碟機代號。

當然了,這個指令碼在 Windows XP 及 Windows 2003 上可運作良好,但是在 Windows 2000 卻不然;原因是在 Windows 2000 上不支援 Win32_DiskQuota 類別 (在 Windows NT 4.0 或 Windows 98 上至少部份也不支援,因為這些 Windows 版本不支援磁碟配額)。所以如果您需要擷取 Windows 2000 電腦的磁碟配額資訊時,該怎麼辦呢?

在這個案例中,您使用指令碼,利用 Shell 物件取得本機電腦上 C: 磁碟機的 kenmyer 磁碟配額資訊:

Set colDiskQuotas = CreateObject("Microsoft.DiskQuota.1")
colDiskQuotas.Initialize "C:\", True
Set objUser = colDiskQuotas.FindUser("fabrikam\kenmyer")
Wscript.Echo "Logon name: " & objUser.LogonName
Wscript.Echo "Quota limit: " & objUser.QuotaLimit
Wscript.Echo "Quota threshold: " & objUser.QuotaThreshold
Wscript.Echo "Quota used: " & objUser.QuotaUsed

您可以看見,這個指令碼看起來比較短且清楚,也少了很多雙引號。那為什麼我們不建議您在 XP 或 Windows 2003 上使用這個指令碼?如果您想這麼作是可以的。不過,使用 Shell 物件擷取磁碟配額資訊有兩項限制。第一,Shell 物件指令碼只可針對本機電腦執行;和 WMI 指令碼不同的是,您無法連接到遠端機器並傳回磁碟配額資訊。

第二,您一次只能擷取一台磁碟機的配額資訊。使用 WMI,您可以傳回包含電腦上所有磁碟機之磁碟配額資訊的集合。使用 Shell 物件,您將必須撰寫程式碼取得磁碟機 C: 的資料,然後撰寫程式碼取得磁碟機 D: 的資料,然後再寫程式碼取得磁碟機 E: 的資料等等。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首