如何获得某个用户的磁盘配额信息?

来源:百度文库 编辑:神马文学网 时间:2024/04/28 10:04:41
问:
嗨,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 colQuotasWscript.Echo "Disk Space Used: " & objQuota.DiskSpaceUsedWscript.Echo "Limit: " & objQuota.LimitWscript.Echo "Quota Volume: " & objQuota.QuotaVolumeintStatus = objQuota.StatusSelect Case intStausCase 0strStatus = "OK"Case 1strStatus = "Warning limit reached"Case 2strStatus = "Quota exceeded"Case ElsestrStatus = "Unknown"End SelectWscript.Echo "Status: " & strStatusWscript.Echo "Warning Limit: " & objQuota.WarningLimitNext
好的,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 来划分配额数。这将把这些值(以千字节为单位)转化为以兆字节为单位。
顺便说一下,该脚本将返回用户 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 对象获得用户 kenmyer在本地计算机的驱动器 C: 上的磁盘配额信息:
Set colDiskQuotas = CreateObject("Microsoft.DiskQuota.1")colDiskQuotas.Initialize "C:\", TrueSet objUser = colDiskQuotas.FindUser("fabrikam\kenmyer")Wscript.Echo "Logon name: " & objUser.LogonNameWscript.Echo "Quota limit: " & objUser.QuotaLimitWscript.Echo "Quota threshold: " & objUser.QuotaThresholdWscript.Echo "Quota used: " & objUser.QuotaUsed
正如您所看到的,这个脚本真的是更简短更精炼,包含的双引号相对较少。我们为何不推荐您在 XP 或 Windows 2003 上使用该脚本呢?您可以随意使用。但是,使用 Shell 对象获取磁盘配额信息存在两个限制。其一,Shell 对象脚本只能在本地计算机上运行;不同于 WMI 脚本,您将无法连接到远程计算机并返回磁盘配额信息。
其二,每次只能得到一个磁盘的配额信息。通过 WMI,可以返回包含计算机上所有驱动器的磁盘配额信息的集合。使用 Shell 对象,必须编写代码以获得驱动器 C: 的数据,然后重新编写代码以获得 驱动器 D: 的数据,再重新编写代码以获得 驱动器 E: 的数据,依此类推。