管理条目的最佳方式取决于环境:
如果主要将 DSCC 用于管理,并且只需搜索或修改少量条目,请使用 DSCC。有关 DSCC 的详细信息,请参见目录服务控制中心界面。
如果不在目录服务器上执行任何管理任务,并且只需搜索或修改少量条目,请使用目录编辑器。有关目录编辑器的信息,请参见《Sun Java System Directory Editor 1 2005Q1 Installation and Configuration Guide》。
如果要搜索或修改大量条目,请使用命令行实用程序 ldapmodify 和 ldapdelete。
DSCC 允许您查看条目的所有可读属性以及编辑其可写属性。此外,您还可以添加和删除属性、设置多值属性,以及管理条目的对象类。有关如何使用 DSCC 管理条目的详细信息,请参见 DSCC 联机帮助。有关 DSCC 的一般详细信息,请参见目录服务控制中心界面。
目录编辑器是一种易于使用的目录编辑工具,允许管理员和最终用户搜索、创建和编辑数据。此数据采用用户、组和容器的形式。
ldapmodify 和 ldapdelete 命令行实用程序提供了用于添加、编辑和删除目录内容的完整功能。可以使用这些实用程序管理服务器的配置条目和用户条目中的数据。还可以使用这些实用程序编写脚本,以便对一个或多个目录执行批量管理。
本书中的过程几乎都使用了 ldapmodify 和 ldapdelete 命令。以下部分介绍执行这些过程所需的基本操作。有关 ldapmodify 和 ldapdelete 命令的详细信息,请参见《Sun Java System Directory Server Enterprise Edition 6.1 Reference》。
命令行实用程序的输入始终采用 LDIF 格式,可以直接从命令行或通过输入文件提供此输入。以下部分提供了与 LDIF 输入有关的信息,后续部分将介绍适用于每种修改类型的 LDIF 输入。
有关正确格式化 LDIF 输入的信息,请参见《Sun Java System Directory Server Enterprise Edition 6.1 Reference》中的“Guidelines for Providing LDIF Input”。
以下部分介绍这些基本操作:
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapmodify 的 -a 选项向目录中添加一个或多个条目。以下示例将创建包含用户的结构条目,然后再创建用户条目:
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind 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: secret |
-D 和 -w 选项分别提供用户的绑定 DN 和密码(该用户具有创建这些条目的权限)。-a 选项表示将添加 LDIF 中的所有条目。然后将按 DN 和属性值列出每个条目,各条目之间以空行分隔。ldapmodify 实用程序将在输入每个条目后创建该条目,并会报告任何错误。
按照约定,条目的 LDIF 将列出以下属性:
条目 DN。
对象类列表。
一个或多个命名属性。此属性是 DN 中使用的属性,它不一定属于必需属性。
所有对象类的必需属性列表。
要包含的所有允许的属性。
键入 userPassword 属性值时,请提供明文形式的密码。服务器将对此值进行加密,并且只存储加密的值。请务必限制读取权限以保护 LDIF 文件中出现的明文密码。
还可以使用另一种形式的 LDIF,它不要求在命令行中使用 -a 选项。此形式的优点是可以合并条目添加语句和条目修改语句,如以下示例所示。
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind 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: secret |
changetype: add 关键字表示应该使用所有后续属性创建具有给定 DN 的条目。所有其他选项和 LDIF 约定都与本部分前面的叙述相同。
在这两个示例中,都可以使用 -f filename 选项从文件(而非终端输入)中读取 LDIF。LDIF 文件所包含的格式必须与终端输入使用的格式相同,这取决于您是否使用 -a 选项。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 changetype: modify 关键字在现有条目中添加、替换或删除属性及属性值。指定 changetype: modify 时,还必须提供一个或多个更改操作,表明将如何修改条目。以下示例中显示了三种可能的 LDIF 更改操作:
dn: entryDN changetype: modify add: attribute attribute: value... - replace: attribute attribute: newValue... - delete: attribute [attribute: value] ... |
可以使用独占一行的连字符 (-) 分隔相同条目上的操作,并可使用空行来分隔不同条目上的操作组。还可以为每个操作提供多个 attribute: value 对。
无法使用 DSCC 执行此任务。请使用命令行,如以下过程所述。
以下示例显示如何使用相同的 add LDIF 语法向现有多值属性和尚未存在的属性中添加值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify add: cn cn: Babs Jensen - add: mobile mobile: (408) 555-7844 |
如果存在以下任一情况,则此操作可能会失败,并且服务器将返回错误:
属性中已存在给定的值。
值与为属性定义的语法不符。
条目的对象类不需要或不允许使用该属性类型。
属性类型不是多值类型,并且属性中已存在某个值。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
attribute;binary 子类型表示属性值必须作为二进制数据通过 LDAP 进行传输,而不考虑属性值的实际语法。此子类型适用于没有 LDAP 字符串表示的复杂语法,如 userCertificate。不应将二进制子类型用于其他目的。
在 ldapmodify 命令中使用时,可以将相应的子类型添加到任何 LDIF 语句的属性名称中。
要输入二进制值,可以在 LDIF 文本中直接键入或从其他文件读取。以下示例显示了用于从文件读取二进制值的 LDIF 语法:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: version: 1 dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify add: userCertificate;binary userCertificate;binary:< file:///local/cert-file |
要使用 :< 语法指定文件名,必须将 version: 1 行作为 LDIF 语句的开头。当 ldapmodify 处理此语句时,它会将属性设置为从给定文件的全部内容中读取的值。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
属性的语言和发音子类型可指定本地化的值。为属性指定语言子类型时,该子类型将添加到属性名称中,如下所示:
attribute;lang-CC |
其中 attribute 是现有属性类型,而 cc 是用于指定语言的双字母国家/地区代码。您还可以将发音子类型添加到语言子类型中,以便为本地化的值指定一个语音值。在本案例中,属性名称如下所示:
attribute;lang-CC;phonetic |
要对具有子类型的属性执行操作,必须明确匹配其子类型。例如,如果要修改具有 lang-fr 语言子类型的属性值,则必须在修改操作中包含 lang-fr,如下所示:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify add: homePostalAddress;lang-fr homePostalAddress;lang-fr: 34, rue de la Paix |
如果属性值包含非 ASCII 字符,则这些字符必须为 UTF-8 编码的字符。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
以下示例说明如何通过使用 LDIF 中的 replace 语法更改属性值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify replace: sn sn: Morris - replace: cn cn: Barbara Morris cn: Babs Morris |
将删除指定属性的所有当前值,并添加所有给定值。
更改属性值之后,您可以使用 ldapsearch 命令验证此更改。
修改属性值时,请勿不小心在值的末尾包含空格。结尾空格可能会导致值以 base-64 编码格式显示(如 34xy57eg)。
如果属性值的末尾是空格,则此空格将作为属性值的一部分进行编码。在使用 DSCC 或 ldapsearch 命令验证更改时,所显示的值可能是纯文本,也可能是 base-64 编码的文本。这取决于您所使用的目录服务器客户端。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
以下示例说明如何完整地删除属性,以及如何仅删除多值属性的一个值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify delete: facsimileTelephoneNumber - delete: cn cn: Babs Morris |
使用 delete 语法时如果不指定 attribute: value 对,将删除该属性的所有值。如果指定 attribute: value 对,则只会删除该值。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
要使用 ldapmodify 命令修改多值属性的一个值,则必须执行以下示例中显示的两个操作:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=People,dc=example,dc=com changetype: modify delete: mobile mobile: (408) 555-7845 - add: mobile mobile: (408) 555-5487 |
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapdelete 命令行实用程序从目录中删除条目。此实用程序将绑定到目录服务器,并根据条目 DN 删除一个或多个条目。必须提供具有删除指定条目的权限的绑定 DN。
您无法删除具有子条目的条目。LDAP 协议不允许出现子条目不再具有父条目的情形。例如,您无法删除组织单位条目,除非先删除了属于该组织单位的所有条目。
以下示例仅显示组织单位的一个条目。可以先后删除此条目及其父条目。
$ ldapdelete -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: uid=bjensen,ou=People,dc=example,dc=com ou=People,dc=example,dc=com |
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
使用 ldapmodify 实用程序时,还可以使用 changetype: delete 关键字删除条目。使用 ldapdelete 时的所有限制此时同样适用,如上一部分所述。使用 LDIF 语法删除条目的优点在于,您可以在单个 LDIF 文件中执行混合操作。
以下示例执行与上一示例相同的删除操作:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - dn: uid=bjensen,ou=People,dc=example,dc=com changetype: delete dn: ou=People,dc=example,dc=com changetype: delete |
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapsearch 命令行实用程序查找和检索目录条目。请注意,ldapsearch 实用程序并不是随 Solaris 平台提供的实用程序,而是 Directory Server Resource Kit 的一部分。
有关使用 ldapsearch、常用 ldapsearch 选项、可接受的格式以及示例的详细信息,请参见《Sun Java System Directory Server Enterprise Edition 6.1 Reference》。
以下过程将使用修改 DN 操作。在开始此操作之前,请确保您已经熟悉使用修改 DN 操作的准则和限制部分的内容。
对于此过程的某些部分,可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。此过程的其他部分只能使用命令行完成。
在修改作为组中 uniquemember 的条目的 DN 时,您必须启用引用完整性插件。引用完整性可确保在移动条目时对组成员进行调整。有关如何启用和配置引用完整性插件的信息,请参见配置引用完整性插件。
如果要将条目从一个父条目移动到另一个父条目中,请在这些父条目上扩展 ACI 权限。
在要移动的条目的当前父条目上,确保 ACI 允许通过使用语法 allow (export ...) 执行导出操作
在要移动的条目的将来父条目上,确保 ACI 允许通过使用语法 allow (import ...) 执行导入操作
有关使用 ACI 的信息,请参见第 6 章,目录服务器访问控制。
确保全局启用修改 DN 操作,或至少为将受移动操作影响的后缀启用该操作。
为了确保与以前的目录服务器发行版兼容,默认情况下不启用修改 DN 操作。
如果以前启用了修改 DN 操作,请转至下一步。
要为服务器全局启用修改 DN 操作,请使用以下命令:
$ dsconf set-server-prop -h host -p port moddn-enabled:on |
运行 ldapmodify 命令。
此步骤将使用修改 DN 操作。执行以下任一操作:
移动条目。
例如,以下命令可将条目uid=bjensen 从承包商的子树 ou=Contractors,dc=example,dc=com 移动到员工的子树 ou=People,dc=example,dc=com 中:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bjensen,ou=Contractors,dc=example,dc=com changetype: modrdn newrdn: uid=bjensen deleteoldrdn: 0 newsuperior: ou=People,dc=example,dc=com |
重命名条目。
例如,以下命令可将条目 uid=bbjensen 重命名为 uid=bjensen:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bbjensen,ou=People,dc=example,dc=com changetype: modrdn newrdn: uid=bjensen deleteoldrdn: 1 |
编写 LDIF 语句时请注意以下属性:
dn - 指定要重命名或移动的条目。
changetype: modrdn - 指定要使用的修改 DN 操作。
newrdn - 提供新的命名属性。
deleteoldrdn - 表示是否应该从条目中删除以前的命名属性(1 表示是,而 0 表示否)。
请注意,如果命名属性是条目定义中必需的属性,则无法从条目中删除此属性。
newsuperior - 指定条目的新上级属性。
有关 ldapmodify 命令及其选项的信息,请参见 ldapmodify(1) 手册页。
如果在移动或重命名包含大量条目的子树时遇到资源限制错误,请增加数据库可以使用的锁定数。
$ dsconf set-server-prop -h host -p port db-lock-count:value |
如果修改此属性,则必须重新启动服务器以使更改生效。
使用修改 DN 操作时(如上一部分所述),请遵循以下部分介绍的准则。
不要使用修改 DN 操作将条目从一个后缀移动到另一个后缀中,也不要使用该操作重命名或移动根后缀。
确保正在运行 Directory Server 5.2 2005Q1 或更高版本。无法在 Directory Server 5.2 2005Q1 之前的目录服务器版本上使用修改 DN 操作。
不要在应用程序中使用 entryid 操作属性,因为该属性仅供内部使用。移动条目后,条目的 entryid 属性可能发生更改。
为服务器上的所有后缀全局启用修改 DN 操作,或者为要运行修改 DN 操作的每个后缀单独启用该操作。默认情况下,修改 DN 操作处于禁用状态。
在要运行修改 DN 操作的每个后缀上扩展 ACI 权限。导入访问权限允许将条目导入指定 DN。导出访问权限允许从指定 DN 导出条目。
在执行修改 DN 操作之前,请确保该操作不会中断客户端验证。如果移动引用客户端证书的条目,则客户端验证将会中断。请在移动条目后对证书进行验证。
在执行修改 DN 操作之前,请确保该操作不会中断应用程序。重命名或移动条目可能会影响多个后缀,或更改条目的以下特性:
条目的已过滤角色的范围。
条目的嵌套角色(此处的嵌套角色包含过滤角色)。
条目的动态组成员身份。
使用修改 DN 操作时如果不符合以下要求,可能会中断复制并破坏目录服务。
确保复制拓扑中的所有服务器都至少运行 Directory Server 5.2。 无法在 Directory Server 5.2 之前的 Directory Server 版本中使用修改 DN 操作。
在复制拓扑中的所有服务器上启用修改 DN 操作。如果主服务器支持修改 DN 操作而使用方服务器不支持此操作,则复制将会失败。将在提供方服务器的错误日志中写入类似以下内容的消息。
启用 MODDN 时无法启动复制会话
要重新启动复制,请重新配置复制拓扑以便在所有服务器上启用修改 DN 操作,然后使用以下任一方式启动复制会话:
按照强制执行复制更新中的说明进行操作。
更改提供方服务器上的条目。此更改将被复制到使用方服务器。
在拓扑中的所有主副本上启用并配置引用完整性插件。此操作可确保服务器维护组和角色的引用完整性。有关如何启用和配置引用完整性插件的信息,请参见配置引用完整性插件。
执行完修改 DN 操作之后,请为引用完整性插件留出复制更改的时间。