Sun Java 徽标     上一章      目录      索引      下一章     

Sun 徽标
Sun Java(TM) System Directory Server 5 2004Q2 管理指南 

第 2 章
管理目录条目

本章讨论如何使用 Directory Server Console 和 LADP 命令行公用程序来管理目录的内容。它还介绍了如何使用可选的属性加密功能来存储属性,以及如何使用 DSML 访问目录。在计划目录部署时,您应当对目录将要包含的数据的类型进行描述。在创建条目与修改默认架构之前,应当首先阅读《Directory Server Deployment Planning Guide》中的 Chapter 2 "Planning and Accessing Directory Data"

本章假定读者具备 LDAP 架构和对象类及其定义的一些知识。有关架构和所有对象类的定义以及 Directory Server 中提供的属性的简介,请参阅《Directory Server Administration Reference》中的 "Object Class Reference""Attribute Reference"两章。

如果没有定义适当的访问控制指令 (ACI),则不能修改目录。有关详细信息,请参阅第 6 章“管理访问控制”

本章包含以下小节:


配置条目

Directory Server 在以下文件中存储其所有配置信息:

ServerRoot/slapd-server ID/config/dse.ldif

该文件采用 LDAP 数据交换格式 (LDIF)。LDIF 是条目、属性及其值的文本表示,并且是 RFC2849 (http://www.ietf.org/rfc/rfc2849) 所描述的标准格式。dse.ldif 文件中的 Directory Server 配置由以下部分组成:

Directory Server 通过使用 LDAP 使所有配置设置变得可读和可写。默认情况下,只有 Administration Server 中定义的目录管理员和目录管理员才能访问目录的 cn=config 分支。这些管理用户可以像查看和修改任何其他目录条目一样查看和修改配置条目。

应该避免在 cn=config 条目下创建条目,因为它们将存储在 dse.ldif 文件中,而不像常规条目一样存储在高伸缩性的数据库中。因此,如果在 cn=config 的下面存储了许多条目(尤其是那些可能需要经常更新的条目),性能将很可能会受到影响。然而,为了能集中配置信息,将特殊用户条目(如复制管理员(供应商绑定 DN)条目)存储在 cn=config 下是十分有用的。

使用控制台修改配置

推荐采用的修改配置方法是使用 Directory Server Console 的顶级“配置”选项卡。该选项卡的面板和对话框提供基于任务的控件以帮助您快速而有效地设置配置。另外,控制台界面为您管理配置的复杂性和相互依赖性。

该文档中名为“...使用控制台”的步骤描述了配置的控制台界面。这些步骤介绍如何使用“配置”选项卡的面板和对话框执行特定的管理任务。界面本身指明了如何保存配置和何时需要重新启动服务器以使更改生效。

从命令行修改配置

因为可通过 LDAP 访问 cn=config 子树,所以 ldapsearchldapmodifyldapdelete 命令可用于查看和修改服务器配置。可使用“从命令行管理条目”中说明的步骤和 LDIF 格式修改 cn=config 条目和其下的所有条目。

然而,必须了解这些条目的含义、其属性的目的和可以使用的值。这些重要的注意事项在本文档中名为“...从命令行”的步骤中进行了说明。在这些步骤中,将为您展示配置条目及您可能设置的属性的示例。有关所有配置条目及属性的完整说明,包括允许的值的范围,请参阅《Directory Server Administration Reference》。

从命令行修改配置不像使用控制台那样简单。但是,一些很少使用的配置设置无法使用控制台进行修改,而仅能通过命令行步骤进行。也可以通过编写使用命令行工具的脚本来利用命令行步骤自动执行配置任务。

修改 dse.ldif 文件

dse.ldif 文件包含服务器启动和重新启动时将读取和使用的配置。该文件的 LDIF 内容为 cn=config 条目及其子树。只有在安装过程中所定义的系统用户才能对该文件读取和写入。

通过直接编辑该文件的内容来修改配置时,产生错误的可能性比较大,因此推荐不要使用此方法。您应该了解以下行为:


使用控制台管理条目

您可以使用 Directory Server Console 上的“目录”选项卡和条目编辑器对话框,单独添加、修改或删除条目。如果想同时对多个条目执行操作,请参阅“使用控制台执行批量操作”

有关启动 Directory Server Console 和浏览用户界面的信息,请参阅“使用 Directory Server Console”

创建目录条目

Directory Server Console 为创建目录条目提供了几个自定义模板。每个模板都是一个用于特定类型对象类的自定义编辑器。表 2-1 列出了用于每个自定义编辑器的对象类。

表 2-1 条目模板与相应的对象类

模板

对象类

用户

inetOrgPerson(用于创建和编辑)
organizationalPerson(用于编辑)
person(用于编辑)

groupOfUniqueNames(可能还有其他的)用于动态组和证书组。

组织单位

organizationalUnit

角色

nsRoleDefinition 及其他取决于托管、过滤或嵌套角色的选择。

服务类

cosSuperDefinition 及其他取决于服务类的类型。

口令策略

passwordPolicy

引用

referral

这些自定义编辑器所包含的字段表示所有必填属性以及它们各自的对象类的某些常用可选属性。要使用这些模板之一创建条目,请遵循“使用自定义编辑器创建条目”中的说明。要创建其他类型的条目,请参阅“创建其他类型的条目”

使用自定义编辑器创建条目

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,显示要成为新条目的父级的条目。
  2. 右键单击“父条目",选择“新建”菜单项,然后从子菜单中选择条目的类型:用户、组、组织单位、角色、服务类、口令策略或引用。或者,可以左键单击“父条目"将其选中,然后从“对象”>“新建”菜单中选择条目的类型。将显示选中的条目类型的自定义编辑器对话框。
  3. 自定义编辑器在左侧列中显示选项卡列表,而每个选项卡的字段则显示在右侧。默认情况下,所有自定义编辑器在打开的时候都会选中顶端的“用户”或“常规”选项卡,其中包含要命名和描述新条目的字段。

    例如,下图显示用于用户条目的自定义编辑器:

    图 2-1 Directory Server Console—用户条目的自定义编辑器
    标题为创建新用户的窗口,其中显示了用来输入用户信息(如名称、用户 ID、口令、电话号码和其它信息)的字段

  4. 在自定义编辑器的字段中,输入要提供的属性的值。必须为所有必填属性输入值,必填属性由字段名旁的星号 (*) 标识。可以将其他任何字段留空。在允许有多个值的字段中,可以键入回车来分隔值。
  5. 单击“帮助”按钮,获取条目类型的自定义编辑器中特定字段的详细帮助信息。有关用户和组织单位编辑器的语言选项卡的说明,请参阅“设置语言支持属性”

    有关创建组、角色和服务类条目的进一步说明,请参阅第 5 章“管理身份和角色”有关创建口令策略的说明,请参阅第 7 章“管理用户帐户和口令”有关创建引用的说明,请参阅“设置引用”

  6. 单击“确定”创建新条目并关闭自定义编辑器对话框。新条目出现在目录树中。
  7. 自定义编辑器对话框并不为其各自对象类的所有可选属性提供字段。如果希望添加未显示在自定义编辑器中的可选属性,请遵循“使用通用编辑器修改条目”中的说明。

创建其他类型的条目

遵循这些步骤创建除表 2-1 中列出的对象类以外的任何对象类条目。也可以使用该步骤创建在目录架构中定义的任何自定义对象类的条目:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,显示要成为新条目的父级的条目。
  2. 右键单击“父条目",并从子菜单中选择“新建”>“其他项”。或者,可以左键单击“父条目"将其选中,然后选择“对象”>“新建”>“其他”菜单项。
  3. 将显示“新建对象”对话框。

  4. 在“新建对象”对话框的对象类列表中,选择一个定义新条目的对象类,然后单击“确定”。
  5. 如果选择表 2-1 中列出的对象类,将显示相应的自定义编辑器(请参阅“使用自定义编辑器创建条目”)。在所有其他情况下,将显示通用编辑器。

  6. 创建新条目时,通用编辑器包含一个字段,该字段用于所选的对象类的每个必需的属性。必须为所有必需属性输入值。某些字段具有通用占位符,如 New,应当为您的条目将其替换为有意义的值。
  7. 要定义所选对象类上允许的其他属性,必须显式地添加它们。要为可选的属性提供值,请执行以下操作:
    1. 单击“添加属性”按钮,显示允许的属性的列表。
    2. 从添加属性对话框中选择一个或多个属性,然后单击“确定”。
    3. 在通用编辑器中的新属性名称旁输入值。
    4. 有关该对话框中其他控件的详细信息,请参阅“使用通用编辑器修改条目”

  8. 默认情况下,必需属性之一会被选中作为命名属性,并出现在通用编辑器中显示的条目 DN 中。要更改命名属性,请执行以下操作:
    1. 单击“更改”按钮,显示“更改命名属性”对话框。
    2. 在属性表中,选中要在新条目 DN 中使用的一个或多个属性旁的复选框。
    3. 在“更改命名属性”对话框中单击“确定”。通用编辑器中的 DN 显示使用所选命名属性的新 DN。
  9. 在通用编辑器中单击“确定”,保存新条目。
  10. 新条目在目录树中显示为父条目的子级。

使用自定义编辑器修改条目

对于表 2-1 中列出的对象类,可以选择使用相应的自定义编辑器或通用编辑器编辑条目。使用自定义编辑器时,可以轻松访问最常用的字段,且界面会帮助您定义复杂属性的值,如角色或服务类定义中的值。

通用编辑器可以对条目执行更多的高级操作,如添加对象类、添加允许的属性和处理多值属性。要使用通用编辑器编辑条目,请参阅“使用通用编辑器修改条目”


自定义编辑器仅能用于编辑表 2-1 中列出的对象类。包含其他结构对象类的条目(例如从 inetorgperson 继承的自定义类)仅能通过通用编辑器进行编辑。

除了列出的对象类之一以外,还包含辅助对象类的条目,可以使用自定义编辑器进行管理。但是,所有由辅助类定义的属性在自定义编辑器中将不可见。有关辅助对象类的定义,请参阅《Directory Server Administration Reference》Chapter 8 中的 "Object classes"


调用自定义编辑器

要编辑对象类在表 2-1 中列出的条目,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,以显示要编辑的条目。
  2. 双击该条目。还有其他几种方法也可以调用条目的自定义编辑器:
    • 右键单击该条目,并选择“使用自定义编辑器编辑”菜单项。
    • 左键单击该条目将其选中,然后选择“对象”>“使用自定义编辑器编辑”菜单项。
    • 左键单击该条目将其选中,然后使用键盘快捷键 Control-P。
    • 将显示条目对象类的自定义编辑器。例如,图 2-1 中显示了用户条目的自定义编辑器。

  3. 默认情况下,所有自定义编辑器在打开的时候都会选中顶端的“用户”或“常规”选项卡,其中包含要命名和描述新条目的字段。在自定义编辑器的字段中,编辑或删除要修改的属性的值。可以修改,但不能删除必填属性的值,必填属性由字段名旁的星号 (*) 标识。可以将其他任何字段留空。在允许有多个值的字段中,可以键入回车来分隔值。
  4. 选择左侧列中的其他选项卡,修改相应面板上的值。单击“帮助”按钮,获取条目类型的自定义编辑器中特定字段的详细帮助信息。

    有关“用户”和“组织单位”编辑器的“语言”选项卡的说明,请参阅“设置语言支持属性”。在第 7 章“管理用户帐户和口令”中对用户和组条目的帐户选项卡上的字段进行了说明。NT 用户和Posix 用户选项卡是为 Directory Server 同步服务提供的,请与 Sun 代表联系以获取详细信息。

    有关修改组、角色和服务类条目的进一步说明,请参阅第 5 章“管理身份和角色”有关修改口令策略的说明,请参阅第 7 章“管理用户帐户和口令”有关修改引用的说明,请参阅“设置引用”

  5. 单击“确定”保存对条目所作的更改并关闭自定义编辑器对话框。如果修改了命名属性,例如用户条目的通用名称,则更改将在目录树中反映出来。

设置语言支持属性

用户条目和组织单位条目的自定义编辑器都提供了用于国际化目录的语言支持。

  1. “调用自定义编辑器”中所述打开条目的自定义编辑器。
  2. 在左侧列中单击语言选项卡。
  3. 对于用户条目,可以使用下拉列表设置一种首选语言。
  4. 对于用户条目和组织单位条目,您都可以在给定的字段中为列表中显示的任何语言输入本地化的值。选择一种语言,然后以该语言输入一个或多个值。当定义了本地化的值时,语言的名称将在列表中以粗体显示。
  5. 某些语言还具有发音字段,可在其中输入本地化值的语音表示法。

  6. 单击“确定”保存对条目所作的更改并关闭自定义编辑器对话框。

使用通用编辑器修改条目

通用编辑器使您能够根据用于登录到控制台的绑定 DN 来查看条目的所有可读属性,并编辑其可写属性。它还能用来添加和删除属性、设置多值属性并管理条目的对象类。添加属性时,可以为二进制属性和语言支持定义子类型。

调用通用编辑器

要调用目录中任何条目的通用编辑器,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,以显示要编辑的条目。
  2. 右键单击该条目,并选择用“通用编辑器进行编辑菜单”项。还有其他几种方法也可以调用通用编辑器:
    • 左键单击该条目将其选中,然后选择“对象”>“用通用编辑器进行编辑”菜单项。
    • 如果条目的对象类表 2-1 中列出,请双击该条目。对于不具有自定义编辑器的对象类,默认情况下将使用通用编辑器。
    • 将显示通用编辑器,如下图中所示。

      图 2-2 Directory Server Console—通用编辑器
      标题为通用编辑器 - uid=bjensen,ou=People,dc=example,dc=com的窗口,其中显示了该用户条目的属性字段和用来修改它们的控件。

      在通用编辑器中,条目的属性按字母顺序列出,每个属性具有一个文本框,其中包含每个属性的值。所有属性(包括只读属性和可操作属性)都会显示出来。右边的控件允许您修改编辑器的显示方式并编辑属性列表。

  3. 或者,可以使用“视图”框中的控件修改通用编辑器的显示方式。
    • 选择“显示属性名称”选项以查看属性的名称,该名称是最先在架构中定义的名称。将重新安排属性列表,以便按名称的字母顺序排列。
    • 选择“显示属性说明”选项,按照其属性的备用名称(如果已在架构中定义)列出属性。备用名称通常是属性更清楚明了的说明。将重新安排属性列表,以便按说明的字母顺序排列。
    • 取消选中“仅显示具有值的属性”复选框,列出所有由条目对象类的架构明确允许的属性。如果该条目包括 extensibleObject 对象类,则所有条目将暗中允许,但不会列出。默认情况下,仅显示具有定义值的属性。
    • 选中或取消选中“显示 DN”复选框,切换属性列表下条目的标识名称的显示。
    • 刷新按钮将访问服务器以根据条目当前内容更新所有属性的值。

    • 警告

      单击刷新按钮将立即删除在通用编辑器中所做的所有修改,而不会保存这些修改。


以下小节说明用于设置属性值、管理对象类和更改条目的命名属性的控件。

修改属性值

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动查看属性列表并单击要修改的值。
  3. 选中的属性将突出显示,且编辑光标出现在包含所选值的文本字段中。

  4. 使用鼠标和键盘将文本编辑为所需的值。可使用系统的剪贴板在该字段中复制、剪切和粘贴文本。
  5. 如果不能编辑文本字段中的内容,则属性为只读或没有写权限以修改属性。

  6. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

编辑多值属性

在目录架构中定义为多值的属性在通用编辑器中可具有多值字段。有关详细信息,请参阅第 9 章“扩展目录架构”

要为多值属性添加一个新值,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动属性列表,单击属性或属性的一个值。所选属性突出显示,且激活了“添加值”按钮。如果该按钮未激活,则所选属性未定义为多值属性,或属性为只读,或者您不具有写权限,无法修改属性。
  3. 单击“添加值”按钮。列表中属性名称旁边将显示一个新的空白文本字段。
  4. 在新文本字段中输入该属性的新值。可使用系统的剪贴板在该字段中复制、剪切和粘贴文本。
  5. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

要删除多值属性的一个值,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动查看属性列表并单击要删除的特定值。所选属性突出显示,且激活了“删除值”按钮。如果该按钮未激活,则所选属性为只读,或者您不具有写权限,无法修改属性。
  3. 单击“删除值”按钮。包含所选值的文本字段被删除。
  4. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

添加属性

条目必须包含需要或允许该属性的对象类,您才能向其中添加属性。有关详细信息,请参阅“管理对象类”第 9 章“扩展目录架构”

要向条目中添加属性,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 确保“仅显示具有值的属性”选项已选中。
  3. 单击“添加属性”按钮,显示带有属性列表的对话框。该列表仅包含为条目定义的对象类所允许的属性。
  4. 在“添加属性”对话框中,选择要添加的一个或多个属性。
  5. 或者,可从对话框顶部的下拉列表中选择以下两种子类型或其中之一:
    • Language 子类型—使用该子类型表示属性的值中使用的语言。可使用不同的语言多次添加属性以在目录中存储本地化信息。

      或者,在 language 子类型的基础上,还可选择 Pronunciation 子类型表示该属性的值包含与给定语言的值相当的语音。

    • 二进制子类型—如果将二进制子类型赋给属性,则表示应当将值作为二进制数据(不透明数据块)通过 LDAP 进行传递,而不考虑值的实际语法。该选项应当小心使用。它是为没有 LDAP 字符串表示法的复杂语法(如 userCertificate)设计的。不要对其值已经被当作二进制数据的属性使用二进制子类型。
  6. 选择属性及其可选的子类型后,请单击“确定”。属性即按字母顺序添加到通用编辑器中的列表中。
  7. 在新属性名称旁的空白文本字段中为该属性输入一个新值。可使用系统的剪贴板在该字段中复制、剪切和粘贴文本。
  8. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

删除属性

要从条目中删除属性及其所有值,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动查看属性列表并单击要删除的属性名称。所选属性突出显示,且删除属性按钮被激活。如果该按钮未激活,则所选属性为只读,或者您不具有写权限,无法修改属性。

  3. 通用编辑器允许您删除对象类所需的属性,该对象类可能为此属性定义。如果试图在没有所需属性的情况下保存条目,则服务器将响应对象类违规。确保条目包括所有定义的对象类的所需属性。


  4. 单击“删除属性”按钮。将删除属性及其所有文本字段值。
  5. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

管理对象类

条目的对象类由多值 objectclass 属性定义。修改该属性时,通用编辑器提供特殊的对话框以帮助管理定义的对象类。

要向条目中添加对象类,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动查看属性列表,然后选择 objectclass 属性。“添加值”按钮被激活。如果该按钮未激活,则说明您没有权限修改该条目的对象类。
  3. 单击“添加值”按钮。
  4. 将显示“添加对象类”对话框。它会显示可向条目中添加的对象类的列表。

  5. 选择要添加到该条目的一个或多个对象类,并单击“确定”。所选的对象类将出现在 objectclass 属性值的列表中。
  6. 如果新的对象类需要未存在于条目中的属性,则通用编辑器将自动添加这些属性。必须为所有必需属性提供值。
  7. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

要从条目中删除对象类,请执行以下操作:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. 滚动查看属性列表并单击要删除的 objectclass 属性的特定值。如果架构允许删除所选的对象类,且您具有修改该条目的对象类的权限,则“删除值”按钮将被激活。
  3. 单击“删除值”按钮。特定的对象类被删除。
  4. 删除对象类时,通用编辑器将自动删除剩下的对象类不允许或不需要的所有属性。如果删除了命名属性之一,将自动选中另一个,且控制台将把此更改告知您。

  5. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

重命名条目

命名属性是出现在条目的标识名称 (DN) 中的条目属性值对。命名属性从条目的现有属性中进行选择。修改命名属性以重命名条目:

  1. “调用通用编辑器”中所述,打开通用编辑器。
  2. “更改”按钮旁的文本显示了该条目当前的命名属性。如果选中了“显示 DN”复选框,则您可以在属性值列表下的 DN 中查看这些属性。

  3. 单击“更改”按钮。如果该按钮未激活,则说明您不具有重命名该条目的权限。
  4. 显示“更改命名属性”对话框。

  5. 滚动查看属性列表,选择希望该条目的 DN 具有的属性。分别选中或取消选中属性旁的复选框以从命名属性中添加或删除该属性。
  6. 同一父级下的条目 DN 必须是唯一的。因此,必须选择值或值组合为唯一的命名属性。如果条目的 DN 不唯一,服务器将拒绝保存该条目。按照约定,所有条目(如那些代表用户的条目)应该使用相同的命名属性。

  7. 在“更改命名属性”对话框中单击“确定”。通用编辑器中会显示该条目的新 DN。
  8. 对该条目编辑其他任何值或执行其他所需修改,然后单击“确定”,保存更改并关闭通用编辑器。

删除目录条目

要使用 Directory Server Console 删除条目,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,显示要删除的条目。
  2. 也可以通过选中子树的根节点来删除目录的整个分支。

  3. 右键单击该条目并选择“删除”菜单项。还有其他几种操作也可以删除条目:
    • 左键单击该条目将其选中,然后选择“编辑”>“删除”菜单项。如果希望将该条目粘贴到目录中的其他地方,也可以使用“编辑”>“剪切”菜单项。
    • 左键单击该条目将其选中,然后使用键盘快捷键 Control-D。
    • 如果您已经选择了“视图”>“布局”选项以便在 Directory Server Console 的右侧面板中显示子级,则可以按住 Control 键或 Shift 键单击以选择多个条目进行删除。

  4. 确认您希望删除条目或子树及其所有内容。
  5. 服务器会立即删除条目。条目删除后不可恢复。如果删除多个条目,控制台将显示一个信息对话框,其中包含删除的条目数目以及删除过程中可能发生的错误。

使用控制台执行批量操作

可以使用 LDIF 文件添加多个条目、执行混合操作或导入整个后缀。要使用 LDIF 文件和 Directory Server Console 来添加条目,请执行以下操作:

  1. 使用前几节中显示的语法在 LDIF 文件中定义条目或操作。如果仅添加条目或初始化后缀,则不需要 changetype 关键字,且 LDIF 文件可能仅包含条目。如果执行混合操作,则每个 DN 后都应跟一个 changetype 以及特定的操作或属性值(如果适用)。
  2. 从 Directory Server Console 导入 LDIF 文件。有关详细信息,请参阅“导入 LDIF 文件”
  3. 如果执行混合操作,一定要取消选择“导入 LDIF”对话框上的“只添加”,这样服务器才能执行所有的 LDIF 操作。


从命令行管理条目

ldapmodifyldapdelete 命令行公用程序提供完整的功能性,用于添加、编辑和删除目录内容。可以使用它们管理服务器的配置条目和用户条目中的数据。这些公用程序还可以用于编写脚本,以便对一个或多个目录执行批量管理。

全书中的步骤都用到了 ldapmodifyldapdelete 命令。以下各节说明了执行这些管理步骤所需的所有基本操作。更多功能、所有的命令行选项以及这些命令的返回值在《Directory Server Resource Kit Tools Reference》中的 Chapter 4 "ldapmodify"Chapter 5 "ldapdelete" 中进行了说明。

对这些命令行公用程序的输入总是采用 LDIF 格式,并且可以直接从命令行或通过输入文件提供输入。以下小节提供了有关 LDIF 输入的信息,而后继的小节则说明了每种修改类型的 LDIF。

提供 LDIF 输入

向命令行公用程序提供 LDIF 时,请记住一些关于命令行输入、特殊字符、架构检查以及条目的顺序和大小的特殊注意事项。所有目录数据都使用 Unicode 的 UTF-8 编码进行存储。因此,所提供的任何 LDIF 输入也必须是 UTF-8 编码的。《Directory Server Administration Reference》中的 Chapter 7 "LDAP Data Interchange Format Reference" 详细说明了 LDIF 格式。


不要在 LDIF 属性值字符串的末尾无意中留下空格。Directory Server 读取以空格结尾的属性值时,会对该值进行 base64 编码。


在命令行上终止 LDIF 输入

ldapmodifyldapdelete 公用程序读取您在命令后输入的 LDIF 语句的方式与从文件读取时相同。提供输入完成后,请输入 shell 将其识别为文件结束 (EOF) 换码序列的字符。

以下示例说明如何终止对 ldapmodify 命令的输入:

prompt> ldapmodify -h host -p port -D bindDN -w password
dn: cn=Barry Nixon,ou=People,dc=example,dc=com
changetype: modify
delete: telephonenumber
^D
prompt>

出于简化性以及可移植性的考虑,本文档中的示例未显示提示或 EOF 序列。

使用特殊字符

在命令行上输入命令选项时,您可能需要对对于命令行解释程序具有特殊意义的字符执行转义操作,如空格 ( )、星号 (*)、反斜杠 (\) 等。例如,很多 DN 包含空格,且对于大多数 UNIX shell,您必须用双引号 ("") 将值括起来。

-D "cn=Barbara Jensen,ou=Product Development,dc=example,dc=com"

根据命令行解释程序的具体情况,应使用单引号或双引号达到此目的。有关详细信息,请参阅操作系统文档。

另外,如果使用包含逗号的 DN,则必须用反斜杠 (\) 对逗号进行转义。例如:

-D "cn=Patricia Fuentes,ou=People,o=example.com Bolivia\,S.A."

请注意 ldapmodify 命令后的 LDIF 语句由命令而不是 shell 来解释,所以不需要考虑特殊的注意事项。

架构检查

添加或修改条目时,您使用的属性必须是条目中的对象类必需或允许的,且属性必须包含匹配其定义语法的值。

修改条目时,Directory Server 对整个条目执行架构检查,而不仅仅是对正被修改的属性进行检查。因此,如果条目中任何对象类或属性不符合架构要求,则操作可能会失败。有关详细信息,请参阅“架构检查”

LDIF 条目排序

在用于添加条目的 LDIF 文本的任何序列中(不管是在命令行上还是文件中),父条目必须在其子级之前列出。这样,当服务器处理 LDIF 文本时,它将在子条目之前创建父条目。

例如,如果要在不存在于目录中的人员子树中创建条目,然后在子树中的条目前列出代表人员容器的条目,请执行以下操作:

dn: dc=example,dc=com
dn: ou=People,dc=example,dc=com
...
People subtree entries
...
dn: ou=Group,dc=example,dc=com
...
Group subtree entries
...

可以使用 ldapmodify 命令行公用程序在目录中创建任何条目,但是,后缀或子后缀的根条目是一个特殊的条目,它必须与必需的配置条目相关联。要添加新的根后缀或子后缀及其相关配置条目,请参阅“从命令行创建后缀”

管理大型条目

添加或修改具有非常大的属性值的条目之前,可能需要配置服务器以接受它们。为防止服务器超过负载,默认情况下客户机被限制为只能发送不大于 2 MB 的数据。

如果添加大于 2 MB 的条目,或将属性修改为大于 2 MB 的值,服务器将拒绝执行此操作并立即关闭连接。例如,二进制数据(如条目的一个或多个属性中的多媒体内容)可能会超过此限制。

定义了一个大型静态组的条目也可能包括过多的成员,以致它们的表示会超出此限制。但是,出于性能考虑,不推荐使用这样的组,您应该考虑重新设计目录结构。有关详细信息,请参阅“管理组”

要修改服务器强制执行的客户机发送数据的大小限制,请执行以下操作:

  1. cn=config 条目的 nsslapd-maxbersize 属性设置一个新值。
  2. 要使用控制台执行此操作,请以管理员或目录管理员的身份登录,并按照“使用通用编辑器修改条目”中所述的步骤编辑 cn=config 条目。将 nsslapd-maxbersize 属性设为客户机可以一次发送的最大字节数。
  3. 要从命令行执行此操作,请使用以下命令:
  4. ldapmodify -h host -p port -D "cn=Directory Manager" -w password
    dn: cn=config
    changetype: modify
    replace: nsslapd-maxbersize
    nsslapd-maxbersize: sizeLimitInBytes
    ^D

    有关详细信息,请参阅《Directory Server Administration Reference》Chapter 2 中的 "nsslapd-maxbersize"

  5. “启动和停止 Directory Server” 中所述,重新启动服务器。

错误处理

命令行工具按顺序处理 LDIF 输入中的所有条目或修改。默认行为是当第一个错误发生时停止处理。使用 -c 选项继续处理所有输入,而不管任何错误。在工具的输出中将看到错误状态。

除了以上列出的注意事项,常见错误有:

有关错误状态和如何避免这些错误的详细信息,请参阅《Directory Server Resource Kit Tools Reference》中的 Chapter 4 "ldapmodify"Chapter 5 "ldapdelete"

使用 ldapmodify 添加条目

可使用 ldapmodify-a 选项将一个或多个条目添加到目录。以下示例创建一个结构条目以包含用户,然后创建一个用户条目:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: ou=People,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: People
description: Container for user entries

dn: uid=bjensen,ou=People,dc=example,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetorgPerson
uid: bjensen
givenName: Barbara
sn: Jensen
cn: Babs Jensen
telephoneNumber: (408) 555-3922
facsimileTelephoneNumber: (408) 555-4000
mail: bjensen@example.com
userPassword: clearPassword

-D-w 选项分别给出具有权限创建这些条目的用户的绑定 DN 和口令。-a 选项表示将添加 LDIF 中的所有条目。然后每个条目由其 DN 和属性值给定,每个条目间有一个空白行。ldapmodify 公用程序将在条目输入和报告所有错误后创建每个条目。

按照约定,条目的 LDIF 按照以下顺序列出属性:

当为 userpassword 属性输入值时,请给出明文形式的口令。服务器会将该值加密并仅存储加密值。一定要限制读取权限以保护 LDIF 文件中的明文口令。

也可使用 LDIF 的另一种形式,该形式在命令行中不需要 -a 选项。该形式的优点是可将条目条件和下一段中显示的条目修改语句合并。

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: ou=People,dc=example,dc=com
changetype: add
objectclass: top
objectclass: organizationalUnit
ou: People
description: Container for user entries

dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: add
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetorgPerson
uid: bjensen
givenName: Barbara
sn: Jensen
cn: Barbara Jensen
telephoneNumber: (408) 555-3922
facsimileTelephoneNumber: (408) 555-4000
mail: bjensen@example.com
userPassword: clearPassword

changetype:add 关键字表示具有给定 DN 的条目在创建时应带有所有后续的属性。所有其他选项和 LDIF 约定都一样。

两个示例中都可使用 -f filename 选项从文件读取 LDIF,而非从终端输入读取。按照 -a 选项的用法,LDIF 文件必须包含与终端输入相同的格式。

使用 ldapmodify 修改条目

使用 changetype:modify 关键字添加、替换或删除现有条目中的属性及其值。当指定 changetype:modify 时,必须也提供一个或多个更改操作以表示条目将如何修改。以下示例中显示了三个可能的 LDIF 更改操作:

dn: entryDN
changetype: modify
add: attribute
attribute
: value
...
-
replace: attribute
attribute
: newValue
...
-
delete: attribute
[attribute: value]
...

在一行中使用连字号 (-) 以分开在同一条目上的操作,使用一空白行分开多组在不同条目上的操作。也可为每个操作给出多个 attributevalue 对以同时添加、替换或删除它们。

添加属性值

以下示例显示如何使用同一 add LDIF 语法将值添加到现有多值属性中或尚不存在的属性中:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
add: cn
cn: Babs Jensen
-
add: mobile
mobile: (408) 555-7844
mobile: (408) 555-7845

处于以下情况时,这些操作可能失败且服务器将返回一个错误:

使用二进制属性子类型

attribute;binary 子类型表示应将属性值作为二进制数据通过 LDAP 来传递,而不管其实际语法是什么。该子类型是为没有 LDAP 字符串表示法的复杂语法(如 userCertificate)设计的。二进制子类型不应当用于此外的其他目的。

可在与 ldapmodify 命令一起使用的任何 LDIF 语句中为属性名称添加适当的子类型。

要输入二进制值,可直接在 LDIF 文本中输入或从另一个文件中读取。以下示例显示了从文件读取二进制值的 LDIF 语法:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
version: 1
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
add: userCertificate;binary
userCertificate;binary:< file:///path/certFile

要使用 < 语法来指定文件名,必须以行 version:1 作为 LDIF 语句的开头。ldapmodify 处理此语句时,它将该属性设置为可以从给定文件的全部内容中读取的值。

添加一个具有 Language 子类型的属性

属性的 Language 和 pronunciation 子类型指定本地化的值。当为一个属性指定 language 子类型时,该子类型将按照以下方式添加到属性名称中:

attribute;lang-CC

其中 attribute 是现有属性类型,CC 是两个字母的国家(地区)代码以指定语言。可选择为 language 子类型添加 pronunciation 子类型以指定本地化值的等效语音。在这种情况下,属性名称变为:

attribute;lang-CC;phonetic

要对具有子类型的属性执行操作,必须明确地匹配其子类型。例如,如果要修改包含 lang-fr language 子类型的属性值,则必须按如下所示在修改操作中包含 lang-fr

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
replace: homePostalAddress;lang-fr
homePostalAddress;lang-fr: 34\, avenue des Champs-Elysées

修改属性值

以下示例显示如何使用 LDIF 中的 replace 语法修改单值属性和多值属性的所有值:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
replace: sn
sn: Morris
-
replace: cn
cn: Barbara Morris
cn: Babs Morris

当使用 replace 语法时,将删除指定属性的所有当前值并添加所有给定值。

删除属性值

以下示例显示如何完全删除属性和仅删除多值属性的一个值:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
delete: facsimileTelephoneNumber
-
delete: cn
cn: Babs Morris

当使用 delete 语法而未指定属性:值 对时,将删除属性的所有值。如果指定属性:值 对,则将仅删除该值。

修改多值属性的一个值

为了使用 ldapmodify 命令修改多值属性的一个值,必须执行以下示例中显示的两种操作:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
delete: mobile
mobile: (408) 555-7845
-
add: mobile
mobile: (408) 555-5487

使用 ldapmodify 重命名条目

重命名条目时,将修改条目的相对标识名称 (RDN),该名称位于条目 DN 中的 属性=值 对的最左边。该属性称为命名属性,且必须以同一值存在于条目的属性中。

当为条目重命名时,不能更改 DN 的其他任何部分(如将条目移动到不同的子树)。要将条目移至完全不同的分支,必须使用旧条目的属性在其他子树中创建新条目,然后删除旧条目。

也不能重命名具有任何子条目的条目,因为父条目的 RDN 已用在子条目的 DN 中,且 DN 中的所有条目必须存在。要删除整个树,必须在新位置重建树。

使用 changetype:modrdn 关键字在 LDIF 语句中重命名条目。以下示例将为 Barbara Morris 重命名 uid 命名属性:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=bmorris
deleteoldrdn: 1

newrdn 行使用 attribute=value 语法给出新的命名属性。deleteoldrdn 行表示是否应同时将前命名属性从条目中删除(1 为是,0 为否)。在两种情况下,新的命名属性都将被添加到条目。

使用 ldapdelete 删除条目

使用 ldapdelete 命令行公用程序从目录中删除条目。此公用程序绑定到目录服务器并删除一个或多个由其 DN 给定的条目。必须提供具有权限以删除指定条目的绑定 DN。

基于同样的原因,不能重命名父条目,不能删除具有子条目的条目。LDAP 协议禁止出现子条目将不再拥有父条目的情形。例如,不能删除组织单位条目,除非首先删除了属于组织单位的所有条目。


警告

不要删除后缀 o=NetscapeRoot。Administration Server 使用此后缀存储有关已安装的 Sun Java System 服务器的信息。删除此后缀会强制您重新安装所有 Sun Java System 服务器,包括 Directory Server。


以下示例中,组织单位中仅有一个条目,因此可删除它,然后删除父条目:

ldapdelete -h host -p port -D "cn=Directory Manager" -w password
uid=bjensen,ou=People,dc=example,dc=com
ou=People,dc=example,dc=com

使用 ldapmodify 删除条目

也可使用 changetype:delete 关键字以使用 ldapmodify 公用程序删除条目。当使用以上说明的 ldapdelete 时,也同样具有这些限制。使用 LDIF 语法删除条目的优点在于,您可以在单个 LDIF 文件中执行混合操作。

下面的示例将执行与前面的示例相同的删除操作:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: delete

dn: ou=People,dc=example,dc=com
changetype: delete


设置引用

使用引用告诉客户机应用程序,如果信息在本地不可用,应联系哪个服务器。引用是指向远程后缀或条目的指针,Directory Server 将其作为结果返回到客户机。然后,客户机必须在引用中指定的远程服务器上再次执行该操作。在三种情况下,会发生重定向:

在所有情况下,引用即包含主机名、端口号以及其他服务器上的 DN(可选)的 LDAP URL。有关详细信息,请参阅《Directory Server Administration Reference》中的 Chapter 6 "LDAP URL Reference"。有关如何在目录部署中使用引用的概念性信息,请参阅《Directory Server Deployment Planning Guide》中的 Chapter 5 "Distribution, Chaining, and Referrals"

以下小节说明定义目录的默认引用和智能引用的过程。

设置默认引用

当客户机应用程序提交一个 DN 上的操作,而由目录维护的任何后缀都不包含此 DN 时,会将默认引用返回到客户机应用程序。默认引用有时称为全局引用,因为默认引用应用于目录中的所有后缀。服务器将返回所有定义的引用,但返回的顺序没有定义。

使用控制台设置默认引用

  1. 在 Directory Server Console 的顶级“配置”选项卡上,选择配置树根部的服务器节点,然后在右侧面板中选择“网络”选项卡。
  2. 选中“返回引用”复选框,并在文本字段中输入 LDAP URL。或者,单击“构造 URL”,由系统引导您定义一个 LDAP URL。到安全端口的 LDAP URL 的示例如下:
  3. ldaps://east.example.com:636/dc=example,dc=com

    可输入多个用空格分隔并用引号括起的引用 URL,如下所示:

    "ldap://east.example.com:389" "ldap://backup.example.com:389"

  4. 单击“保存”以使更改立即生效。

从命令行设置默认引用

使用 ldapmodify 命令行公用程序将一个或多个默认引用添加或替换到目录配置文件中的 cn=config 条目。例如:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: cn=config
changetype: modify
replace: nsslapd-referral
nsslapd-referral: ldap://east.example.com:389
nsslapd-referral: ldap://backup.example.com:389

无需重新启动服务器。

创建智能引用

智能引用允许将目录条目或目录树映射到特定的 LDAP URL。使用智能引用,可将客户机应用程序引用到特定服务器或特定服务器上的特定条目。

通常,智能引用指向一个在另一个服务器上有相同 DN 的实际条目。然而,可定义对相同服务器或不同服务器上的任何条目的智能引用。例如,可定义具有以下 DN 的条目:

uid=bjensen,ou=People,dc=example,dc=com

作为指向服务器 east.example.com 上的另一个条目的智能引用。

cn=BabsJensen,ou=Sales,o=east,dc=example,dc=com

目录使用智能引用的方法符合 RFC2251 (http://www.ietf.org/rfc/rfc2251.txt) 4.1.11 小节中指定的标准。

使用控制台创建智能引用

  1. 在 Directory Server Console 的顶级“目录”选项卡上,展开目录树,显示要成为智能引用的父级的条目。
  2. 右键单击“父条目",并选择“新建”>“引用”菜单项。或者,可以左键单击“父条目”将其选中,然后选择对象>“新建”>“引用”菜单项。
  3. 显示引用条目的自定义编辑器对话框。

  4. 在编辑器的“常规”选项卡上,输入引用的名称并从下拉列表中选择其命名属性。该名称将成为所选的命名属性的值。也可选择输入引用的说明字符串。
  5. 在编辑器的“URL”选项卡上,单击“构造”按钮以定义智能引用的 URL。在显示的对话框中输入 LDAP URL 的元素。
  6. URL 的元素包括持有引用条目的目录服务器的主机名和 LDAP 端口号,以及服务器上目标条目的 DN。默认情况下,目标 DN 就是智能引用条目的 DN。不过,目标 DN 可为任何后缀、子树或叶条目。

  7. 在 LDAP URL 构造对话框中单击“确定”。URL 显示在新引用文本框中。
  8. 单击新引用文本框旁的“添加”按钮,将引用添加到列表中。
  9. 可定义多个 URL 以作为该条目的引用返回。使用“构造”、“添加”、“删除”和“更改”按钮创建和管理引用列表。
  10. 单击引用验证按钮将显示一个对话框,其中可设置当 Directory Server Console 遵循对远程服务器的引用时用来绑定的凭证。可定义访问服务器时要使用的绑定 DN 和口令。所有对同一服务器的引用将使用相同的凭证。
  11. 使用“添加”、“编辑”和“删除”按钮管理服务器列表和相应的凭证。完成后单击“确定”。
  12. 在引用的自定义编辑器中,单击“确定”以保存智能引用条目。
  13. 在控制台的目录树中,应可在智能引用条目的位置看到目标子树或目标条目。如果智能引用条目上有黄色警告图标,则 URL 或凭证无效。双击条目,当看到“引用错误”时单击“继续”,并修改 URL 或“引用验证”以更正错误。

从命令行创建智能引用

要创建智能引用,请使用 referral 对象类和 extensibleObject 对象类创建条目。引用对象类允许 ref 属性,该属性将包含 LDAP URL。extensibleObject 对象类允许您使用任何架构属性作为命名属性,从而匹配目标条目。

例如,定义以下条目以返回智能引用,而非条目 uid=bjensen

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: referral
uid: bjensen
ref: ldap://east.example.com/cn=Babs%20Jensen,ou=Sales,
 o=east,dc=example,dc=com


服务器将忽略 LDAP URL 中空格后的所有信息。基于这个原因,必须在要作为引用使用的任何 LDAP URL 内使用 %20 代替空格。其他特殊字符必须被转义。


一旦定义了智能引用,对 uid=bjensen 条目的修改将实际在另一台服务器的 cn=Babs Jensen 条目上执行。ldapmodify 命令将自动遵循引用,例如:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: replace
replace: telephoneNumber
telephoneNumber: (408) 555-1234

为了修改智能引用条目,必须使用 ldapmodify-M 选项,例如:

ldapmodify -M -h host -p port -D "cn=Directory Manager" -w password
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: replace
replace: ref
ref: ldap://east.example.com/cn=Babs%20Jensen,ou=Marketing,
 o=east,dc=example,dc=com


为属性值加密

属性加密可以在将敏感数据存储在目录中时保护这些数据。属性加密允许您指定条目的某些属性以加密格式进行存储。这将防止数据存储在数据库文件、备份文件和导出的 LDIF 文件时可读。

使用此功能,属性值会在存储于 Directory Server 数据库之前将被加密,在返回到客户机之前被解密并恢复其原始值。必须使用访问控制来防止客户机在没有权限的情况下访问这些属性,并在属性值于客户机和Directory Server 之间传输时使用 SSL 来加密属性值。有关数据安全性常规信息和属性加密详细信息的结构性概述,请参阅《Directory Server Deployment Planning Guide》中的 Chapter 7 "Access Control, Authentication, and Encryption"

仅当服务器上配置并启用了 SSL 时,属性加密才有效。但是,在默认情况下所有属性都是不加密的。属性加密在后缀级别进行配置。这意味着属性加密应用于它在其中显示为某一后缀的所有条目。如果要在整个目录中对属性进行加密,则必须对所有后缀中的该属性启用加密。


警告

属性加密将影响到与后缀相关联的所有数据和索引文件。如果修改了现有后缀的加密配置,则必须首先导出其内容,进行配置更改,然后重新导入内容。控制台将帮助您执行这些步骤。

此外,当启用加密时,必须手动删除数据库缓存文件,该文件可能仍然包含未加密的值。

最好在以新的后缀加载或创建数据之前启用加密属性。


如果选择加密一个属性,且该属性是某些条目的命名属性,DN 中显示的值将不加密,但条目中存储的值将被加密。

可选择使用 userPassword 属性进行加密,不过,除非口令需要以明文方式存储(如 DIGEST-MD5 SASL 验证),否则这不会真正实现安全性。如果口令已具有口令策略中定义的加密机制,则进一步的加密对安全性不会提高太多,反而会影响每个绑定操作的性能。

在存储器中时,加密属性前面有密码标记,用于表示所使用的加密算法。使用 DES 加密算法的加密属性会以如下方式出现:

{CKM_DES_CBC}3hakcjla+=snda%

使用控制台配置属性加密

  1. 在 Directory Server Console 中选择“配置”选项卡,展开数据节点,然后选择要加密属性值的后缀。在右侧面板中选择“属性加密”选项卡。
  2. 该选项卡包含一个表格,表格中列出了此后缀的所有当前已加密的属性的名称和加密架构。

  3. 要启用属性的加密,请执行以下操作:
    1. 单击“添加属性”按钮,显示属性列表。
    2. 从列表中选择要加密的属性并单击“确定”。该属性将被添加到表格的属性名称列中。
    3. 从属性名称旁边的下拉列表中选择此属性的加密模式。
  4. 要使属性不再加密,请从表格中“选择属性”名称,并单击“删除属性”按钮。
  5. 单击“保存”。系统会提示您在修改配置之前将后缀的内容导出到一个 LDIF 文件。
  6. 单击“导出后缀”打开“导出”对话框,或单击“继续”修改属性加密配置而不进行导出操作。新配置随后将被保存。
  7. 如果还未导出后缀,则必须现在导出以保存其内容。当您计划使用该 LDIF 文件在下一步中重新初始化后缀时,如果后缀包含加密属性,则可在已导出的 LDIF 中继续保持加密。

    系统现在会提示您从 LDIF 文件初始化后缀。

  8. 单击“初始化后缀”打开“初始化”对话框,然后输入 LDIF 文件的名称以加载到目录中。
  9. 如果在上一步中导出了具有加密属性的后缀,则现在必须使用该文件进行初始化,因为一旦后缀重新初始化,已加密的值将无法恢复。文件加载完成并创建了索引后,指定属性的所有值就被加密了。

    如果不想立即初始化后缀,请单击“关闭”。稍后可以使用“导入数据”中所述的步骤导入数据。

  10. 如果已更改配置对一个或多个属性进行加密,且这些属性在导入操作前具有值,则那些未加密的值中的一部分可能在数据库缓存中仍然可见。要清除数据库缓存,请执行以下操作:
    1. “启动和停止 Directory Server”中所述,停止 Directory Server。
    2. 作为 root 或具有管理员特权的用户,从文件系统中删除数据库缓存文件:
    3. ServerRoot/slapd-server ID/db/__db.*

    4. 再次启动 Directory Server。服务器将自动创建新的数据库缓存文件。

从命令行配置属性加密

  1. 如果要配置属性加密的后缀包含任何条目,则必须先将该后缀的内容导出到 LDIF 文件。有关详细信息,请参阅“导出数据”
  2. 当您计划使用该 LDIF 文件在步骤 5 中重新初始化后缀时,如果后缀包含加密属性,则可在已导出的 LDIF 中继续保持加密。

  3. 要启用属性的加密,请使用 ldapmodify 命令添加以下配置条目:
  4. ldapmodify -a -h host -p port -D cn=Directory Manager -p password
    dn: cn=attributeName, cn=encrypted attributes, cn=databaseName,
     cn=ldbm database, cn=plugins, cn=config
    objectclass: top
    objectclass: dsAttributeEncryption
    cn: attributeName
    dsEncryptionAlgorithm: cipherName

    其中 attributeName 是要加密的属性的类型名称,databaseName 是与后缀对应的数据库的符号名称,而 cipherName 是以下任一项:

    • ckm_des_cbc—DES 块密码
    • ckm_des3_cbc—三元 DES 块密码
    • ckm_rc2_cbc—RC2 块密码
    • ckm_rc4—RC4 流密码
  5. 要使属性不再加密,请使用 ldapmodify 命令修改以下配置条目:
  6. ldapmodify -h host -p port -D cn=Directory Manager -p password
    dn: cn=attributeName, cn=encrypted attributes, cn=databaseName,
     cn=ldbm database, cn=plugins, cn=config
    changetype: modify
    replace: dsEncryptionAlgorithm
    dsEncryptionAlgorithm: clearText

    其中 attributeName 是要加密的属性的类型名称,databaseName 是与后缀对应的数据库的符号名称。


    不要删除属性加密配置条目。下次初始化后缀时,该条目将被自动删除。


  7. 如果已更改配置对一个或多个属性进行加密,且这些属性在导入操作前具有值,则那些未加密的值中的一部分可能在数据库缓存中仍然可见。要清除数据库缓存,请执行以下操作:
    1. “启动和停止 Directory Server”中所述,停止 Directory Server。
    2. 作为 root 或具有管理员特权的用户,从文件系统中删除数据库缓存文件:
    3. ServerRoot/slapd-server ID/db/__db.*

    4. 再次启动 Directory Server。服务器将自动创建新的数据库缓存文件。该后缀中操作的性能将受到轻微的影响,直到缓存被重新填充。
  8. “导入数据”中所述,使用 LDIF 文件初始化后缀。
  9. 文件加载完成并创建了相应的索引后,指定属性的所有值就被加密了。


维护引用的完整性

引用完整性是确保相关条目之间的关系得以维持的一种插件机制。几种属性类型(如用于组成员身份的属性)包含另一个条目的 DN。引用完整性可用于确保当条目被删除时,所有包含其 DN 的属性也将被删除。

例如,如果从目录中删除了某个用户的条目且启用了引用完整性,则服务器还从包含此用户成员的任何组中删除此用户。如果未启用引用完整性,则必须由管理员手动从组中删除此用户。如果未启用引用完整性,则用户必须由管理员手动从组中删除。如果您要将 Directory Server 与依赖用户和组管理的目录的其他 Sun Java System 产品集成,则这是一个重要功能。

引用完整性的工作方式

启用引用完整性插件时,它在执行了删除或重命名操作后,立即对特定属性执行完整性更新。但默认情况下,系统禁用引用完整性插件。

不论何时删除或重命名目录中的用户条目或组条目,操作都记录到引用完整性日志文件中:

ServerRoot/slapd-server ID/logs/referint

在指定的时间(即更新时间间隔)后,服务器对已启用引用完整性的所有属性执行搜索,并将此搜索获得的条目与日志文件中已删除或已修改的条目的 DN 进行匹配。如果日志文件显示已删除条目,则删除对应的属性。如果日志文件显示已更改条目,则相应地修改对应的属性值。

当启用了引用完整性插件的默认配置时,每次执行删除或重命名操作后,此插件对 memberuniquememberownerseeAlsonsroledn 属性执行完整性更新。但是,可以配置引用完整性插件的行为以适合您的需要:

配置引用完整性

使用以下步骤从 Directory Server Console 启用或禁用引用完整性以及配置插件:

从控制台配置引用完整性

  1. 在 Directory Server Console 的顶级“配置”选项卡上,展开插件节点,然后选择“referential integrity postoperation”插件。
  2. 该插件的设置显示在右侧面板中。

  3. 选中“启用插件”复选框可启用该插件,取消选中此复选框可禁用该插件。
  4. 设置参数 1 的值以修改更新时间间隔(以秒为单位)。通用值为:
    • 0—每次操作后立即更新。这是默认值。请注意,每次执行了删除或修改操作后立即进行引用完整性检查会严重影响服务器的性能。
    • 90—每 90 秒钟更新一次
    • 3600—每小时更新一次
    • 10,800—每 3 小时更新一次
    • 28,800—每 8 小时更新一次
    • 86,400—每天更新一次
    • 604,800—每周更新一次
    • 基于完整性和整体性能之间的平衡,设置合理的值。

  5. 将参数 2 的值设置为要使用的引用完整性日志文件的绝对路径。
  6. 参数 3 未使用,但是必须存在。

  7. 为引用完整性而监视的属性从参数 4 开始列出,单击“添加”和“删除”按钮管理该列表以及添加自己的属性。

  8. 为获得最佳性能,由引用完整性插件更新的属性也应该被编制索引。有关信息,请参阅第 10 章“创建目录数据的索引”


  9. 单击“保存”保存更改。
  10. 要使更改生效,必须重新启动 Directory Server。

将引用完整性与复制一起使用

在复制环境中使用引用完整性插件时存在一定的限制:

要在复制拓扑结构中配置引用完整性插件,请执行以下操作:

  1. 确保所有副本已配置且所有复制协议已定义。
  2. 确定要为其维护引用完整性的属性集。也请确定要在主服务器上使用的更新时间间隔。
  3. 使用相同的属性集和相同的更新时间间隔,在所有主服务器上启用引用完整性插件。此过程在“配置引用完整性”中已进行了说明。
  4. 确保在全部的使用者服务器上禁用引用完整性插件。

将引用完整性与旧版复制一起使用

从 4.x 主服务器向 5.x 使用者复制时,在启用引用完整性的情况下,必须在 4.x 主服务器上重新配置引用完整性插件,才能将引用完整性更改写入 4.x 更改日志。此操作使引用完整性更改被复制。如果您没有重新配置插件,那么引用完整性将无法正常工作。

在以下环境中重新配置引用完整性插件:

  1. 停止 4.x 服务器。
  2. 打开位于 ServerRoot/slapd-server ID/config/ 下的 slapd.ldbm.conf 文件。
  3. 找到以下面的句子开始的行:
  4. plugin postoperation on referential integrity postoperation

  5. 通过将属性列表前的参数 0 更改为 1 来修改此行。
  6. 例如,将

    plugin postoperation on "referential integrity postoperation" "ServerRoot/lib/referint-plugin.dll" referint_postop_init 0 "ServerRoot/slapd-serverID/logs/referint" 0 "member" "uniquemember" "owner" "seeAlso"

    更改为

    plugin postoperation on "referential integrity postoperation" "ServerRoot/lib/referint-plugin.dll" referint_postop_init 0 "ServerRoot/slapd-serverID/logs/referint" 1 "member" "uniquemember" "owner" "seeAlso"

  7. 保存 slapd.ldbm.conf 文件。
  8. 重新启动服务器。
  9. 从 4.x 供应商重新初始化 5.x 使用者。


搜索目录

可以使用任何 LDAP 客户机在目录中查找条目。大多数客户机都提供了某些形式的搜索界面,使您能够搜索目录和检索条目信息。

已在目录中设置的访问控制决定了搜索的结果。普通用户通常不会“看见”很多目录,而目录管理员对所有数据(包括配置)有完整访问权。

使用 ldapsearch 搜索目录

还可以使用 ldapsearch 命令行公用程序来查找和检索目录条目。注意,这一节描述的公用程序 ldapsearch 不是 Solaris 平台附带的公用程序,但它是Directory Server 资源工具包的一部分。有关此公用程序的详细信息,请参阅《Directory Server Resource Kit Tools Reference》。

该公用程序将使用指定的用户身份(经常是识别名)和口令来打开与服务器的连接,并基于搜索过滤器查找条目。搜索范围可以包括一个条目、条目的直接子条目或整个树或子树。

搜索结果以 LDIF 格式返回。

ldapsearch 命令行格式

使用 ldapsearch,必须使用如下格式输入命令:

ldapsearch [optional_options] [search_filter] [optional_list_of_attributes]

其中

使用特殊字符

使用 ldapsearch 命令行公用程序时,可能需要指定包含对命令行解释程序有特殊意义的字符(如空格 [ ]、星号 [*]、反斜杠 [\] 等)的值。指定特殊字符时,用引号 ("") 将值括起来。例如:

-D "cn=Charlene Daniels,ou=People,dc=example,dc=com"

根据命令行解释程序的具体情况,请使用单引号或双引号达到此目的。有关详细信息,请参阅 shell 文档。

常用的 ldapsearch 选项

下面列出了常用的 ldapsearch 命令行选项。如果指定的值包含空格 [ ],该值应当用双引号括起来,例如,-b "ou=groups,dc=example,dc=com"

-b

指定搜索的起点。这里指定的值必须是当前存在于数据库中的标识名称。如果 LDAP_BASEDN 环境变量已经设置为基本 DN,则该选项是可选的。

在该选项中指定的值应当放在双引号中。例如:

-b "cn=Charlene Daniels, ou=People, dc=example,dc=com"

-D

指定标识名称,使用此名称对服务器进行验证。如果服务器支持匿名访问,则该选项是可选的。如果指定了此值,它必须是由 Directory Server 识别的 DN,而且它还必须有修改此条目的授权。例如:

-D "uid=cdaniels, dc=example,dc=com"

-h

指定用来安装 Directory Server 的计算机的主机名或 IP 地址。如果没有指定主机,则 ldapsearch 使用 localhost。例如,-h myServer

-l

指定等待执行完一次搜索请求的最大秒数。不管在这里指定的值是什么,ldapsearch 的等待时间永远不会超过服务器的 nsslapd-timelimit 属性所允许的时间(除非发生持久搜索)。有关持久搜索的详细信息,请参阅《Directory Server Resource Kit Tools Reference》中的 Chapter 3 "ldapsearch"

例如,-l300nsslapd-timelimit 属性的默认值是 3,600 秒(1 小时)。

-p

指定 Directory Server 使用的 TCP 端口号。例如,-p5201。默认是 389,使用 SSL 选项时是 636。

-s

指定搜索的范围。范围可是下列一种:

  • base—仅搜索在 -b 选项中指定的、或由 LDAP_BASEDN 环境变量定义的条目。
  • one—仅搜索在 -b 选项中指定的条目的直接子条目。只搜索子条目,不搜索在 -b 选项中指定的实际条目。
  • sub—搜索在 -b 选项中指定的条目及其所有后代条目。就是说,以 -b 选项中指定的条目为起点,执行子树搜索。这是默认值。

-w

指定与在 -D 选项中指定的标识名称相关联的口令。如果不指定该选项,则使用匿名访问。例如,-w diner892

-x

指定在服务器上而不是客户机上对搜索结果进行排序。如果想要按照匹配规则排序(在国际搜索情况下),则该选项是有用的。通常,在服务器上比在客户机上排序速度更快,尽管服务器端排序需要使用服务器资源。

-z

指定为响应搜索请求而返回的最大条目数。例如,-z 1000

通常,不管在这里指定的值是多少,ldapsearch 返回的条目数永远不会超过服务器的 nsslapd-sizelimit 属性所允许的条目数。但是,通过在使用该命令行参数时绑定为 root DN,可以覆盖该限制。绑定为 root DN 时,该选项默认值为零 (0)。nsslapd-sizelimit 属性的默认值为 2,000 个条目。

有关所有 ldapsearch 公用程序选项的详细信息,请参阅《Directory Server Resource Kit Tools Reference》。

ldapsearch 示例

在下一组示例中,假设有如下情况:

返回所有条目

在给定上述信息的情况下,以下调用将返回目录中的所有条目:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -b "dc=example,dc=com" -s sub "(objectclass=*)"

"(objectclass=*)" 是匹配目录中任何条目的搜索过滤器。

在命令行上指定搜索过滤器

可以直接在命令行上指定搜索过滤器。如果这样做,一定要将过滤器包括在引号中(“过滤器”)。而且,不要指定 -f 选项。例如:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -b "dc=example,dc=com" "(cn=Charlene Daniels)"

搜索根 DSE 条目

根 DSE 是特殊的条目,它包含与当前的服务器实例相关的信息,例如,受支持的后缀列表、可用的验证机制等等。通过提供 "" 搜索基础,可以搜索该条目。还必须指定搜索范围 base 和过滤器 "(objectclass=*)"。例如:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -b "" -s base "(objectclass=*)"

搜索架构条目

Directory Server 将所有目录服务器架构存储在特殊的 cn=schema 条目中。该条目包含了为目录服务器定义的每个对象类和属性的相关信息。

可以按如下方式检查该条目的内容:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -b "cn=schema" -s base "(objectclass=*)"


为了严格遵守规则,给定条目的架构子条目的位置由 subschemaSubentry 操作属性指定。在该版本的 Directory Server 中,该属性的值始终是 cn=schema


使用 LDAP_BASEDN

为了使搜索更容易,可以使用 LDAP_BASEDN 环境变量来设置搜索基础。这样做允许您跳过用 -b 选项指定搜索基础的步骤(有关如何设置环境变量的信息,请参阅操作系统的文档)。

通常,将 LDAP_BASEDN 设置为目录的后缀值。由于目录后缀等于根,或目录中最上面的条目,所以这将导致所有搜索从目录的根条目开始。

例如,如果已经将 LDAP_BASEDN 设置为 dc=example,dc=com,则可以使用如下命令行调用在目录中搜索 (cn=Charlene Daniels)

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 "(cn=Charlene Daniels)"

在该示例中,使用了 sub 的默认范围,这是因为没有用 -s 选项指定范围。

显示属性的子集

ldapsearch 命令以 LDIF 格式返回所有搜索结果。默认情况下,ldapsearch 返回条目的标识名称,以及允许您读取的所有属性。可以将目录访问控制设置为只允许您读取任何给定目录条目的属性的子集。只有操作属性不会返回。如果想让操作属性作为搜索操作的结果返回,必须在搜索命令中明确指定它们。有关操作属性的详细信息,请参阅《Directory Server Administration Reference》中的 Chapter 11 "Operational Attributes"

假设您不想看见在搜索结果中返回的所有属性。您可以在命令行中紧靠搜索过滤器的后面指定您想看见的属性,以便将返回属性限制为只有少量具体属性。例如,要显示目录中每个条目的 cnsn 属性,请使用如下命令:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 "(objectclass=*)" sn cn

该示例假定您使用 LDAP_BASEDN 设置搜索基础。

搜索多值属性

在搜索期间,Directory Server 不一定以经过排序的顺序返回多值属性。例如,假设想要搜索要求服务器在更改生效之前重新启动的 cn=config 的配置属性。

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -b cn=config "(objectclass=*)" nsslapd-requiresrestart

将返回下列结果:

dn: cn=config
nsslapd-requiresrestart: cn=config:nsslapd-port
nsslapd-requiresrestart: cn=config:nsslapd-secureport
nsslapd-requiresrestart: cn=config:nsslapd-plugin
nsslapd-requiresrestart: cn=config:nsslapd-changelogdir
nsslapd-requiresrestart: cn=config:nsslapd-changelogsuffix
nsslapd-requiresrestart: cn=config:nsslapd-changelogmaxentries
nsslapd-requiresrestart: cn=config:nsslapd-changelogmaxage
nsslapd-requiresrestart: cn=config:nsslapd-db-locks
nsslapd-requiresrestart: cn=config:nsslapd-return-exact-case
nsslapd-requiresrestart: cn=config,cn=ldbm database,cn=plugins,
  cn=config:nsslapd-allidsthreshold
nsslapd-requiresrestart: cn=config,cn=ldbm database,cn=plugins,
  cn=config:nsslapd-dbcachesize
nsslapd-requiresrestart: cn=config,cn=ldbm database,cn=plugins,
  cn=config:nsslapd-dbncache
nsslapd-requiresrestart: cn=config,cn=ldbm database,cn=plugins,
  cn=config:nsslapd-directory
nsslapd-requiresrestart: cn=encryption,cn=config:nssslsessiontimeout
nsslapd-requiresrestart: cn=encryption,cn=config:nssslclientauth
nsslapd-requiresrestart: cn=encryption,cn=config:nssslserverauth
nsslapd-requiresrestart: cn=encryption,cn=config:nsssl2
nsslapd-requiresrestart: cn=encryption,cn=config:nsssl3
...

如上所示,nsslapd-requiresrestart 属性接受多个值。但是,这些值不是按排序后的顺序提供的。如果您开发的应用程序需要以排序顺序提供的多值属性,请应当确保应用程序执行排序。

搜索时使用客户机验证

该示例显示用户 cdaniels 使用客户机验证搜索目录:

ldapsearch -h myServer -p 636 -b "dc=example,dc=com"
 -N "cdanielsscertname" -Z -W certdbpassword
 -P /home/cdaniels/certdb/cert.db "(givenname=Richard)"

LDAP 搜索过滤器

搜索过滤器会选择搜索操作所返回的条目。它们大多数情况下与 ldapsearch 命令行公用程序一起使用。使用 ldapsearch 时,可以在文件中放置多个搜索过滤器,每个过滤器在文件中单独的一行上,也可以直接在命令行指定搜索过滤器。

例如,如下过滤器指定对通用名 Lucie Du Bois 的搜索:

(cn=Lucie Du Bois)

该搜索过滤器返回包含通用名 Lucie Du Bois 的所有条目。搜索通用名值不区分大小写。

如果通用名属性有与语言标记关联的值,则返回所有值。这样,如下两个属性值都与该过滤器匹配:

cn: Lucie Du Bois

cn;lang-fr: Lucie Du Bois

搜索过滤器语法

搜索过滤器的基本语法是:

(attribute operator value)

例如:

(buildingname>=alpha)

该示例中,buildingname 是属性,>= 是运算符,alpha 是值。您定义的过滤器也可以使用通过布尔运算符组合在一起的不同属性。

下面各节详细介绍了搜索过滤器:

在搜索过滤器中使用属性

搜索条目时,可以指定与条目的类型关联的属性。例如,搜索人员条目时,可以使用 cn 属性来搜索有特定通用名的人员。

下面是人员条目可能包括的属性的示例:

有关与条目类型关联的属性的列表,请参阅《Directory Server Administration Reference》。

在搜索过滤器中使用运算符

表 2-2 列出了可以在搜索过滤器中使用的运算符:

表 2-2 搜索过滤器运算符

搜索类型

运算符

说明

等式

=

返回的条目中包含与指定的值完全匹配的属性值。例如,cn=Bob Johnson

子字符串

=string*
string

返回的条目中包含其中包含指定的子字符串的属性。例如:

cn=Bob*
cn=*Johnson
cn=*John*
cn=B*John

(星号 (*) 表示零 (0) 或更多字符。)

大于等于

>=

返回的条目中包含大于等于指定值的属性。例如:

buildingname >= alpha

小于等于

<=

返回的条目中包含小于等于指定值的属性。例如:

buildingname <= alpha

存在

=*

返回的条目中包含指定属性的一个或多个值。例如:

cn=*

telephonenumber=*

manager=*

近似

~=

返回的条目中包含其值近似等于搜索过滤器中指定值的指定属性。例如:

cn~=suret

l~=san fransico

可以返回

cn=sarette

l=san francisco

近似运算符是实验性的,只对英语字符串有效。对非 ASCII 字符串(如 Ja 或 Zn)无效。

扩展运算符用于将搜索扩展到 dn 属性(例如 cn:dn:=John),并为国际化搜索提供支持。

使用复合搜索过滤器

可以使用以前缀表示法表示的布尔运算符将多个搜索过滤器组件组合在一起,如下所示:

(Boolean-operator(filter)(filter)(filter)...)

其中,Boolean-operator表 2-3 列出的任意一个布尔运算符。

布尔运算符可以组合和嵌套在一起,形成复杂的表达式,例如:

(Boolean-operator(filter)(Boolean-operator(filter)(filter)))

可用于搜索过滤器的布尔运算符包括:

表 2-3 搜索过滤器布尔运算符

运算符

符号

说明

AND

&

所有指定的过滤器必须是 true,然后语句才能是 true。
例如,

((filter)(filter)(filter)...)

OR

|

至少有一个指定的过滤器必须为 true,然后语句才能是 true。例如,

(|(filter)(filter)(filter)...)

NOT

!

指定的语句必须不是 true,然后语句才能是 true。只有一个过滤器受 NOT 运算符影响。例如,

(!(filter))

对布尔表达式的评估遵循如下顺序:

使用文件指定搜索过滤器

可以不将搜索过滤器输入命令行,而是将它们输入文件。这样做时,应在文件中单独的一行上指定每个搜索过滤器。ldapsearch 命令以每个搜索在文件中的出现顺序运行每个搜索。

例如,如果文件包含:

(sn=Daniels)
(givenname=Charlene)

那么,ldapsearch 首先查找姓为 Daniels 的所有条目,然后查找名为 Charlene 的所有条目。如果发现条目与这两个搜索条件都匹配,则条目将返回两次。

例如,假设您在名为 searchdb 的文件中指定前面的搜索过滤器,并使用 LDAP_BASEDN 设置搜索基础。以下命令行将返回与任一搜索过滤器匹配的所有条目:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -f searchdb

通过在搜索行的末尾指定需要的属性名称,可以限制在这里返回的属性集。例如,如下 ldapsearch 命令将执行这两个搜索,但只返回每个条目的 DN 和 givenname 以及 sn 属性:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 -f searchdb sn givenname

在搜索过滤器中指定包含逗号的 DN

搜索过滤器中的 DN 包含逗号并将它作为其值的一部分时,必须用反斜杠 (\) 将逗号转义。例如,要查找 example.com Bolivia, S.A. 子树中的每个人,请使用如下命令:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password -s base -b "o=example.com Bolivia\, S.A.,dc=example,dc=com" "(objectclass=*)"

搜索过滤器示例

以下过滤器将搜索包含 manager 属性的一个或多个值的条目。这也称为存在搜索:

(manager=*)

以下过滤器将搜索包含通用名 Ray Kultgen 的条目。这也称为等式搜索:

(cn=Ray Kultgen)

以下过滤器将返回包含描述属性并且该属性包含子字符串 X.500 的所有条目:

(description=*X.500*)

以下过滤器将返回其组织单位是 Marketing 且其描述字段不包含子字符串 X.500 的所有条目:

((ou=Marketing)(!(description=*X.500*)))

以下过滤器将返回其组织单位是 Marketing 且其 manager 为 Julie Fulmer 或 Cindy Zwaska 的所有条目:

(&(ou=Marketing)(|(manager=cn=Julie Fulmer,ou=Marketing,
 dc=example,dc=com)(manager=cn=Cindy Zwaska,ou=Marketing,
 dc=example,dc=com)))

以下过滤器返回不表示人的所有条目:

(!(objectClass=person))

注意,上面的过滤器将对性能有负面影响,并且应当作为复杂搜索的一部分使用。以下过滤器返回不表示人且其通用名类似于 printer3b 的所有条目:

(&(cn~=printer3b)(!(objectClass=person)))

搜索操作属性

如果想让操作属性作为搜索操作的结果返回,必须在搜索命令中明确指定它们。

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 "(objectclass=*)" aci

要检索除了明确指定的操作属性以外的常规属性,除了操作属性外,还需要指定 "*"。例如:

ldapsearch -h myServer -p 5201 -D "cn=directory manager" -w password
 "(objectclass=*)" aci *


使用 DSMLv2 访问目录

以下示例说明如何使用 DSML 请求来访问和搜索目录。有关 DSML 相关属性的完整列表和关于 DSMLv2 标准的信息,请参阅《Directory Server Administration Reference》Chapter 3 中的"Frontend Plugin Attributes"

本节包含以下示例:

注意,这些示例中的 content-length:头信息包含 DSMLv2 请求的完整长度。为了让这些示例正常工作,请确保您使用的编辑器会保持这些内容长度,否则请相应地修改它们。

空的匿名 DSML "Ping" 请求

默认情况下,DSML 前端处于禁用状态。有关如何启用它的信息,请参阅“启用 DSML 请求”。要检查 DSML 前端是否已启用,请发送空的 DSML 批请求,如代码示例 2-1 所示:

代码示例 2-1 空的匿名 DSML 请求

POST /dsml HTTP/1.1
content-length: 451
HOST: hostMachine
SOAPAction: ""
Content-Type: text/xml
Connection: close

<?xml version=’1.0’ encoding=’UTF-8’?>
<soap-env:Envelope
   xmlns:xsd=’http://www.w3.org/2001/XMLSchema’
   xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’
   xmlns:soap-env=’http://schemas.xmlsoap.org/soap/envelope/’>

   <soap-env:Body>
      <batchRequest
          xmlns=’urn:oasis:names:tc:DSML:2:0:core’           requestID=’Ping!’>
          <!-- empty batch request -->
      </batchRequest>
   </soap-env:Body>
</soap-env:Envelope>

该 DSML 请求的第一部分包含 HTTP 方法行 (POST /dsml HTTP/1.1),其后是很多 HTTP 头。HTTP 方法行指定 DSML 前端将使用的 HTTP 方法请求和 URL。POST 是 DSML 前端所接受的唯一的 HTTP 方法请求。/dsml URL 是 Directory Server 的默认 URL,但是可以使用任何其他的有效 URL 配置它。后面的 HTTP 头指定 DSML 请求的其余细节。

请求的其余部分是 SOAP/DSML 部分。DSML 请求以 XML 序言头信息开始:

<?xml version=’1.0’ encoding=’UTF-8’?>

它指定请求必须以 UTF8 字符集编码。头信息后面是 SOAP 包络和正文元素,其中强制性包括 XML 架构、XML 架构实例和 SOAP 名称空间。

DSML 批请求元素标志 DSML 批请求的开始,它的后面紧接着强制性包括的 DSMLv2 名称空间:

xmlns=’urn:oasis:names:tc:DSML:2:0:core’.

可以通过以下请求 ID 来标识请求

requestID=’Ping!’>

空的批请求

<!-- empty batch request -->

是 XML 注释,使用关闭批请求、关闭 SOAP 正文和关闭 SOAP 包络元素,可以关闭 SOAP/DSML 批请求。

如果启用了 DSML 前端,则返回空的 DSML 响应:

HTTP/1.1 200 OK
Cache-control: no-cache
Connection: close
Date: Mon, 09 Sep 2002 13:56:49 GMT
Accept-Ranges: none
Server: Sun-ONE-Directory/5.2
Content-Type: text/xml; charset="utf-8"
Content-Length: 500

<?xml version=’1.0’ encoding=’UTF-8’ ?>
<soap-env:Envelope
   xmlns:xsd=’http://www.w3.org/2001/XMLSchema’
   xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’
   xmlns:soap-env=’http://schemas.xmlsoap.org/soap/envelope/’
   >
<soap-env:Body>
<batchResponse
   xmlns:xsd=’http://www.w3.org/2001/XMLSchema’
   xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’
   xmlns=’urn:oasis:names:tc:DSML:2:0:core’
   requestID=’Ping!’
   >
</batchResponse>
</soap-env:Body>
</soap-env:Envelope>

如果不返回任何内容,则可以判断前端已被禁用。

可同时连接到目录的客户机数和 DSML 请求的大小存在最大限制。客户机的限制数由 ds-dsml-poolsizeds-dsml-poolmaxsize 属性指定,而请求大小限制则由 ds-dsml-requestmaxsize 属性指定。有关 DSML 相关属性的详细信息,请参阅《Directory Server Administration Reference》Chapter 2 中的 "Frontend Plug-In Attributes" 一节。

发出 DSML 请求以便绑定为特殊用户

通过发出 DSML 请求,可以作为指定的用户或以匿名方式绑定到目录。要绑定为指定的用户,请求必须包括 HTTP 授权头信息,该头信息中必须包含映射到 dn 的 uid 和口令。

下面是 HTTP 授权请求示例:

POST /dsml HTTP/1.1
content-length: 578
Content-Type: text/xml; charset="utf-8"
HOST: hostMachine
Authorization: Basic ZWFzdGVyOmVnZw==
SOAPAction: ""
Connection: close

<?xml version=’1.0’ encoding=’UTF-8’?>
<soap-env:Envelope
   xmlns:xsd=’http://www.w3.org/2001/XMLSchema’
   xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’
   xmlns:soap-env=’http://schemas.xmlsoap.org/soap/envelope/’>
   <soap-env:Body>
     <batchRequest
        xmlns=’urn:oasis:names:tc:DSML:2:0:core’
        <extendedRequest>
          <requestName>1.3.6.1.4.1.4203.1.11.3</requestName>
        </extendedRequest>
     </batchRequest>
   </soap-env:Body>
</soap-env:Envelope>

在该示例中,HTTP 授权头信息传递了 uid easter 和口令 egg,而且它们是明文的,其格式为 easter:egg,并且以 base64 编码为 Authorization: Basic ZWFzdGVyOmVnZw==

<extendedRequest> 标记用来指定 LDAP 扩展操作。<requestName> 标记用来指定扩展操作的 OID。在该示例中,OID 1.3.6.1.4.1.4203.1.11.3 识别 whoami 扩展操作。有关 whoami 扩展操作的详细信息,请参阅 http://www.ietf.org/internet-drafts/draft-zeilenga-ldap-authzid-08.txt

对于匿名访问来说,尽管通常会受访问控制的严格约束,并且还可能受数据访问限制的制约,但匿名访问不需要有 HTTP 授权头信息。同样,可以发出 DSML 请求以便让 LDAP 代理执行 LDAP 操作。

因为 DSML 请求是成批进行管理的,所以,如果由 LDAP 代理发出请求,则必需的 DSML 代理授权请求必须是给定的一批请求中的第一个请求。

DSML 搜索请求

代码示例 2-2 显示了一个对根 DSE 条目的 DSML 基本对象搜索请求。

代码示例 2-2 DSML 搜索请求

POST /dsml HTTP/1.1
HOST: hostMachine
Content-Length: 1081
Content-Type: text/xml
SOAPAction: ""
Connection: close

<?xml version=’1.0’ encoding=’UTF-8’?>
<soap-env:Envelope
   xmlns:xsd=’http://www.w3.org/2001/XMLSchema’
   xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’
   xmlns:soap-env=’http://schemas.xmlsoap.org/soap/envelope/’
   >
   <soap-env:Body>
      <batchRequest
        xmlns=’urn:oasis:names:tc:DSML:2:0:core’
        requestID=’Batch of search requests’
        >
        <searchRequest
            dn=""
            requestID="search on Root DSE"
            scope="baseObject"
            derefAliases="neverDerefAliases"
            typesOnly="false"
            >
            <filter>
               <present name="objectClass"/>
            </filter>
            <attributes>
               <attribute name="namingContexts"/>
               <attribute name="supportedLDAPversion"/>
               <attribute name="vendorName"/>
               <attribute name="vendorVersion"/>
               <attribute name="supportedSASLMechanisms"/>
            </attributes>
        </searchRequest>
      </batchRequest>
   </soap-env:Body>
</soap-env:Envelope>

在该示例中:

对于与过滤器匹配的条目,使用如下代码表示是否存在 objectclass 过滤器:

<filter>
   <present name="objectClass"/>
</filter>

这等价于 LDAP 过滤器字符串 (objectclass=*)。该过滤器后面是需要的属性列表:

<attributes>
   <attribute name="namingContexts"/>
   <attribute name="supportedLDAPversion"/>
   <attribute name="vendorName"/>
   <attribute name="vendorVersion"/>
   <attribute name="supportedSASLMechanisms"/>
</attributes>



上一章      目录      索引      下一章     


版权所有 2004 Sun Microsystems, Inc. 所有权利保留。