如何确定哪些用户在驱动器上使用的磁盘空间最多?

来源:百度文库 编辑:神马文学网 时间:2024/06/03 16:19:18
问:
您好,脚本专家!如何确定哪些用户在驱动器上使用的磁盘空间最多?
-- PW
答:
您好,PW。有趣的问题。理论上,您也许能做到这一点,方法是检索驱动器上所有文件、检查所有者、确定文件大小并使每个用户使用的磁盘空间量与运行所需量相吻合。正如我们说过的那样,理论上可以这样,但这个脚本有点复杂,如果驱动器上的文件数量庞大,当脚本执行其所有操作时您的计算机可能不得不由它支配。
因此,我们决定使用一种更简单、更快速、资源消耗更少的方法。有问题?(哦,继续往下看:您知道这儿肯定有问题。)您必须启用有问题的驱动器上的磁盘配额,以使其工作。
在今日专栏中我们不想花费太多的时间来讨论启用和禁用磁盘配额。如果您运行的是 Windows XP 或 Windows Server 2003,您可以在Scripting for Windows Server 2003 中心找到一篇关于磁盘配额的内容详细的文章。如果您运行的是 Windows 2000,则Microsoft Windows 2000 Scripting Guide 包括了有关使用脚本启用和禁用磁盘配额的信息。请记住,当我们说您必须启用驱动器上的磁盘配额时,这并不是意味着您必须强制启用这些配额:您可以启用磁盘配额并允许操作系统汇总每个用户使用的磁盘空间量,而不用限制用何种方法访问驱动器。当然,您可以始终启用磁盘配额,运行脚本,然后再禁用磁盘配额。
注意:如果您决定执行以前的启用/禁用操作,请记住,操作系统在启用配额之后可能至少需要几分钟来汇总磁盘空间。换句话说,不要在启用磁盘配额后立即运行脚本以确定磁盘空间的使用情况;那样可能不行。
假定您已经在计算机的驱动器 C 上启用了磁盘配额,而且运行的是 Windows XP 或 Windows Server 2003,则以下脚本将返回当前每个用户使用的磁盘空间量:
strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")strDrive = "Win32_LogicalDisk.DeviceID=" & chr(34) & "C:" & chr(34)Set colQuotas = objWMIService.ExecQuery _("Select * from Win32_DiskQuota Where QuotaVolume = ‘" & strDrive & "‘")For Each objQuota in colQuotasWscript.Echo "User: "& objQuota.UserWscript.Echo "Disk Space Used: "& objQuota.DiskSpaceUsedNext
正如您看到的那样,该脚本并不复杂,将一个名为 strComputer 的变量设置为圆点(本地计算机的 WMI 表示法),然后连接至 WMI 服务。(尽管此实例连接至本地计算机的 WMI 服务,但是只要您将远程计算机的名称指定给变量 strComputer,也可以检索该计算机的磁盘配额信息。)于是我们得到了以下有趣的代码行:
strDrive = "Win32_LogicalDisk.DeviceID=" & chr(34) & "C:" & chr(34)
结果,Win32_DiskQuota 类(我们将使用该类来检索有关磁盘使用情况的信息)与大多数 WMI 类有点不同。有一点,QuotaVolume 属性 – 该属性指明我们正使用的驱动器 – 不是典型的 WMI 属性;而是 Win32_LogicalDisk 类的一个嵌入实例。这没什么关系,但是这确实使得在 Where 子句中包括 QuotaVolume 有点笨拙,因为 QuotaVolume 的值看起来类似于:
Win32_LogicalDisk.DeviceID="C:"
在 Where 子句中,不太好处理驱动器号两边的双引号。因此,我们使用以前的代码行来创建字符串值等于 Win32_LogicalDisk.DeviceID="C:",使用 Chr(34) 作为添加到双引号中的一种方法。它是额外的代码行,但是将变量 strDrive 放到 Where 子句比将 Win32_LogicalDisk.DeviceID="C:" 放到 Where 子句要简单的多。
相信我们;事实就是如此。
接下来我们要做的是调用 ExecQuery 方法以返回驱动器 C 的所有磁盘配额条目集合。
Set colQuotas = objWMIService.ExecQuery _("Select * from Win32_DiskQuota Where QuotaVolume = ‘" & strDrive & "‘")
从中我们构建了一个 For Each 循环以遍历该集合,从而回显用户名以及用户当前使用的驱动器 C 的磁盘空间量。
现在,它在 Windows XP 或 Windows Server 2003 上运行良好,但在 Windows 2000 上效果不佳;因为 Windows 2000 不支持 Win32_DiskQuota 类。这样如果您运行的是 Windows 2000 的话,是否就太不走运了呢?当然不是,您可以只使用 DiskQuota 对象:
Set colDiskQuotas = CreateObject("Microsoft.DiskQuota.1")colDiskQuotas.Initialize "C:\", TrueFor Each objUser in colDiskQuotasWscript.Echo "Logon name: " & objUser.LogonNameWscript.Echo "Quota used: " & objUser.QuotaUsedNext
正如您看到的那样,我们创建了 Microsoft.DiskQuota.1 对象的一个实例,然后使用 Initialize 方法来返回 C:\ 的磁盘配额条目集合。(不要丢掉 \,它是必需的。)然后构建了一个 For Each 循环,为每个配额条目回显 LogonName 和 QuotaUsed 属性的值。
您说对了:此脚本比我们用于 Windows XP 和 Windows Server 2003 的脚本要容易的多,那我们为什么不只显示此脚本并称其为良好的呢?此处有问题 – 哦,继续往下看:您知道这儿肯定也有问题 – 无法远程创建 DiskQuota 对象,这就意味着后一个脚本只能在本地计算机上运行。WMI 脚本可能稍显复杂,但它可以在远程计算机上运行。