Novell eDirectory LDIF文件查错


对 LDIF 文件进行查错

Novell 导入转换导出实用程序可方便地将 LDIF 文件导入 eDirectoryTM 或从 eDirectoryTM 中导出 LDIF 文件。有关详细信息,请参见Novell 导入/转换/导出实用程序

要正确进行 LDIF 导入,必须使用 Novell 导入转换导出实用程序可以读取和处理的 LDIF 文件。本小节将介绍 LDIF 文件的格式和语法,并提供正确的 LDIF 文件示例。


了解 LDIF

LDIF 是一种普遍使用的文件格式,用来描述目录信息或可对目录执行的修改操作。LDIF 完全独立于在所有特定目录中使用的储存格式,LDIF 通常用于从 LDAP 服务器导出目录信息或将数据导入 LDAP 服务器。

LDIF 一般很容易生成。因此,可以借助于一些工具(如 awk 或 perl)将专有格式的数据移入 LDAP 目录。也可以编写脚本来生成 LDIF 格式的测试数据。


LDIF 文件格式

Novell 导入转换导出导入需要 LDIF 1 格式的文件。以下是 LDIF 1 文件的基本规则:

    • 第一个非注释行必须是版本号:1.
    • 版本号后面跟有一个或多个记录。
    • 每个记录由多个字段组成,一行一个字段。
    • 各行使用换行符或回车符/换行符对分隔。
    • 各记录由一个或多个空行分隔。
    • 存在两种不同类型的 LDIF 记录:内容记录和更改记录。对 LDIF 文件可以包含的记录数目没有限制,但它们必须属于同一类型。在同一个 LDIF 文件中不能既有内容记录又有更改记录。
    • 以井字符 (#) 开头的行是注释行,在处理 LDIF 文件时将被忽略。


LDIF 内容记录

LDIF 内容记录代表整个项的内容。以下是 LDIF 文件示例,共包含四个内容记录:

 1  version: 1
 2  dn: c=US
 3  objectClass: top
 4  objectClass: country
 5  
 6  dn: l=San Francisco, c=US
 7  objectClass: top
 8  objectClass: locality
 9  st: San Francisco
10
11 dn: ou=Artists, l=San Francisco, c=US
12 objectClass: top
13 objectClass: organizationalUnit
14 telephoneNumber: +1 415 555 0000
15 
16 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
17 sn: Michaels
18 givenname: Peter
19 objectClass: top
20 objectClass: person
21 objectClass: organizationalPerson
22 objectClass: iNetOrgPerson
23 telephonenumber: +1 415 555 0001
24 mail: Peter.Michaels@aaa.com
25 userpassword: Peter123
26

此 LDIF 文件由以下部分组成:


表 135. LDIF 文件组成部分

部分说明

版本限定符

LDIF 文件的第一行包含版本号。冒号和版本号(当前定义为 1)之间可以无空格,也可以有多个空格。

如果缺少版本行,允许任何处理 LDIF 文件的应用程序将该文件的版本号假定为 0。但是也可能因为语法上的错误而拒绝处理该 LDIF。如果缺少版本行,处理 LDIF 的 Novell 实用程序将假定文件的版本号为 0。

判别名限定符

每个内容记录的第一行(如上面示例中的第 2、6、11 和 16 行)指定所代表的项的 DN。

DN 限定符必须使用以下两种格式之一:

    • dn:安全 UTF-8 判别名
    • dn::Base64 编码的判别名

 

行分界符

行分隔符可以是换行符或回车符/换行符对。这就解决了 Linux* 和 Solaris* 文本文件(将换行符用作行分隔符)与 MS-DOS 和 Windows* 文本文件(将回车符/换行符对用作行分隔符)间常见的不兼容问题。

记录分界符

使用空行(如上面记录中的第 5、10、15 和 26 行)作为记录分界符。

LDIF 文件中的每个记录(包括最后一个记录)必须使用记录分界符(一个或多个空行)作为终止。虽然某些情况也会默认地接受没有终止记录分界符的 LDIF 文件,但 LDIF 规范要求使用终止记录分界符。

特性值限定符

内容记录中所有其它的行均是值限定符。值限定符必须使用以下三种格式之一:

    • 特性说明:
    • 特性说明::Base64 编码的值
    • 特性说明:<URL

 


LDIF 更改记录

LDIF 更改记录包含对目录所进行的修改。LDIF 更改记录可以包含所有 LDAP 更新操作(添加、删除、修改和修改 DN 操作)。

LDIF 更改记录所使用的判别名限定符、特性值限定符和记录分界符的格式与 LDIF 内容记录相同。(有关详细信息,请参见LDIF 内容记录 。)根据是否出现 changetype 字段可以区分 LDIF 更改记录和 LDIF 内容记录。Changetype 字段标识更改记录所指定的操作。

changetype 字段可以使用以下五种格式之一:


表 136. Changetype 字段表格

Changetype说明

changetype:add

该关键字表示更改记录指定进行 LDAP 添加操作。

changetype:delete

该关键字表示更改记录指定进行 LDAP 删除操作。

changetype:moddn

该关键字表示更改记录指定进行 LDAP 修改 DN 操作(如果 LDIF 处理程序作为版本 3 客户程序联结到 LDAP 服务器)或进行修改 RDN 操作(如果 LDIF 处理程序作为版本 2 客户程序联结到 LDAP 服务器)。

changetype:modrdn

等同于 moddn 更改类型。

changetype:modify

该关键字表示更改记录指定进行 LDAP 修改操作。


更改类型:添加 (add)

“添加”更改记录类似于在所有特性值字段前加上 changetype: add 字段的内容更改记录(请参见LDIF 内容记录)。

所有记录必须属于同一类型。不能既有内容记录又有更改记录。

 1 version: 1
 2 dn: c=US
 3 changetype: add
 4 objectClass: top
 5 objectClass: country
 6 
 7 dn: l=San Francisco, c=US
 8 changetype: add
 9 objectClass: top
10 objectClass: locality
11 st: San Francisco
12
14 dn: ou=Artists, l=San Francisco, c=US
15 changetype:add
16 objectClass: top
17 objectClass: organizationalUnit
18 telephoneNumber: +1 415 555 0000
19 
20 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
21 changetype: add
22 sn: Michaels
23 givenname: Peter
24 objectClass: top
25 objectClass: person
26 objectClass: organizationalPerson
27 objectClass: iNetOrgPerson
28 telephonenumber: +1 415 555 0001
29 mail: Peter.Michaels@aaa.com
30 userpassword: Peter123
31


更改类型:删除 (Delete)

因为“删除”更改记录指定删除某项,所以“删除”更改记录只需要判别名限定符字段和“删除”更改类型字段。

以下 LDIF 文件示例用于删除更改类型:添加 (add)中所示的 LDIF 文件所创建的四个项。

重要:  要删除以前添加的项,应将各项反向排序。否则,由于树枝项不为空,将导致删除操作失败。

 

 1 version: 1
 2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 changetype: delete
 4
 5 dn: ou=Artists, l=San Francisco, c=US
 8 changetype:delete
 9
10 dn: l=San Francisco, c=US
11 changetype: delete
12
13 dn: c=US
14 changetype: delete
15


更改类型:修改 (Modify)

“修改”更改类型使您可以指定为已存在的项添加、删除和替换特性值。修改应使用以下三种格式之一:


表 137. 修改限定符要素

修改限定符要素说明

add:特性类型

该关键字表示特性类型的后续特性值限定符应添加到该项。

delete:特性类型

该关键字表示该特性类型的值将被删除。如果“删除”字段后跟有特性值限定符,将删除给定的值。

如果“删除”字段后没有任何特性值限定符,则删除所有值。如果该特性没有值,此操作将失败,但是因为该特性没有要删除的值,所以仍可获得所需效果。

replace:特性类型

该关键字表示该特性类型的值将被替换。“替换”字段后的任何特性值限定符将成为该特性类型的新值。

如果“替换”字段后没有任何特性值限定符,当前的一组值将用一组空值替换(这会导致该特性被去除)。与“删除”修改限定符不同,如果特性没有值,替换仍可以成功完成。两种情况的实际效果是相同的。

以下是“修改”更改类型的示例,将向 cn=Peter Michaels 项添加一个附加的电话号码。

 1 version: 1
 2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 changetype: modify
 4 # add the telephone number to cn=Peter Michaels
 4 add: telephonenumber
 5 telephonenumber: +1 415 555 0002
 6

如同可以在一个 LDAP 修改请求中组合多个修改操作一样,也可以在一个 LDIF 记录中指定多个修改操作。只包含连字符 (-) 的行用于标记每个修改限定符的特性值说明的结束。

以下 LDIF 示例文件包含多个修改操作:

 1 version: 1
 2
 3 # An empty line to demonstrate that one or more
 4 # line separators between the version identifier 
 5 # and the first record is legal.
 6
 7 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 8 changetype: modify
 9 # Add an additional telephone number value.
10 add: telephonenumber
11 telephonenumber: +1 415 555 0002
12 -
13 # Delete the entire fascimiletelephonenumber attribute.
14 delete: facsimileTelephoneNumber
15 -
16 # Replace the existing description (if any exists) 
17 # with two new values.
18 replace: description
19 description: guitar player
20 description: solo performer
21 -
22 # Delete a specific value from the telephonenumber 
23 # attribute.
24 delete: telephonenumber
25 telephonenumber: +1 415 555 0001
26 -
27 # Replace the existing title attribute with an empty 
28 # set of values, thereby causing the title attribute to 
29 # be removed.
30 replace: title
31 -
32


更改类型:修改 DN (Modify DN)

“修改 DN”更改类型可以重命名项和/或移动项。该更改类型由两个必需字段和一个可选字段组成。


表 138. 修改 DN 更改类型字段

字段说明

newrdn(必需)

为该项提供一个新名称,这个名称将在处理该记录时指派给该项。新的 RDN 限定符必须使用以下两种格式之一:

    • newrdn:安全 UTF-8 相对判别名
    • newrdn::Base64 编码的相对判别名

 

所有具有“修改 DN”更改类型的 LDIF 记录中都必须有新的 RDN 限定符。

deleteoldrdn(必需)

“删除旧 RDN”限定符是一个标志,指明是使用 newrdn 替换旧的 RDN,还是保留旧的 RDN。该限定符可以使用以下两种格式之一:

    • deleteoldrdn:0

      表示在重命名项后应在项中保留旧的 RDN 值。

    • deleteoldrdn:1

      表示在重命名项后应删除旧的 RDN 值。

     

 

newsuperior(可选)

“新父级”限定符提供新父级的名称,这个名称将在处理“修改 DN”记录时指派给该项。“新父级”限定符必须使用以下两种格式之一:

    • newsuperior:安全 UTF-8 判别名
    • newsuperior::Base64 编码的判别名

 

“新父级”限定符在具有“修改 DN”更改类型的 LDIF 记录中是可选的。仅在要重新指派项的父级时才提供该限定符。

以下“修改 DN”更改类型的示例说明如何重命名项:

 1 version: 1
 2 
 3 # Rename ou=Artists to ou=West Coast Artists, and leave
 4 # its old RDN value.
 5 dn: ou=Artists,l=San Francisco,c=US
 6 changetype: moddn
 7 newrdn: ou=West Coast Artists
 8 deleteoldrdn: 1
 9

以下“修改 DN”更改类型的示例说明如何移动项:

 1 version: 1
 2
 3 # Move cn=Peter Michaels from 
 4 # ou=Artists,l=San Francisco,c=US to 
 5 # ou=Promotion,l=New York,c=US and delete the old RDN.
 5 dn: cn=Peter Michaels,ou=Artists,l=San Francisco,c=US
 6 changetype: moddn
 7 newrdn: cn=Peter Michaels
 8 deleteoldrdn: 1
 9 newsuperior: ou=Promotion,l=New York,c=US
10

以下“修改 DN”更改类型的示例说明如何同时移动项和重命名项:

 1 version: 1
 2
 3 # Move ou=Promotion from l=New York,c=US to
 4 # l=San Francisco,c=US and rename it to 
 5 # ou=National Promotion.
 5 dn: ou=Promotion,l=New York,c=US
 6 changetype: moddn
 7 newrdn: ou=National Promotion
 8 deleteoldrdn: 1
 9 newsuperior: l=San Francisco,c=US
10

重要:  LDAP 2 修改 RDN 操作不支持移动项。如果尝试在 LDAP 2 客户程序中使用 LDIF newsuperior 语法移动项,请求将失败。


在 LDIF 文件内折行

要在 LDIF 文件中折行,只需在要折行的位置插入一个行分隔符(换行符或回车符/换行符对),其后跟一个空格。LDIF 语法分析程序遇到行首的空格时,就会自行将该行其余数据与上一行的数据相连接。前导空格继而被丢弃。

不应在多字节 UTF-8 字符的中间折行。

以下是一个带有折行的 LDIF 文件示例(请查看第 13 行和 14 行):

 1 version: 1
 2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 sn: Michaels
 4 givenname: Peter
 5 objectClass: top
 6 objectClass: person
 7 objectClass: organizationalPerson
 8 objectClass: iNetOrgPerson
 9 telephonenumber: +1 415 555 0001
10 mail: Peter.Michaels@aaa.com
11 userpassword: Peter123
12 description: Peter is one of the most popular music
13  ians recording on our label. He's a big concert dr
14  aw, and his fans adore him.
15


调试 LDIF 文件

如果存在有关 LDIF 文件的问题,应参考以下内容:


启用向前参照

偶尔可能会遇到这样的 LDIF 文件,其中添加项的记录先于添加其父级的记录出现。此时将出现错误,因为当 LDAP 服务器尝试添加新项时,该项的父级并不存在。

要解决此问题,只需启用向前参照。如果启用了创建向前参照,某个项要在其父级不存在的情况下创建时,就会为该项的父级创建一个名为向前参照的占位符,从而可以成功地创建该项。如果稍后的操作创建了父项,则向前参照将更改为一般项。

LDIP 导入完成后,可能会剩余一个或多个向前参照(例如,如果 LDIF 文件从未创建某个项的父级)。在这种情况下,向前参照将在 ConsoleOneTM 中作为一种“未知”对象出现。虽然可以搜索向前参照项,但无法读取向前参照项的特性(除 objectClass 外),原因是向前参照项没有任何特性或特性值。然而,对向前参照下级的实际对象项可正常进行所有的 LDAP 操作。


区分向前参照项

向前参照项具有未知对象类,并且具有其内部的 NDS EF_REFERENCE 项标志集。在 ConsoleOne 中,具有未知对象类的项使用中央带有一个问号的黄色圆形图标表示。可以使用 LDAP 来搜索具有未知对象类的对象,尽管当前还无法通过 LDAP 访问项标志设置,以确定向前参照项。


将向前参照项更改为普通对象

可以将向前参照项更改为普通对象,只需创建该对象即可(例如使用 LDIF 文件或 LDAP 客户请求)。如果要求 eDirectory 创建已作为向前参照而存在的项,eDirectory 将把现有的向前参照项转变成要求 eDirectory 创建的对象。


使用 Novell eDirectory 导入/导出向导

要在 LDIF 导入期间启用向前参照:

    • 在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。

    • 单击“导入 LDIF 文件”>“下一步”。

    • 输入包含要导入数据的 LDIF 文件的名称 > 单击“下一步”。

    • 选择数据将导入的 LDAP 服务器。

    • 单击“高级”>“允许向前参照”>“关闭”。

    • 单击“下一步”>“完成”,开始导入 LDIF。

要在数据到数据的服务器迁移过程中启用向前参照:

    • 在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。

    • 单击“在 LDAP 服务器之间迁移数据”>“下一步”。

    • 选择存放要迁移项的 LDAP 服务器 > 单击“下一步”。

    • 指定要迁移的项的搜索准则 > 单击“下一步”。

    • 选择数据将迁移到的 LDAP 服务器。

    • 单击“高级”>“允许向前参照”>“关闭”。

    • 单击“下一步”>“完成”。


使用 Novell 导入转换导出实用程序命令行界面

要在命令行界面中启用向前参照,使用 -F LDAP 目标处理程序选项。

有关详细信息,请参见LDIF 目标处理程序选项


检查 LDIF 文件的语法

可以在处理 LDIF 文件中的记录前检查文件的语法,方法是使用“显示操作,但不执行”LDIF 源处理程序选项。

LDIF 源处理程序总是在处理 LDIF 文件中的记录时检查其语法。使用此选项可以禁止对记录进行处理,允许您校验语法。


使用 Novell eDirectory 导入/导出向导

要在 LDIF 导入过程中检查语法:

    • 在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。

    • 单击“导入 LDIF 文件”>“下一步”。

    • 输入包含要导入的数据的 LDIF 文件名称 > 单击“高级”。

    • 单击“显示操作,但不执行”>“关闭”>“下一步”。

    • 选择数据将导入的 LDAP 服务器。

    • 单击“下一步”>“完成”,开始导入 LDIF。


使用 Novell 导入转换导出实用程序命令行界面

要在命令行界面中检查 LDIF 文件的语法,使用 -n LDIF 源处理程序选项。

有关详细信息,请参见LDIF 源处理程序选项


使用 LDIF 错误文件

Novell 导入转换导出实用程序将自动创建 LDIF 文件,列出所有目标处理程序无法处理的记录。可以编辑实用程序生成的 LDIF 错误文件,修复错误,然后重新将其应用到服务器,从而完成包含失败记录的导入操作或数据迁移操作。


使用 Novell eDirectory 导入/导出向导
    • 在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。

    • 单击要执行的任务。

    • 单击“高级”。

    • 在“日志文件”字段中,指定要记录输出讯息(包括错误讯息)的文件的名称。

    • 在“失败记录的 LDIF 输出文件”字段中,指定使用 LDIF 格式输出失败项的文件的名称。

      可以使用此文件检查或纠正错误。也可以将此文件修改(纠正)后的版本重新应用到目录。

    • 单击“关闭”。

    • 按照联机指导信息完成所选任务。


使用 Novell 导入转换导出实用程序命令行界面

要在命令行实用程序中配置错误日志选项,使用 -1 一般选项。

有关详细信息,请参见一般选项


使用 LDAP SDK 调试标志

要了解某些 LDIF 问题,可能需要查看 LDAP 客户程序 SDK 的工作方式。可以为 LDAP 源处理程序和/或 LDAP 目标处理程序设置以下调试标志。


表 139. LDAP SDK 调试标志

说明

0x0001

跟踪 LDAP 函数调用。

0x0002

打印包信息。

0x0004

打印自变量信息。

0x0008

打印连接信息。

0x0010

打印 BER 编码和解码信息。

0x0020

打印搜索过滤器信息。

0x0040

打印配置信息。

0x0080

打印 ACL 信息。

0x0100

打印统计信息。

0x0200

打印其它统计信息。

0x0400

打印壳层信息。

0x0800

打印语法分析信息。

0xFFFF(十进制为 -1)

启用所有调试选项。

要启用此功能,使用 LDAP 源处理程序和 LDAP 目标处理程序的 -e 选项。提供给 -e 选项的整数值是位屏蔽,用于启用 LDAP SDK 中多种类型的调试信息。

有关详细信息,请参见LDAP 源处理程序选项LDAP 目标处理程序选项


使用 LDIF 扩展纲要

因为 LDIF 可以表示 LDAP 更新操作,所以可以使用 LDIF 修改纲要。


添加新对象类

要添加类,只需将符合 NDSObjectClassDescription 规范的特性值添加到 subschemaSubentry 的 objectClasses 特性中。

NDSObjectClassDescription = "(" whsp
   numericoid whsp
   [ "NAME" qdescrs ]
   [ "DESC" qdstring ]
   [ "OBSOLETE" whsp ]
   [ "SUP" oids ] 
   [ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
   [ "MUST" oids ]    
   [ "MAY" oids ]     
   [ "X-NDS_NOT_CONTAINER" qdstrings ]
   [ "X-NDS_NONREMOVABLE" qdstrings ]
   [ "X-NDS_CONTAINMENT" qdstrings ] 
   [ "X-NDS_NAMING" qdstrings ]
   [ "X-NDS_NAME" qdstrings ] 
   whsp ")"

以下 LDIF 示例文件将向纲要中添加人员 objectClass:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 objectClasses: ( 2.5.6.6 NAME 'person' DESC 'Standard
 5   ObjectClass' SUP ndsLoginProperties STRUCTURAL MUST
 6   (cn $ sn) MAY (description $ seeAlso $ telephoneNum
 7  ber $ fullName $ givenName $ initials $ uid $ userPa
 8  ssword) X-NDS_NAMING ('cn' 'uid') X-NDS_CONTAINMENT 
 9  ('organization' 'organizationalUnit' 'domain') X-NDS
10  _NAME 'Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMO
11  VABLE '1')
12


必备特性

必备特性在对象类说明的 MUST 部分列出。对于 person 对象类,必备特性是 cn 和 sn。


可选特性

可选特性在对象类说明的 MAY 部分列出。person 对象类中的可选特性是 description、seeAlso、telephoneNumber、fullName、givenName、initials、uid 和 userPassword。


包容规则

对象类说明的 X-NDS_CONTAINMENT 部分提供可以包含定义的对象类的对象类。organization、organizationalUnit 和 domain 对象类可以包含 person 对象类。


添加新特性

要添加特性,只需将符合 NDSAttributeTypeDescription 规范的特性值添加到 subschemaSubentry 的 attributes 特性中。

NDSAttributeTypeDescription = "(" whsp
  numericoid whsp  ; AttributeType identifier
  [ "NAME" qdescrs ]  ; name used in AttributeType
  [ "DESC" qdstring ]  ; description
  [ "OBSOLETE" whsp ]
  [ "SUP" woid ]  ; derived from this other AttributeType
  [ "EQUALITY" woid]  ; Matching Rule name
  [ "ORDERING" woid]  ; Matching Rule name
  [ "SUBSTR" woid ]  ; Matching Rule name
  [ "SYNTAX" whsp noidlen whsp ] ;  Syntax OID
  [ "SINGLE-VALUE" whsp ]  ; default multi-valued
  [ "COLLECTIVE" whsp ]  ; default not collective
  [ "NO-USER-MODIFICATION" whsp ] ;  default user modifiable
  [ "USAGE" whsp AttributeUsage ] ;  default userApplications
  [ "X-NDS_PUBLIC_READ" qdstrings ]
                             ; default not public read ('0')
  [ "X-NDS_SERVER_READ" qdstrings ]
                              ; default not server read ('0')
  [ "X-NDS_NEVER_SYNC" qdstrings ]
                               ; default not never sync ('0') 
  [ "X-NDS_NOT_SCHED_SYNC_IMMEDIATE" qdstrings ]
                            ;  default sched sync immediate ('0')
  [ "X-NDS_SCHED_SYNC_NEVER" qdstrings ]
                                  ;  default schedule sync ('0')
  [ "X-NDS_LOWER_BOUND" qdstrings ]
                              ;  default no lower bound('0')
                                    ;(upper is specified in SYNTAX)
  [ "X-NDS_NAME_VALUE_ACCESS" qdstrings ]
                         ; default not name value access ('0')
  [ "X-NDS_NAME" qdstrings ]  ; legacy NDS name 
  whsp ")"

以下 LDIF 示例文件将向纲要中添加 title 特性类型:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'Standa
 5  rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} X-NDS_NAME 'Title' X-NDS_NOT_SCHED_SYNC_IMMEDIA
 7  TE '1' X-NDS_LOWER_BOUND '1')
 8


单值特性与多值特性

除非明确将特性设置为单值,否则其默认设置为多值。以下 LDIF 示例文件通过在 SYNTAX 部分后面添加 SINGLE-VALUE 关键字,将 title 设置为单值:

 1 version: 1
 2 dn: cn=schema
 3 changetype: add
 4 attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'Standa
 5  rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} SINGLE-VALUE X-NDS_NAME 'Title' X-NDS_NOT_SCHED
 7  _SYNC_IMMEDIATE '1' X-NDS_LOWER_BOUND '1')
 8


向现有对象类中添加可选特性

尽管可以采用添加新纲要元素的方法,但是修改或扩展现有的纲要元素通常是非常危险的。因为每个纲要元素都由 OID 唯一标识,如果扩展标准纲要元素,实际上就创建了该元素的第二个定义,即使它仍然使用原来的 OID。这样会导致不兼容的问题。

有时更改纲要元素更合适。例如,在开发过程中简化新的纲要元素时,可能就需要对其进行扩展或修改。通常不要将新特性直接添加到类中,而是应该只使用辅助类来执行以下操作:

    • 向现有对象类中添加新特性
    • 建立现有对象类的子类


Adding or Removing Auxiliary Classes

下面的 LDIF 文件样本创建两个新特性、创建一个具有这些特性的辅助类,然后添加一个 inetOrgPerson 项(该项将该辅助类作为其对象类,并带有该辅助类特性值)。

version: 1
# Add an attribute to track a bear's hair. The attribute is 
# multi-valued, uses a case ignore string syntax,  
# and has public read rights 
# Values may include: long hair, short, curly, straight, 
# none, black, and brown 
# X-NDS_PUBLIC_READ '1' The 1 allows public read, 
# 0 denies public read 
dn: cn=schema 
changetype: modify 
add: attributeTypes
attributeTypes: ( 2.16.840.1.113719.1.186.4.10 NAME
'bearHair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-NDS_PUBLIC_READ '1' )

# add an attribute to store a bear's picture 
dn: cn=schema 
changetype: modify 
add: attributeTypes 
attributeTypes: ( 2.16.840.1.113719.1.186.4.11 NAME
'bearPicture' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE )

# create an Auxiliary class for the bearfeatures 
dn: cn=schema 
changetype: modify 
add: objectclasses 
objectclasses: (2.16.840.1.113719.1.186.6.101 NAME
'bearFeatures' MAY (bearHair $ bearPicture) AUXILIARY)

# now create a user named booboo
dn: cn=booboo,o=jellystone 
changetype: add 
cn: booboo 
sn: bear 
givenName: booboo 
bearHair: Short 
bearHair: Brown 
bearHair: Curly 
bearPicture:< file:///c:/tmp/alien.jpg 
objectClass: top 
objectClass: person 
objectClass: inetOrgPerson 
objectClass: bearFeatures 

# now create a person named yogi that will later be changed
# into a bear when bearFeatures is added to its objectClass
# list
dn: cn=yogi,o=jellystone
changetype: add
cn: yogi
sn: bear
givenName: yogi
objectClass: top
objectClass: person
objectClass: inetOrgPerson

# now morph yogi into a bear by adding bearFeatures
dn: cn=yogi,o=jellystone
changetype: modify
add: objectClass
objectClass: bearFeatures
-
add: bearHair
bearHair: long
bearHair: black
#bearPicture:< file:///c:/tmp/yogi.jpg>
-

# to morph yogi back to a person, simply delete the
# objectClass bearFeatures
dn: cn=yogi,o=jellystone
changetype: modify
delete: objectClass
objectClass: bearFeatures

在将辅助类从 objectClass 列表中去除时,您不必删除与该辅助类相关连的所有值。

如果该辅助类具备“MUST”特性,必须在将该辅助类添加到 objectClass 列表的同一修改操作中指定这些特性,否则修改将会失败。



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值