高效源于协同登陆:如何确定哪些用户在驱动器上使用的磁盘空间最多?

来源:百度文库 编辑:中财网 时间:2024/05/06 00:20:33

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

问:

您好,脚本专家!如何确定哪些用户在驱动器上使用的磁盘空间最多?

-- 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 循环,为每个配额条目回显 LogonNameQuotaUsed 属性的值。

您说对了:此脚本比我们用于 Windows XP 和 Windows Server 2003 的脚本要容易的多,那我们为什么不只显示此脚本并称其为良好的呢?此处有问题 – 哦,继续往下看:您知道这儿肯定也有问题 – 无法远程创建 DiskQuota 对象,这就意味着后一个脚本只能在本地计算机上运行。WMI 脚本可能稍显复杂,但它可以在远程计算机上运行。

winXP多 个用户 如何 共同使用在其中一个用户上安装的word2003 如何在网面中确定用户的浏览路径? 压缩驱动器以节约磁盘空间的作用 如何在98的机子上下载MP3驱动器 如何移动驱动器上的文件? 如何防止一个用户注册过的软件,发给其它人在不同的系统上使用, 如何还原c盘属性上的压缩释放磁盘空间 如何快速的在网上查询产品使用用户 土地使用年限是如何确定的? 在网络上服务器的一个应用程序(.exe).已有用户地使用.如何将已连接运行的用户强行中断 有关压缩驱动器以节约磁盘空间的问题 如何在地形图上确定地层倾角。 我明明上的电信网怎么在有的网站上都说我是网通用户?我怎么样才可以确定自己到底是什么用户? 压缩代理程序只能使用磁盘空间管理压过的磁盘上使用。 是如何通过IP地址确定用户所在地址的? 如何使用VB 禁止程序访问指定的驱动器呀??? 吉利自行研发的发动机水平如何,将在哪些车型上使用 为何我新买的U盘在电脑上使用时提示“请将磁盘插入驱动器中” 磁盘空间低,c盘上空间不够,删除驱动器上的旧的或不需要的文件释放一些空间,怎么做。 请问在综合布线时,如何确定使用几芯的光纤?依据是什么? 日历上的“庚”日如何确定? 如何在XP操作系统上注册一个新的用户 如何在论坛上看出用户ID的IP地址 如何在XP上限制其它用户的软件使用权