如何监视和解决在 Exchange Server 2003 或 Exchange 2000 Server 中的页面缓冲的池内存的使用

文章翻译 文章翻译
文章编号: 912376 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

大小或数量的客户端访问令牌可以是在运行 Microsoft Exchange 服务器的服务器可以支持的客户端的数量限制的因素。本文介绍了安全令牌的 Exchange 服务器支持的客户端连接上的分配方式。此外,本文包含有关如何监视和控制的令牌的内存使用的建议。

每个访问令牌需要一些 Microsoft Windows 内核内存。该大小取决于几个因素。组成员身份是最重要的因素之一。令牌的增加而成正比的组成员身份的大小。

本文包含的脚本展示一种安全令牌进行计数和生成有关的 Exchange 用户所属的安全组数的统计信息的方法。此信息可帮助您估计中的访问标记与相关联的内存大小
那些用户。

简介

本文介绍了如何主动管理并减少由客户端连接到 Exchange 使用的页面缓冲的池内存的使用服务器。页面缓冲的池内存的使用可以减少控制大小和数量的访问令牌。修补程序 912480 直接减少了客户端访问令牌时它建立一个连接到 Microsoft Exchange Server 2003 Service Pack 2 (SP2) 使用客户端的数量。本文的其余部分描述如何减小访问令牌的大小。此外,本文还介绍了可用于控制、 分发,和优化上下文中的访问令牌的客户端连接的其他方法。

若要优化的客户端标记使用可用的 Exchange 2003 SP2 修补程序。此修补程序可以减少与 MAPI 客户端相关的最多的三分之一的令牌的内存消耗。您应该应用此修补程序,仅当您遇到页面缓冲的池内存消耗问题引起的标记分配。 有关修补程序 912480 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
912480承载多个 Outlook 客户端会话的一个 Exchange Server 2003 服务器可能运行的页面缓冲的池内存不足

更多信息

访问令牌

当 Windows 帐户试图访问受保护的 Windows 构造资源,一个访问令牌。访问令牌用于确定是否应该授予访问权限,并应授予的访问。标记是由承载该资源的服务器生成的。服务器查询获取标记的信息在适当的域控制器。

访问令牌包含的几条信息,最值得注意的是安全标识符 (sid) 为用户帐户和用户帐户所属的安全组。后向一个的服务器与用户相关联的适当 sid 的用户身份验证和用户的组成员身份都将放入一个访问令牌。SID 是唯一标识 Windows 安全主体或安全组的数字的字符串。有关详细的信息查看"安全标识符技术参考"文档。若要访问此文档,请访问下面的 Microsoft 网站:
http://technet2.microsoft.com/windowsserver/en/library/a320b892-f678-490d-adf0-fb97984c2bd71033.mspx
sid 是比登录名没有更多的机密。sid 是与对象名称关联的唯一数字标识符。SID Active Directory 对象的生存期内保持不变。因此,SID 可用于最终标识而不考虑是否更改其他对象属性的对象。

在服务器上的每个受保护的资源都有随机访问控制列表 (DACL) 与之相关联。DACL 列出允许或拒绝对资源进行访问的 sid。

当用户试图在访问受保护的资源时在用户的访问令牌中的 sid 列表与资源的 DACL 中的 sid 列表相比较。如果令牌中的 SID 匹配一个资源的 DACL 中的 SID,则将授予适当的访问。您不能可靠地确定通过计算的组的用户对象的 隶属于 属性上列出的用户帐户所属的安全组的数目。这是因为以下四个因素:
  • 组嵌套

    在 Microsoft Windows 2000 的本机模式域中或 Windows Server 2003 功能模式的域组可以在混合模式域中是比更灵活地嵌套。一组添加到用户的令牌时, 也将添加嵌套组的 sid。
  • 通用组成员身份

    如果用户帐户域处于混合模式,通用组将不会添加到访问令牌。只要该帐户所属的域将被转换为纯模式或 Windows Server 2003 功能模式之一,通用组成员身份将被添加到标记中。
  • sid 历史

    在其 sid 历史属性中,从 Microsoft Windows NT 4.0 域中或其他 Active Directory 域迁移的帐户可能有很多组成员身份。有关 sid 历史的详细信息,请访问下面的 Microsoft 网站:
    http://technet.microsoft.com/en-us/library/Bb727125.aspx
    仅适用于已经在 Windows 2000 本机模式或在 Windows Server 2003 功能模式下的用户帐户域 sid 历史。 如果用户帐户域处于混合模式,SIDHistory 来自组将被忽略。在练习中,不应存在这些组。
  • 域本地组

    如果在 Windows 2000 本机模式或 Windows Server 2003 功能模式的域中受保护的资源,用户帐户所属的资源域中的域本地组将被添加到标记中。 例如对于假设域 A 中的用户试图访问一个资源在域 b。在 Windows 2000 本机模式或 Windows Server 2003 功能模式中,用户属于哪个域 B 中的所有域本地组将被都添加到访问令牌中。用户属于哪个域 A 中的域本地组将不会添加到由域 B.中的服务器生成的令牌这是因为域本地组从域 A 是不相关域 b。

标记的副本

在页面缓冲的池内核内存中,服务器上存储用户的访问令牌。在任何时候有可能是内存中的每个用户的令牌的多个副本。例如对于如果客户端通过使用 NET USE 命令映射的基于 Windows Server 2003 的服务器上的共享,用户的令牌的两个副本将保留在服务器上,以支持此连接。

连接到 Exchange 服务器的每个客户端应用程序很可能生成多个副本的具体情况取决于应用程序和其配置的用户标记。

没有可用的页面缓冲的池内存的一个有限的数量。因此,不存在的服务器可以维护一次的客户端连接数限制。在基于 Windows 的服务器上已安装的物理内存超过 1 千兆字节 (GB),最大页面缓冲的池内存是关于 350 兆字节 (MB)。 此金额可能会减少内存调整的其他资源的可能是较短的设备中应用。

对于大规模的 Exchange 服务器的内存优化建议包括的使用在 / 3gb boot.ini 开关。这样可以减少到小于 250 MB 的最大页面缓冲的池内存。在此的上下文中大规模的 Exchange 服务器是 RAM 的一个主机数千个邮箱和的有多个 1 GB 安装。

如果不使用该 / 3gb 开关,则可能必须 Exchange 服务器服务将重新启动定期进行碎片整理的虚拟内存。关闭其他应用程序内存的页面缓冲的池内核内存交易是值得的权衡关系。 但是,此权衡意味着必须更密切地监视页面缓冲的池内存的使用。 有关内存调整的 Exchange 服务器的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
815372如何优化内存使用情况,在 Exchange Server 2003 中
此外,查看"疑难解答 Exchange Server 2003 性能"白色纸张"网数出内存绑定问题"一节。若要访问此白皮书请访问下面的 Microsoft 网站:
http://technet.microsoft.com/en-us/library/4b012bda-8711-4617-9239-f3527de884a3.aspx
客户端标记通常是在 Exchange 服务器上的页面缓冲的池内存的最大的单个使用者。大型普通用户令牌是否页面缓冲的池内存消耗很可能成为一个 Exchange 服务器可伸缩性的重要瓶颈。

如何计算令牌的大小

可以通过使用以下公式估计访问令牌的大小以字节为单位):
[12 x 号码的用户权利] + [标记开销] + [44 组成员身份的 x 数量] = 令牌的大小以字节为单位)
  • 用户权限包括权限,如"在本地登录"或"从网络访问这台计算机。添加到访问令牌中的唯一用户权利是承载受保护的资源的服务器配置这些用户权限。大多数的 Exchange 服务器用户都可能在 Exchange 服务器上具有只有两个或三个用户的权限。管理员可能会有几十个用户权限。每个用户权限的用户需要将其存储在该标记的 12 字节。
  • 令牌开销包括标记的源、 到期时间和模拟信息的多个字段。对于没有特殊访问权限或限制的典型的域用户,开销令牌是可能为 400 和 500 个字节之间。一般情况下,估计用户权限和开销令牌的 500 个字节是多个足够。
  • 每个组成员身份将组的 SID 添加到与附加的 16 个字节的关联的属性和信息一起令牌。 最大可能大小的一个 SID 为 68 的字节。但是,很少是过大的 SID。在 Windows Server 2003 和早期版本中,用户或一组典型的 SID 是 windows 的 28 字节的长度。因此,用户属于哪个通常每个安全组将 44 的字节添加到用户的令牌的大小。

令牌的内存分配

如果一个标记为不超过 4 千字节 (KB),为其分配的内核内存量是完全什么需要,以容纳该标记。 例如对于考虑一个典型的用户属于 30 安全组。通过使用提到的公式如何计算令牌的大小部分中,该用户的令牌将大约 1,820 字节 (44 字节 x 30 组 + 500 开销字节 = 1,820)。

但是,每个副本分配的内存量甚至略大于 4 KB (4096 字节) 的标记是否将跳转到完全 8 KB (8,192 字节为单位)。甚至略大于 8 KB 的标记时内存分配将跳转到恰好 12 KB。因此,令牌的大小超出这些关键的 4 KB 边界,之一每次没有在页面缓冲的池内存的使用中的突然跳转。

通常,所属的 80 多种安全组的用户将附近或将转至 4 KB 边界上。因此,$ 用户需要一个 8 KB 的标记。如果用户属于多个 170 组,该标记是有可能需要 12 的 KB 等等。

下面的示例阐释了要监视和控制平均的客户端令牌大小是重要程度如何。请考虑一个 Exchange 2003 Service Pack 2 的所有客户端都在缓存模式下使用 Microsoft Office Outlook 2003 的服务器。典型的缓存模式客户端使其在一台基于 Windows Server 2003 的计算机上生成的令牌的七个或八个副本。如果平均的客户端标记为完全 4 KB,每个缓存模式客户端需要最多为 32 KB 的页面缓冲的池内存。

注意"简介"部分中描述的 Microsoft Exchange 信息存储服务修补程序可以四个或五个七个或八个而不是减少为缓存模式的每个用户的令牌副本的数量。要包含在 Microsoft Exchange Server 2003 Service Pack 3 中安排此修补程序。

如果通过使用配置服务器在 / 3gb 交换机,将有约 250 MB 的页面缓冲的池内存分配在服务器上。我们建议典型的页面缓冲的池消耗量为服务器应该不能超过 200 MB。您必须保留足够的内存的服务器负载中的峰值。如果页面缓冲池内存消耗通常是多个 220 MB,您应采取以减少服务器上的负载的即时步骤。

假定 150 MB 的页面缓冲的池内存可供 Exchange Server 客户端令牌。如果每个客户端标记为 4 KB,服务器舒适可以支持 4,500 多个并发的 Outlook 缓存模式用户之前令牌的使用会成为瓶颈。请注意应用修补程序 912480 会增加此 7,300 缓存模式用户的最大值。如果要跳转到 8 KB 令牌的大小,一半不管是否已应用修补程序 912480 降低客户端最大数目。

注意如果在联机模式下运行 Outlook 2003 时,将通常有三个或四个标记的副本,为每个客户端,不管是否已应用修补程序 912480。

内核内存消耗的症状

如果接近于被用完内核内存资源服务器变得很慢,或拒绝额外的请求和连接。 应用程序可能会突然失败。此外,连接到受影响的服务器的尝试可能会返回错误 1450,"不足资源系统。在极端的情况下服务器可能会在蓝色屏幕上显示一条错误信息并停止响应。

此外,可能在系统日志中记录以下事件:

事件 ID: 2019年
源: SRV
描述: 服务器不能分配从系统非页面缓冲池,因为该池为空。

事件 ID: 2020年
源: SRV
描述: 服务器无法分配系统页面缓冲池中,因为该池为空。

事件 ID: 2000年
源: SRV
说明: 系统服务的服务器的调用意外失败。

瞬态页面缓冲的池内存不足时将很可能会恢复服务器。应用程序可以临时短缺的内存要稍有弹性。然而,没有应用程序可以运行永远如果不满足关键资源请求。如果页面缓冲的池内存不足的很多长时间持续很可能触发级联瓶颈。在这种情况下,该服务器可能必须重新启动以使它再次起作用。

标准的负载的情况下应该有大约 50 MB 的可用页面缓冲的池内存。如果少于有 30 兆字节自由您应该采取以减少服务器上的负载的即时步骤。

页面缓冲的池内存静态分配在 Windows 的过程中启动。该池不能增加无需重新配置和重新启动服务器。可用的页面缓冲的池内存的数量取决于若干因素。 这些因素包括启动开关,如 / USERVA/ 3gb,注册表设置和物理内存。

如何降低用户访问令牌的大小

若要减少令牌的大小,您可以使用以下三种策略:
  • 减少每个用户所属的安全组的数量。
  • 驻留在连接到 Exchange 服务器的用户从不同的域中的 Exchange 服务器。

    该策略可以减少用户令牌的大小最小化的用户帐户域从标记中呈现给 Exchange 服务器的域本地组。此操作,因为在不同的域中的服务器上生成的令牌中不保留从一个域的域本地组。
  • 您可以时请将安全组转换为通讯组。

    令牌的大小增加安全组的成员身份不通讯组。用户可以属于数千个通讯组不影响令牌的大小。如果没有正在使用一组,以拒绝或授予对资源的访问权限,它应该是通讯组不是一个安全组。

如何减少在服务器上的内存中的访问令牌的数量

一旦您与实际的最小值减少了典型的令牌大小下, 一步是管理对服务器所做的并发连接数。您可以通过使用下列方法管理同时连接数:
  • 限制未授权客户端和应用程序。

    每个客户端可能会使多个连接到服务器。 此外,不同的客户端进行不同的基于各种因素的连接数。您可能甚至没有连接到服务器的所有客户端的完整列表。用户可以安装 Outlook 外接的建立其他连接。开发人员可以运行的应用程序,使多个连接,或者,不要关闭连接他们结束时。 因此,您应分析种类的客户端连接到服务器和内核内存使用情况他们拥有何种效果。有关详细的信息,请参阅如何查看令牌分配大小部分。
  • 从服务器中删除公用文件夹存储。然后,指引到另一服务器上的公用文件夹的客户端。

    此操作消除了由客户端的公用文件夹连接。
  • 删除对许多客户端连接帐户的特定公用文件夹。

    很好的候选删除是 schedule + 忙/闲文件夹以及脱机通讯簿。当用户安排约会日程或下载通讯簿时,客户端必须使这些文件夹的其他连接。
  • 添加副本的访问量大的公用文件夹分布在多个服务器连接到它们的客户端的数量。
  • 安装专用的公用文件夹服务器,以消除来自邮箱服务器的所有公用文件夹连接。
  • 在多个服务器之间平均分配负载过重连接的用户。粗连接的用户都可能具有多个计算机或设备的人员和那些不移动用户。
  • 分布在多台服务器上具有较大的安全令牌的用户。
  • 应用修补程序 912480 对令牌进行优化。 有关修补程序 912480 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    912480承载多个 Outlook 客户端会话的一个 Exchange Server 2003 服务器可能运行的页面缓冲的池内存不足

如何监视 Exchange 服务器上的页面缓冲的池内存

通常,应该有 50 MB 的可用典型的服务器下的可用页面缓冲的池内存加载情况。此外,您应具有 30 MB 的可用在峰值负载下。

可以很容易地确定当前正在使用页面缓冲的池的内存量。Windows 任务管理器显示分页池使用,在 性能 选项卡上 核心内存 区域。您还可以监视与 Windows 系统监视器中的分页 Memory\Pool 的字节数计数器的时间段的页面缓冲的池内存使用。

Exchange 服务器,配置为使用该 / 3gb 启动开关都将具有大约 250 MB 的最大可能的页面缓冲的池内存大小。此外,该服务器将具有非分页的池的内存最多 128 mb。无需在 / 3gb 切换,该最大值是 350 MB 的页面缓冲的池内存和非页面缓冲池内存为 256 MB。

因此,一个典型的大型 Exchange 服务器应使用不能超过 200 MB 的页面缓冲池内存通常情况下。多个 220 MB 的页面缓冲的池内存使用需要立即关注。

如果您是在这些的限度内,并且服务器页面缓冲的池内存消耗与相关的错误报告很可能的初始页面缓冲的池内存分配较少比预期。这可能导致的硬件要求设备驱动程序,或通过内存调整,减少初始页面缓冲池内存分配更多。在大内存配置例如对于多个 4 GB 的物理是 RAM 的导致该问题的最常见的原因。

安装在服务器中的物理 RAM 的每个字节需要某些内核内存,以解决和管理它。更多的 RAM,安装了多个内核地址空间必须为其预留。地址空间可能是借入,从页面缓冲的池内存以满足此需求。

我们建议您不要在专用于运行 Exchange Server 2003 的服务器中安装超过 4 GB 的物理内存。Exchange 服务器将使有效地使用多达 4 GB 的 RAM。但是,Exchange 服务器将不会利用额外的 RAM,即使它是可用。支持热添加内存功能的服务器还可能会导致显著减少页面缓冲的池内存的可用性。如果即使安装不能超过 4 GB 的 RAM,则可能会为理论的最大 hot-add 可能安装的 RAM 量预留地址空间。

使用内核调试器,可以查看最初页面缓冲的池内存的大小和其他内核内存分配。

重要可以在一个内核调试会话期间使用的命令可能会导致系统变得不稳定或停止。我们建议您停止所有 Exchange 服务器服务之前启动调试会话的内核和会话后重新启动服务器。

设置调试会话的 Windows 2000 的传统内核可以是一项复杂的任务。 此任务通常需要额外的计算机、 专用电缆连接和重新启动服务器。

或者,从 Sysinternals LiveKD 实用程序可用于启动调试会话从服务器控制台的内核。LiveKD 不需要重新启动服务器。 有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
894067性能工具不准确地显示可用的可用系统页表项在 Windows Server 2003 中
对于 Windows Server 2003,KD 内核调试程序支持调试直接从服务器控制台而无需特殊的准备工作或硬件。若要获取调试工具的 Windows,请访问下面的 Microsoft 网站:
http://www.microsoft.com/whdc/devtools/debugging/default.mspx
通过使用 KD.EXE-KL 命令启动调试器。然后,运行在 ! vm 命令来查看最大页面缓冲的池内存。例如对于运行以下命令:
KD.EXE-KL
! VM

如何查看令牌分配大小

outlook 不是仅客户端可以连接到 Exchange 服务器数据库。outlook 外接程序,包括邮件的桌面搜索引擎搜索即时消息客户端的功能和自定义应用程序可以所有建立其他连接,并会导致生成的其他标记的副本。

您可以通过在实验室环境中使用 Poolmon.exe 实用程序来验证客户端或应用程序的效果。若要这样做,请按照下列步骤操作:
  1. 生成一个孤立的实验室 Exchange 组织。
  2. 在 Exchange 服务器上安装 Poolmon。 有关如何配置 Poolmon.exe 的详细信息单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    177415如何使用内存池监视器 (Poolmon.exe) 来解决内核内存泄漏
  3. 运行与 Poolmon.exe 该 / iToke 交换机 (Poolmon /iToke)。请注意,在 / iToke 参数是区分大小写。这将配置 Poolmon.exe 显示仅令牌分配。您还可以实时查看总的令牌分配在生产服务器上使用此命令。
  4. 配置类似于典型的 Exchange 服务器用户,在您的环境中的 Active Directory 用户帐户。也就是配置用户帐户具有等效的数字的安全组成员身份、 类似的权限的配置文件,依此类推。
  5. 测试用户的客户端应用程序和要测试的配置为登录到 Exchange 服务器。等待几分钟,您登录的客户端应用程序完全加载并稳定后。
  6. 您会注意到令牌中 Poolmon.exe 字节所做的更改时,请退出客户端应用程序。您可能要执行此几次,以获得一个准确读取的字节数的释放时退出客户端。其他令牌分配可能会创建或销毁测试过程中一次。
注意如果更改了用户帐户如通过添加或删除安全组成员身份,您必须注销从 Windows 帐户,然后重新登录之前这些更改将反映在访问令牌。

如何审核组成员身份

下面的脚本示例包含命令行参数,以及在每个脚本的顶部的说明。可以将脚本粘贴到记事本,然后将其保存为.vbs 文件。不要将文件保存为.txt 文件。
  • Exchange Server 邮箱用户帐户名称和它们所属的安全组,将打印 Groups.vbs 脚本。此外,打印输出包含一个单独的列,其中列出了 sid 历史的组。您可以限制对一台 Exchange 服务器的脚本或通过使用通配符来获得多个 Exchange 服务器的报表。

    注意您不能使用通配符 (*) 来访问所有 Exchange 服务器。您必须提供至少一个部分服务器的名称。例如对于您可以使用一个字符串,它类似如下:
    EXCH-HQ-*
  • Groups_statistics.vbs 脚本提供了基于文本的直方图视图显示多少用户所属的组 50、 60 组、 70 的组等等。这可以帮助您确定用户有可能的平均令牌大小。
请参阅在"如何计算令牌的大小"和"标记内存分配"章节的详细信息令牌的大小。

脚本

Groups.vbs
'==============================================================================
' NAME: Groups.vbs
' AUTHOR: Kyryl Perederiy, Microsoft IT, MACS Engineering
' DATE  : 12/15/2005
' COMMENT: The script runs through all mailbox enabled user objects in the 
' forest and calculates the number of security groups and groups in SID 
' history for each object. User objects can be filtered by Exchange home server.
' PARAMETERS: <output file> <GC Domain Controller> <Domain Naming Context> [<Exchange Server(s)>]
' EXAMPLE: CSCRIPT groups.vbs groups.tsv EXCH-DC-01 dc=root,dc=company,dc=com EXCH-MBX-*
' Version 1.0
'==========================================================================
On Error Resume Next
Set strArgs = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set fileStream = fso.OpenTextFile(strArgs(0), 2, True, TristateTrue)
fileStream.WriteLine "DN	Mail	Domain	Login	Server	GRP	SIDHISTORY"

Count=0
DCS = strArgs(1) ' Domain Controller
strDomainNC = strArgs(2) ' Domain Naming Context for the forest
strFilter = "(&(mail=*)(objectCategory=person)(objectClass=user)" &_
			"(msExchHomeServerName=*" & strArgs(3) & "))" 'Mail users search filter

Set oConnection = CreateObject("ADODB.Connection") ' Setup the ADO connection
Set Com = CreateObject("ADODB.Command")
oConnection.Provider = "ADsDSOObject"
oConnection.Open "ADs Provider"
Set Com.ActiveConnection = oConnection ' Create a command object on this connection
Com.CommandText = "<LDAP://" & DCS & ":3268/" & strDomainNC & ">;" &_
					strFilter & ";distinguishedName,mail,sAMAccountName," &_
					"msExchHomeServerName,SIDHistory,homeMDB;subtree"

' Set search preferences
Com.Properties("Page Size") = 1000
Com.Properties("Asynchronous") = True
Com.Properties("Timeout") = 120 ' seconds
set oRecordSet = Com.Execute

oRecordSet.MoveFirst

While Not oRecordset.Eof

	Count=Count+1
	DN = oRecordset.Fields("distinguishedName").Value
	Mail = oRecordset.Fields("mail").Value
	Server = oRecordset.Fields("msExchHomeServerName").Value
	Server = Mid(Server,InStrRev(Server,"=")+1)
   	Domain = Split(DN,",DC=")
	Login = UCase(Domain(1)) & "\" & oRecordset.Fields("sAMAccountName").Value
	
	set oDirObject = GetObject("LDAP://" & DCS & "/" & replace(DN,"/","\/"))

	' tokenGroups is a computed attribute that contains the list of SIDs 
	' due to a transitive group membership expansion operation on a given user
	oDirObject.GetInfoEx ARRAY("tokengroups"),0 
	
	' Size of the array correspond to the number of groups
	GROUPS = ubound(oDirObject.GetEx("tokengroups"))+1

	If IsNull(oRecordSet.Fields("SIDHistory").Value ) Then 
		SIDHIST = "0" 
	Else 
		SIDHIST = ubound(oDirObject.GetEx("sidhistory"))
	End If

	WScript.Echo Count & CHR(9) & DN & CHR(9) & GROUPS
	fileStream.WriteLine _
		DN & CHR(9) &_
		Mail & CHR(9) &_
		UCase(Domain(1)) & CHR(9) &_
		Login & CHR(9) &_
		Server & CHR(9) &_
		GROUPS & CHR(9) &_
		SIDHIST & CHR(9)

	oRecordset.MoveNext

Wend

WScript.Echo "Total: " & Count & " users found on the server(s): " & strArgs(3)
Groups_statistics.vbs
'==========================================================================
' NAME: groups_statistics.vbs
' AUTHOR: Kyryl Perederiy, Microsoft IT, MACS Engineering
' DATE  : 12/15/2005
' COMMENT: The script runs through all mailbox enabled user objects in the 
' forest and calculates statistical distribution for group membership.
' PARAMETERS: <output file> <GC Domain Controller> <Domain Naming Context> [<ExchHomeServerName>]
' EXAMPLE: CSCRIPT groups_statistics.vbs groups_statistics.tsv EXCH-DC-01 dc=root,dc=company,dc=com EXCH-MBX-0*
' Version 1.0
'==========================================================================
On Error Resume Next
Dim GROUPS(100)
Set strArgs = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set fileStream = fso.OpenTextFile(strArgs(0), 2, True, TristateTrue)
fileStream.WriteLine "Groups" & CHR(9) & "Users"

Count=0
DCS = strArgs(1) ' Domain Controller
strDomainNC = strArgs(2) ' Domain Naming Context for the forest
strFilter = "(&(mail=*)(objectCategory=person)(objectClass=user)" &_
			"(msExchHomeServerName=*" & strArgs(3) & "))" 'Mail users search filter

Set oConnection = CreateObject("ADODB.Connection") ' Setup the ADO connection
Set Com = CreateObject("ADODB.Command")
oConnection.Provider = "ADsDSOObject"
oConnection.Open "ADs Provider"
Set Com.ActiveConnection = oConnection ' Create a command object on this connection
Com.CommandText = "<LDAP://" & DCS & ":3268/" & strDomainNC & ">;" &_
					strFilter & ";distinguishedName,sAMAccountName;subtree"

' Set search preferences.
Com.Properties("Page Size") = 1000
Com.Properties("Asynchronous") = True
Com.Properties("Timeout") = 120 'seconds
set oRecordSet = Com.Execute

oRecordSet.MoveFirst

While Not oRecordset.Eof

	Count=Count+1
	set oDirObject = GetObject("LDAP://" & strArgs(1) & "/" &_
		replace(oRecordset.Fields("distinguishedName").Value,"/","\/"))
	oDirObject.GetInfoEx ARRAY("tokengroups"),0
	GRP = ubound(oDirObject.GetEx("tokengroups"))+1
	GROUPS(Int(GRP/10)) = GROUPS(Int(GRP/10)) + 1
	WScript.Echo Count & CHR(9) & oRecordset.Fields("sAMAccountName").Value & CHR(9) & GRP
	oRecordset.MoveNext
Wend
WScript.Echo "Total: " & Count & " users found"
WScript.Echo "See " & strArgs(0) & " for details..."
For i=0 to 100
	fileStream.WriteLine i*10 & CHR(9) & GROUPS(i)
Next

本文讨论了在第三方产品是由独立于 Microsoft 的公司生产的。Microsoft 会使没有担保,或暗示或其他方式,性能或可靠性,这些产品。

属性

文章编号: 912376 - 最后修改: 2007年11月16日 - 修订: 2.4
这篇文章中的信息适用于:
  • Microsoft Exchange Server 2003 Enterprise Edition
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange 2000 Server 标准版
关键字:?
kbmt kbhowto kbinfo KB912376 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 912376
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com