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 클래스)에 대한 포인터입니다. 다행히 생각만큼 어렵지는 않습니다. 예를 들어 사용자 계정이 contoso 도메인에 있는 carolphilips라는 이름의 사용자에 대한 할당량 정보는 어떻게 얻을 수 있을까요? 이렇게 하려면 kenmyer를 carolphilips로 대체하고 fabrikam을 contoso로 대체하기만 하면 됩니다.
Set colQuotas = objWMIService.ExecQuery _
("Select * From Win32_DiskQuota Where " & _
"User='Win32_Account.Domain=""contoso"",Name=""carolphilips""'")
스크립트의 나머지는 여러 속성의 값을 출력하는 간단한 내용입니다. 한 가지 중요한 것은 Status 속성에서 반환된 숫자 값을 읽을 수 있는 문자열로 변환하는 Select Case 문입니다. 예를 들어, Status에서 2를 반환하면 스크립트가 이 숫자를 Quota exceeded라는 문자열로 변환합니다. 여기에 더해 모든 할당량 값을 1024로 나누어서 킬로바이트로 반환된 값을 메가바이트로 변환할 수 있습니다.
이 스크립트는 컴퓨터에 있는 모든 드라이브에서 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에서는 잘 작동하지만 Win32_DiskQuota 클래스가 Windows 2000에서 지원되지 않기 때문에 Windows 2000에서는 효과적이지 않습니다. 또한 Windows NT 4.0 또는 Windows 98이 디스크 할당량 및 기간을 지원하지 않기 때문에 이 버전의 Windows에서도 Win32_DiskQuota 클래스가 전혀 지원되지 않거나 부분적으로 지원되지 않습니다. 그렇다면 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
이 스크립트는 그다지 길지 않고 큰따옴표도 많이 사용하지 않아 깔끔해 보입니다. 하지만 Windows XP 나 Windows 2003에서는 이 스크립트를 사용하지 않는 것이 좋습니다. 원한다면 사용할 수도 있겠지만 Shell 개체를 사용하여 디스크 할당량 정보를 가져올 때는 두 가지 문제가 있습니다. 첫째, Shell 개체는 WMI 스크립트와는 달리 로컬 컴퓨터에 대해서만 실행되므로 원격 컴퓨터에 연결하여 디스크 할당량 정보를 반환할 수 없습니다.
둘째, 한 번에 하나의 디스크에 대해서만 할당량 정보를 가져올 수 있습니다. WMI를 사용하는 경우 컴퓨터에 있는 모든 드라이브에 대한 디스크 정보를 포함하는 컬렉션을 반환할 수 있지만, Shell 개체를 사용하는 경우 C: 드라이브에서 데이터를 가져오기 위한 코드를 작성한 다음 D: 드라이브에서 데이터를 가져오기 위한 코드를 작성하고 다시 E: 드라이브에서 데이터를 가져오기 위한 코드를 계속 작성해야 합니다.
|