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: 的資料等等。 |