本文介绍如何排查在 Windows Server 中使用 Adamsync 工具时发生的OBJ_CLASS_VIOLATION错误。
原始 KB 数: 923835
总结
发生此错误的原因是 Active Directory 目录服务和 ADAM 实例之间的类定义差异。 若要排查此问题,请遵循以下部分中介绍的步骤:
- 确定对象的属性和类
- 当属性属于 TOP 类时解决问题的步骤
- 当属性不属于 TOP 类时解决问题的步骤
现象
尝试使用 Active Directory 应用程序模式(ADAM)同步器(Adamsync.exe)工具将 Active Directory 对象同步到 Windows Server 上的 ADAM 实例。 但是,在 Adamsync 日志文件中记录类似于以下内容的错误消息:
处理条目:页 X、帧 X、条目 X、计数 X、USN X 处理源条目
<guid=f9023a23e3a06d408f07a0d51c301f38> 处理范围内条目
f9023a23e3a06d408f07a0d51c301f38。 添加目标对象
CN= TestGroup,OU= Accounts,dc= domain, dc= com。 添加属性:sourceobjectguid、objectClass、instanceType、displayName、info、adminDescription、displayNamePrintable、userAccountControl、codePage、countryCode、logonHours、primaryGroupID、comment、accountExpires、sAMAccountName、desktopProfile、legacyExchangeDN、userPrincipalName发生 Ldap 错误。 ldap_add_sW:对象类冲突。 扩展信息:0000207D:UpdErr:DSID-0315119D,问题 6002 (OBJ_CLASS_VIOLATION),数据 -2054643804
原因
由于 Active Directory 和 ADAM 之间的类定义差异,因此会出现此问题。 尝试修改对象以包含对其类无效的属性时,会出现此差异。 例如,该特性根本不在 ADAM 架构中定义,或者该属性定义,但该属性不在特定类的必需或可选属性列表中。 通常,第二种情况是此问题的最频繁原因。
要同步的对象的类定义包含 ACTIVE Directory 中不可用的一个或多个属性。 “症状”部分中提到的错误消息的“添加属性”部分将显示您尝试添加的属性。 这些属性在要同步的对象类的“可选”或“必需”属性列表中定义。
例如,在“症状”部分提到的错误消息中,引用对象为 CN=TestGroup。 在 Active Directory 中查看 CN=TestGroup 对象并检查此类的属性列表和所有父类时,可以看到此列表中的一个或多个属性不在 ADAM 中为此类启用的必需属性或可选属性列表中。
注意
这包括来自所有父类的属性列表。
解决方法
若要解决该问题,请执行以下步骤。
确定对象的属性和类
- 验证正在添加到失败对象的属性列表。 可以通过在同步日志中查看错误消息来确定失败的对象。 失败的对象始终是错误消息之前同步日志末尾指示的最后一个对象。 例如, CN=TestGroup 对象在“症状”部分中提到的错误消息中失败。
- 确定错误消息中是否包含 DisplayNamePrintable、Flags 或 ExtensionName 属性。 如果错误消息中包含其中一个属性,请参阅“属性属于 TOP 类时解决问题的步骤” 部分。 如果错误消息中不包含任何属性,请参阅“当属性不属于 TOP 类时解决问题的步骤”部分。
当属性属于 TOP 类时解决问题的步骤
你会发现 Active Directory 架构中的 TOP 类包含 DisplayNamePrintable、Flags 或 ExtensionName 属性。 但是,这些属性不包含在 ADAM 的 TOP 类中。 但是,不能更改 ADAM 中的 TOP 类。 因此,使用以下方法之一来解决此问题:
- 通过使用 <XML 配置文件中的 exclude> 节排除这些属性。
- 通过使用 MMC 架构,手动将这些属性添加到 ADAM 架构中相关类的可选属性列表中。 例如,在“症状”部分中提到的错误消息中,失败的对象是 Group 类。 因此,必须将这些属性添加到 ADAM 中 Group 类的可选属性列表。
当属性不属于 TOP 类时解决问题的步骤
在 ADSchemaAnalyzer 的“工具\选项”菜单下,单击“更新”,引用 LDIF 生成选项卡上的新元素和显示元素。
使用“ 文件” 菜单将 Active Directory 作为目标架构加载,ADAM 作为基本架构。 等待工具完成架构比较。
在 “架构 ”菜单上,单击“ 将所有元素标记为包含”。
在“文件”菜单上,单击“创建 LDIF 文件”以创建包含更改的 LDF 文件。
注意
如果将此 LDF 文件直接导入 ADAM,则可能无法正确添加或修改必要的属性。
不显示任何错误消息。 有关为何发生这种情况,请参阅“为什么不能直接将 LDF 文件导入 ADAM”部分。 在这种情况下,请转到步骤 5,而不导入 LDF 文件。
检查在步骤 4 中创建的 LDF 文件。 具体而言,查看导致问题的类。 例如,查看 Group 类。 此类的节将包含 Active Directory 中此类的必需或可选属性列表中存在的属性列表,但 ADAM 中缺少这些属性。
在 LDF 文件中查找问题属性。 为此,请检查 LDF 文件中的“#attributes”部分。 未导入的属性将保留在本节中。 通常,问题属性是在“#attributes”部分中找到的唯一属性。 如果发现问题属性,请转到步骤 8。 如果未找到问题属性,请转到步骤 7。
如果 LDF 文件中的“#attributes”部分中的问题属性不明显,请执行以下步骤来查找问题属性:
目前,对类的所有修改都在 LDF 文件中的一节下。 这是“#Updating Present Elements”部分。 在本部分下,找到更新有问题的类的部分。 例如,如果 Group 类是问题,你将找到如下所示的分区:
# Update 元素:组
dn: cn=Group,cn=Schema,cn=Configuration,dc=X
changetype: modify
add: mayContain
# mayContain: adminCount
mayContain:1.2.840.113556.1.4.150
# mayContain:controlAccessRights
mayContain:1.2.840.113556.1.4.200
# mayContain:groupAttributes
mayContain:1.2.840.113556.1.4.152
# mayContain:groupMembershipSAM
mayContain:1.2.840.113556.1.4.166
-请注意,此处可能更多条目已从此示例中排除。
dn:
changetype: modify
add: schemaUpdateNow
schemaUpdateNow: 1通过将条目拆分为每个操作的单个属性,更改在步骤 4a 中定位的条目。 例如,使用如下所示的条目更改步骤 7a 中示例中的条目:
# Update 元素:组
dn: cn=Group,cn=Schema,cn=Configuration,dc=X
changetype: modify
add: mayContain
# mayContain: adminCount
mayContain:1.2.840.113556.1.4.150
-# Update 元素:组
dn: cn=Group,cn=Schema,cn=Configuration,dc=X
changetype: modify
add: mayContain
# mayContain:controlAccessRights
mayContain:1.2.840.113556.1.4.200
-dn: cn=Group,cn=Schema,cn=Configuration,dc=X
changetype: modify
add: mayContain
# mayContain:groupAttributes
mayContain:1.2.840.113556.1.4.152
-dn: cn=Group,cn=Schema,cn=Configuration,dc=X
changetype: modify
add: mayContain
# mayContain:groupMembershipSAM
mayContain:1.2.840.113556.1.4.166
-请注意,此处可能更多条目已从此示例中排除。
dn:
changetype: modify
add: schemaUpdateNow
schemaUpdateNow: 1
保存 LDF 文件。
使用 LDF 文件开头提供的命令将 LDF 文件导入 ADAM 架构。
查看 Ldifde 实用工具显示的报表。 Ldifde 现在将报告未导入的属性发生的错误。 错误信息将类似于以下示例信息:
ldifde -i -u -f c:\data\problem\KBtest_modified.ldf -s localhost:50010 -j .-c "cn=Configuration,dc=X" #configurationNamingContext Connecting to "localhost:50010"
使用 SSPI 以当前用户身份登录
从文件“c:\data\problem\KBtest_modified.ldf”导入目录
加载条目。
在第 15 行中添加错误:已存在
服务器端错误为:0x2071尝试向 添加对象
具有已在使用的名称的 ectory。
扩展服务器错误为:
00002071: UpdErr: DSID-0305030D, 问题 6005 (ENTRY_EXISTS), 数据 0注意
通过查看错误报告中指示的行号,在 LDF 文件中找到问题属性。
使用此错误信息查找问题属性并解决问题。 按照以下步骤尝试解决问题:
- 通过查看错误报告中指示的行号,在 LDF 文件中找到问题属性。 失败的属性可能在 DisplayName 中具有“DUP-”前缀。
- 请注意属性的对象标识符(OID),并在 ADAM 中查找此对象标识符。
- 在 ADAM 中查找具有相同对象标识符的属性。
- 比较 ADAM 和 LDF 文件中的属性,以查找任何差异。 例如,属性可能具有不同的 DisplayName,但对象标识符相同。
- 确定要保留的属性,然后更正另一个属性。 例如,可以从 LDF 文件中删除条目,也可以更正 ADAM 属性条目。 或者,可以使用 XML 配置文件中的 exclude> 节从同步<中排除问题属性。
在 Active Directory 或 ADAM 架构中更正问题属性或从 LDF 文件中删除该属性后,请再次导入修改后的 LDF 文件。 现在,导入操作应成功。 如果未解决问题,则可能存在另一个导致该问题的属性。 重复步骤 10 到 12,直到导入所有属性。
诊断日志记录
当你发现问题属性时,它可能并不清楚它有什么问题。 例如,可能找不到重复的对象标识符或
不同的 DisplayName 条目。 如果未导入问题属性,可以通过打开 LDAP 接口的调试日志记录来获取有关失败的详细信息。 为此,请按照下列步骤进行操作:
若要获取有关 ldifde 失败的详细信息,请启用 ADAM 中的 LDAP 日志记录。 为此,请将类别 16 LDAP 接口事件注册表项的值更改为 5。 此注册表项位于以下注册表子项下:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ADAM_instanceName\Diagnostics
再次导入 LDF 文件。
查看事件日志中的错误。
完成故障排除后,将类别 16 LDAP 接口事件注册表项的值重置为 0。 否则,将淹没事件日志。
请联系 Microsoft 支持
如果在完成本文中的步骤后未解决问题,请联系Microsoft 支持部门。
Status
此行为是特意这样设计的。
详细信息
若要使用 Adamsync 工具将数据从 Active Directory 同步到 ADAM,请执行以下步骤:
- 单击“开始”,指向“所有程序”,指向 ADAM,然后单击“ADAM 工具命令提示符”。
- 在命令提示符下,键入以下命令,然后按 Enter:adamsync /fs Server_Name: port_number configurationName /log log_file_name.log
为什么不能将 LDF 文件直接导入 ADAM
如果将步骤 1 中创建的 LDF 文件导入 ADAM 中的“属性不属于 TOP 类时解决问题的步骤”部分,这些属性仍不会添加到 ADAM 中的属性列表中。 可以使用 ADAM 架构 MMC 或 ADSIEDIT 检查架构来验证此行为。 发生此行为的原因是 Ldifde 导入操作以无提示方式失败。 目前,Ldifde 不会报告错误。 由于 ADSchemaAnalyzer 构造 LDF 文件的方式,它以无提示方式失败。 ADSchemaAnalyzer 使用 ntdsschemaadd 和 ntdsSchemamodify 命令。 这些命令打开宽松的 LDAP 控件。 这意味着任何失败都是无提示的。
此外,对于每个类,要添加到可选属性列表中的所有属性都会添加到一个添加/修改操作中。 因此,如果添加其中一个属性时遇到问题,则整个操作将失败,并且列表中没有添加任何属性。 因此,必须采取其他步骤来查找问题属性。
通常,失败的可能原因是属性的重复对象标识符或 Active Directory 和 ADAM 中属性定义的其他一些差异。 这意味着可能会错过重复的 OID,如果 ADAM 中不存在 LDapDisplayName,则属性可能被视为新属性。