数字证书清理脚本

 

上一次修改主题: 2006-09-14

通过支持安全/多用途 Internet 邮件扩展 (S/MIME) 的 Microsoft® Outlook® 的版本,单独的用户可以发布他们收入全球通讯簿 (GAL) 中的数字证书。当用户发布数字证书时,Outlook 将证书添加到 Microsoft Active Directory® 目录服务的 userSMIMECertificate 多值属性中。由于组织的证书颁发机构 (CA) 可能尚未颁发证书,此证书可能被不经意地或恶意地用来创建组织无法解密的邮件。出于此原因,当实现 Microsoft Windows Server™ 2003 证书颁发机构以支持 Exchange 2003 S/MIME 时,通常需要从 GAL 删除用户添加的证书。

userSMIMECertificate 属性是在 Request for Comments (RFC) 2798 中添加的。有关详细信息,请参阅“Definition of the inetOrgPerson LDAP Object Class”(http://www.ietf.org/rfc/rfc2798.txt)(英文)。

可以使用 ListSMIMECerts 脚本帮助您从 userSMIMECertificate 属性中查找和删除证书。此脚本将搜索 Active Directory 用户容器,以查找在此属性中有值的任何用户。在默认模式中,脚本列出已经存储了证书的用户。当您选择详细模式时,脚本还会显示证书颁发者和使用者。脚本可以随意删除证书。脚本不删除属性,它只从属性中删除值。

Caution警告:
使用 ListSMIMECerts 删除证书时,证书不会保存,并且没有机会确认是否删除。因为系统假设用户通过指定用来删除证书的命令行选项来使它们删除。

要求

ListSMIMECerts 脚本要求在运行它的计算机上安装下列软件:

  • Windows Script Host 5.6 或更高版本
  • CAPICOM(只用于详细选项)
  • Windows® 98 或更高版本(推荐 Windows 2000 或更高版本)

有关下载 CAPICOM 的详细信息,请参阅可再发行平台 SDK:CAPICOM

有关安装说明,请参阅 CAPICOM 附带的文档。当用户在命令行上指定 /verbose 时,只需要 CAPICOM 来检索证书颁发者和使用者。如果用户加进了 /verbose 选项而 CAPICOM 库不存在,则脚本将输出错误消息,但仍会继续运行。

另外,必须满足下列条件:

  • 在运行 ListSMIMECerts 的计算机上,所需域的 Active Directory 域控制器必须可用。
  • 运行脚本的用户必须具有适当的特权,以便读取 Active Directory 中的属性。若要删除证书,运行脚本的用户还必须具有适当的域管理员特权,才能写入属性。
  • 必须进行 Active Directory 复制。由于默认情况下 Active Directory 全局缓存中不会缓存 userSMIMECertificate 属性,因此删除的证书可以一直保留供用户使用,直到 Active Directory 复制完成。
  • 必须使用 Exchange 2000 或 Exchange 2003。此脚本可以与 Exchange 2000 或 Exchange 2003 一起使用,但不访问 Exchange。inetOrgPerson 轻型目录访问协议 (LDAP) 对象类的 RFC 2798 定义包括 userSMIMECertificate 属性。

查找 ListSMIMECerts 脚本

解压缩本书时,ListSMIMECerts.vbs 文件放在本文档所在的同一目录中。默认位置是 C:\Program Files\Microsoft WSS Books\Exchange Server。

运行 ListSMIMECerts 脚本

使用命令行脚本环境,从命令提示窗口运行 ListSMIMECerts 脚本。若要查看命令行语法和帮助,请键入以命令:

cscript ListSMIMECerts.vbs /help
note注意:
建议您不要在 Windows 脚本环境 (wscript) 下运行 ListSMIMECerts。输出到命令提示窗口的每一行文本都将显示为弹出消息框,因此需要您对每行单击“确定”。始终使用命令行脚本环境 (cscript)。若要将命令行脚本环境设置为默认值,请键入以下命令: wscript -f //H:cscript

可以从能够访问您要检验的域的域控制器的任何计算机运行 ListSMIMECerts。请记住,运行脚本的用户必须具有足够的特权,才能读写 Active Directory 属性。

以最基本的格式,不用选项调用脚本:

cscript ListSMIMECerts.vbs

不带选项的命令将使用计算机的默认命名上下文,并列出在 userSMIMECertificate 属性中具有值的那些用户。它不删除任何属性值。有关选项的信息,请参阅本主题后面的“ListSMIMECerts 选项”。

ListSMIMECerts 选项

使用命令行选项控制 ListSMIMECerts 脚本。使用 ListSMIMECerts 选项时:

  • 命令行选项不区分大小写:/help/Help/HELP/HeLp 的解释相同。
  • 命令行选项的顺序不重要,如果多次指定某一选项,将使用最后一个有效选项。
  • /dom 选项需要完全限定域名 (FQDN),该域名与 /dom 选项之间以等号 (=) 或冒号 (:) 分隔。例如,/dom=server.subdomain.example.com。该选项中不能有空格。

ListSMIMECerts 脚本具有下列命令行选项。

/dom=<Domain-Name>

/dom 选项用于指定脚本搜索的域。如果未提供 /dom 选项,则脚本将查询运行它的计算机的默认命名上下文,然后使用该域名。如果不确定计算机的默认命名上下文是什么,可以使用 /help 开关来获取它。默认命名上下文显示在帮助信息的末尾。

不要在域名中包括空格,也不要在等号或冒号两侧添加空格。例如,对于此选项,下面的命令是错误的语法,将返回错误消息:

cscript ListSMIMECerts.vbs /dom = server.subdomain.example.com

正确的语法是:

cscript ListSMIMECerts.vbs /dom=server.subdomain.example.com

/remove

默认情况下,ListSMIMECerts 不从用户删除任何值,它只列出有值的用户。在命令行中指定 /remove 选项时,将删除在域用户的 userSMIMECertificate 属性中找到的所有值。

Caution警告:
当指定 /remove 选项时,脚本不要求在删除证书前进行任何确认。

例如,下面的命令会扫描默认的域,然后删除找到的任何 userSMIMECertificate 值:

cscript ListSMIMECerts.vbs /remove

/verbose

/verbose 开关使脚本输出关于下列内容的其他信息:

  • 指定的命令行选项。
  • 找到的每个证书的证书颁发者和使用者。

下面的命令示例列出拥有证书的用户和有关这些证书的信息,但是不删除他们。可以使用此命令查找拥有证书的用户,可以通知他们证书将被删除或者不应该将证书发布到 GAL。

cscript ListSMIMECerts.vbs /verbose

下面的命令示例列出拥有证书的用户和有关这些证书的信息,并删除证书,然后在日志文件中存储信息。

cscript ListSMIMECerts.vbs /verbose /remove > ListSMIMECerts-2003-11-03.log

important重要提示:
如果需要保留前一示例中提供的详细证书信息,请仔细确保运行脚本的计算机上可以使用 CAPICOM。此脚本将删除没有 CAPICOM 的证书,但不显示您的记录的详细证书信息。

/help

此选项显示命令行语法帮助。脚本将忽略任何其他选项,并在显示帮助信息后退出。脚本在帮助信息的末尾显示默认命名上下文。

输出示例

下面的命令示例将搜索特定域,并生成列出每个证书信息的输出:

cscript ListSMIMECerts.vbs /verbose /dom=server.subdomain.example.com

此命令生成下面的输出示例:

Microsoft (R) Windows Script Host Version 5.6

Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

 

==========================================

ListSMIMECerts: (c) 2003, Microsoft

For additional options, use /help option

Started at: 10/29/2003 3:57:16 PM

==========================================

Domain      : server.subdomain.example.com

Remove Mode : False

Verbose     : True

==========================================

Users with userSMIMECertificate values:

  username1

    ExampleDomain SARoot CA v1.0 (subject: ExampleDomain SARoot CA v1.0)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username1)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username1)

  username2

    ExampleDomain SARoot CA v1.0 (subject: ExampleDomain SARoot CA v1.0)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username2)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username2)

  username42

    ExampleDomain SARoot CA v1.0 (subject: ExampleDomain SARoot CA v1.0)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username42)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username42)

  username77

    ExampleDomain SARoot CA v1.0 (subject: ExampleDomain SARoot CA v1.0)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username77)

    ExampleDomain EntSub Issuing CA v1.0 (subject: username77)

==========================================

Processed 100 users.

Found     4 userSMIMECertificate attributes with values.

Finished at: 10/29/2003 3:57:38 PM

========================================== 

故障排除

ListSMIMECerts 脚本可以报告各种错误情况。由于实际错误可能来自基础子系统,因此请确保阅读所有错误信息,以判断问题原因。因为用户列表可能很长,并且脚本不会在所有错误发生时都停止,所以,在发生错误时将在脚本的末尾显示下面的消息:

Note: See above for error information. 

ListSMIMECerts 脚本可以显示下面的错误。

ERROR Retrieving the default RootDSE(检索默认 RootDSE 时发生错误)。The domain controller appears to be unavailable(域控制器似乎不可用)。

脚本无法与 Active Directory 联系,并且无法在目录信息树 (DIT) 的根中获取 DSA 特定的条目 (DSE)。发生此错误时脚本将停止操作。此错误可以指出计算机的 Active Directory 域控制器当前不可用。您可能需要使用 /dom 选项手动指定域。

ERROR Retrieving default naming context(检索默认命名上下文时发生错误)。

脚本无法从根 DSE 检索默认命名上下文。脚本在发生此错误后继续运行。此错误可以指出计算机的 Active Directory 域控制器当前不可用。您可能需要使用 /dom 选项手动指定域。

ERROR Verbose mode requested, but CAPICOM library appears to not be loaded and registered on this computer(错误:已请求详细模式,但 CAPICOM 库似乎不能在此计算机上加载和注册)。

脚本无法创建 CAPICOM CertificateStore 对象。脚本在发生此错误后继续运行。此错误指出在运行脚本的计算机上 CAPICOM 库安装不正确。获取 CAPICOM 库,然后进行安装。有关下载 CAPICOM 的详细信息,请参阅可再发行平台 SDK:CAPICOM

ERROR Retrieving domain users container(检索域用户容器时发生错误)。

脚本无法从 Active Directory 检索用户容器。在发生此错误时脚本停止操作。当 /dom 选项中指定的域不正确,或者当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证域名是否正确,以及您是否有访问用户容器和其中的项目所需的正确特权。

ERROR Retrieving user distinguished name(检索用户的可分辨名称时发生错误)。

脚本无法通过 Active Directory 确定用户的可分辨名称。脚本在发生此错误后继续运行。当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证您是否有访问用户容器和其中的项目所需的正确权限。

ERROR Retrieving user name(检索用户名时发生错误)。

脚本无法通过 Active Directory 确定用户的显示名称。脚本在发生此错误后继续运行。当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证您是否有访问用户容器和其中的项目所需的正确权限。

ERROR Retrieving Active Directory user(检索 Active Directory 用户时发生错误)。

脚本无法从 Active Directory 检索用户对象。脚本在发生此错误后继续运行。当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证您是否有访问用户容器和其中的项目所需的正确权限。

ERROR Unable to clear the attribute values(错误:无法清除属性值)。

脚本无法从当前正在处理的用户的 userSMIMECertificate 属性中删除值。脚本在发生此错误后继续运行。当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证您是否有访问用户容器和其中的项目所需的正确权限。

ERROR Unable to set the user information(错误:无法设置用户信息)。

脚本无法将 userSMIMECertificate 属性保存到 Active Directory。脚本在发生此错误后继续运行。当运行脚本的用户没有访问用户容器的权限时,会发生此错误。验证您是否有访问用户容器和其中的项目所需的正确权限。

ERROR on command line(命令行中发生错误):No domain was specified(未指定域)。

脚本无法在 /dom 选项中找到域名。在发生此错误时脚本停止操作。发生此错误的原因通常是 /dom 选项、等号和域名之间有空格。/dom 选项中不允许有空格。

ERROR on command line(命令行中发生错误):<unrecognized option>(<不可识别的选项>)。

脚本无法识别命令行选项。在发生此错误时脚本停止操作。请检查命令行选项,如有必要,使用 /help 选项确定正确的语法。

ListSMIMECerts 脚本如何工作

ListSMIMECerts 脚本用于查找、读取和写入 Active Directory 对象和属性值。当用户指定 /verbose 选项时,脚本将 userSMIMECertificate 属性值导入 CAPICOM 证书存储,然后提取有关证书的信息。

脚本源代码执行下面的主要操作。有关完整信息,请参阅源代码中的注释。

  1. 定义并初始化必需的常量和变量。
  2. 定义向用户显示信息的实用程序子例程。
  3. 定义发生错误时显示错误信息的实用程序子例程。
  4. 定义查找计算机的默认域名的实用程序子例程。
  5. 处理命令行选项。
  6. 需要时,显示帮助信息,然后退出。
  7. 如果给出 /verbose 选项,则验证 CAPICOM 库是否可用。此库只能用来从证书值提取信息。如果 CAPICOM 不可用,则脚本继续操作。
  8. 将 FQDN 转换为 LDAP 路径,从 Active Directory 获取用户容器。
  9. 选择第一个 Active Directory 用户。
  10. 从 Active Directory 检索 userSMIMECertificate 属性。由于全局缓存中未缓存 userSMIMECertificate,所以 Active Directory 返回错误。可以忽略此特定错误,因为已返回了数据。但是,如果更改尚未复制到脚本正在访问的域控制器,则数据可能已过时。
  11. 如果用户提供了 /verbose 选项,且 CAPICOM 可用,则脚本会将每个属性值加载到 CAPICOM CertificateStore 对象中,并读取各个证书,然后显示颁发者和使用者。
  12. 如果用户提供了 /remove 选项,则脚本会删除属性值。
  13. 移动到下一个 Active Directory 用户,重复步骤 10 至 13,直到再没有更多用户。
  14. 清除脚本中使用的对象,显示摘要信息。

自定义 ListSMIMECerts 脚本

脚本代码是针对您的信息提供的。还可以使用代码来扩展脚本,以满足您的需要。下表描述您可能要包括的一些功能:

  • 指定要删除其属性值的各个用户。
  • 从逗号分隔值 (.csv) 文件或数据库中读取要处理的用户列表。
  • 显示用户容器的完整 LDAP 路径。
  • 保存证书数据,以便以后还原或获取更完整记录。
  • 将条目写入到审核事件日志,以便进行安全监视和审核。
  • 向拥有证书的用户发送电子邮件,将组织关于使用 S/MIME 证书的策略通知他们。
  • 提供交互模式,要求对每个删除操作进行确认。