排查 Adamsync 中的OBJ_CLASS_VIOLATION错误

本文介绍如何排查在 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 中为此类启用的必需属性或可选属性列表中。

注意

这包括来自所有父类的属性列表。

解决方法

若要解决该问题,请执行以下步骤。

确定对象的属性和类

  1. 验证正在添加到失败对象的属性列表。 可以通过在同步日志中查看错误消息来确定失败的对象。 失败的对象始终是错误消息之前同步日志末尾指示的最后一个对象。 例如, CN=TestGroup 对象在“症状”部分中提到的错误消息中失败。
  2. 确定错误消息中是否包含 DisplayNamePrintable、Flags 或 ExtensionName 属性。 如果错误消息中包含其中一个属性,请参阅“属性属于 TOP 类时解决问题的步骤” 部分。 如果错误消息中不包含任何属性,请参阅“当属性不属于 TOP 类时解决问题的步骤”部分。

当属性属于 TOP 类时解决问题的步骤

你会发现 Active Directory 架构中的 TOP 类包含 DisplayNamePrintable、Flags 或 ExtensionName 属性。 但是,这些属性不包含在 ADAM 的 TOP 类中。 但是,不能更改 ADAM 中的 TOP 类。 因此,使用以下方法之一来解决此问题:

  • 通过使用 <XML 配置文件中的 exclude> 节排除这些属性。
  • 通过使用 MMC 架构,手动将这些属性添加到 ADAM 架构中相关类的可选属性列表中。 例如,在“症状”部分中提到的错误消息中,失败的对象是 Group 类。 因此,必须将这些属性添加到 ADAM 中 Group 类的可选属性列表。

当属性不属于 TOP 类时解决问题的步骤

  1. 在 ADSchemaAnalyzer 的“工具\选项”菜单下,单击“更新”,引用 LDIF 生成选项卡上的新元素和显示元素。

  2. 使用“ 文件” 菜单将 Active Directory 作为目标架构加载,ADAM 作为基本架构。 等待工具完成架构比较。

  3. “架构 ”菜单上,单击“ 将所有元素标记为包含”。

  4. “文件”菜单上,单击“创建 LDIF 文件以创建包含更改的 LDF 文件。

    注意

    如果将此 LDF 文件直接导入 ADAM,则可能无法正确添加或修改必要的属性。

  5. 不显示任何错误消息。 有关为何发生这种情况,请参阅“为什么不能直接将 LDF 文件导入 ADAM”部分。 在这种情况下,请转到步骤 5,而不导入 LDF 文件。

  6. 检查在步骤 4 中创建的 LDF 文件。 具体而言,查看导致问题的类。 例如,查看 Group 类。 此类的节将包含 Active Directory 中此类的必需或可选属性列表中存在的属性列表,但 ADAM 中缺少这些属性。

  7. 在 LDF 文件中查找问题属性。 为此,请检查 LDF 文件中的“#attributes”部分。 未导入的属性将保留在本节中。 通常,问题属性是在“#attributes”部分中找到的唯一属性。 如果发现问题属性,请转到步骤 8。 如果未找到问题属性,请转到步骤 7。

  8. 如果 LDF 文件中的“#attributes”部分中的问题属性不明显,请执行以下步骤来查找问题属性:

    1. 目前,对类的所有修改都在 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

    2. 通过将条目拆分为每个操作的单个属性,更改在步骤 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

  9. 保存 LDF 文件。

  10. 使用 LDF 文件开头提供的命令将 LDF 文件导入 ADAM 架构。

  11. 查看 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 文件中找到问题属性。

  12. 使用此错误信息查找问题属性并解决问题。 按照以下步骤尝试解决问题:

    1. 通过查看错误报告中指示的行号,在 LDF 文件中找到问题属性。 失败的属性可能在 DisplayName 中具有“DUP-”前缀。
    2. 请注意属性的对象标识符(OID),并在 ADAM 中查找此对象标识符。
    3. 在 ADAM 中查找具有相同对象标识符的属性。
    4. 比较 ADAM 和 LDF 文件中的属性,以查找任何差异。 例如,属性可能具有不同的 DisplayName,但对象标识符相同。
    5. 确定要保留的属性,然后更正另一个属性。 例如,可以从 LDF 文件中删除条目,也可以更正 ADAM 属性条目。 或者,可以使用 XML 配置文件中的 exclude> 节从同步<中排除问题属性。
  13. 在 Active Directory 或 ADAM 架构中更正问题属性或从 LDF 文件中删除该属性后,请再次导入修改后的 LDF 文件。 现在,导入操作应成功。 如果未解决问题,则可能存在另一个导致该问题的属性。 重复步骤 10 到 12,直到导入所有属性。

诊断日志记录

当你发现问题属性时,它可能并不清楚它有什么问题。 例如,可能找不到重复的对象标识符或

不同的 DisplayName 条目。 如果未导入问题属性,可以通过打开 LDAP 接口的调试日志记录来获取有关失败的详细信息。 为此,请按照下列步骤进行操作:

  1. 若要获取有关 ldifde 失败的详细信息,请启用 ADAM 中的 LDAP 日志记录。 为此,请将类别 16 LDAP 接口事件注册表项的值更改为 5。 此注册表项位于以下注册表子项下: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ADAM_instanceName\Diagnostics

  2. 再次导入 LDF 文件。

  3. 查看事件日志中的错误。

  4. 完成故障排除后,将类别 16 LDAP 接口事件注册表项的值重置为 0。 否则,将淹没事件日志。

请联系 Microsoft 支持

如果在完成本文中的步骤后未解决问题,请联系Microsoft 支持部门

Status

此行为是特意这样设计的。

详细信息

若要使用 Adamsync 工具将数据从 Active Directory 同步到 ADAM,请执行以下步骤:

  1. 单击“开始”,指向“所有程序”,指向 ADAM,然后单击“ADAM 工具命令提示符”。
  2. 在命令提示符下,键入以下命令,然后按 Enter:adamsync /fs Server_Nameport_number configurationName /log log_file_name.log

为什么不能将 LDF 文件直接导入 ADAM

如果将步骤 1 中创建的 LDF 文件导入 ADAM 中的“属性不属于 TOP 类时解决问题的步骤”部分,这些属性仍不会添加到 ADAM 中的属性列表中。 可以使用 ADAM 架构 MMC 或 ADSIEDIT 检查架构来验证此行为。 发生此行为的原因是 Ldifde 导入操作以无提示方式失败。 目前,Ldifde 不会报告错误。 由于 ADSchemaAnalyzer 构造 LDF 文件的方式,它以无提示方式失败。 ADSchemaAnalyzer 使用 ntdsschemaaddntdsSchemamodify 命令。 这些命令打开宽松的 LDAP 控件。 这意味着任何失败都是无提示的。

此外,对于每个类,要添加到可选属性列表中的所有属性都会添加到一个添加/修改操作中。 因此,如果添加其中一个属性时遇到问题,则整个操作将失败,并且列表中没有添加任何属性。 因此,必须采取其他步骤来查找问题属性。

通常,失败的可能原因是属性的重复对象标识符或 Active Directory 和 ADAM 中属性定义的其他一些差异。 这意味着可能会错过重复的 OID,如果 ADAM 中不存在 LDapDisplayName,则属性可能被视为新属性。