Adamsync OBJ_CLASS_VIOLATION错误疑难解答

本文介绍如何解决在 OBJ_CLASS_VIOLATION Server 中使用 Adamsync 工具时发生的Windows错误。

适用于:  Windows Server 2012R2
原始 KB 编号:  923835

摘要

发生此错误的原因是 Active Directory 目录服务和 ADAM 实例之间存在类定义差异。 若要解决此问题,请按照以下各节中介绍的步骤操作:

  • 确定对象的属性和类
  • 当属性属于 TOP 类时解决问题的步骤
  • 当属性不属于 TOP 类时解决问题的步骤

症状

尝试使用 Active Directory 应用程序模式 (ADAM) 同步器 (Adamsync.exe) 工具将 Active Directory 对象同步到 Windows Server 上的 ADAM 实例。 但是,Adamsync 记录在 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 架构中定义,或者属性已定义,但该属性不存在于特定类的 Mandatory 或 Optional 属性列表中。 通常,第二种情形是导致此问题最常见的原因。

要同步的对象的类定义包含 Active Directory 中 ADAM 中不可用的一个或多个属性。 "症状"部分中提到的错误消息的"添加属性"部分显示您尝试添加的属性。 这些属性在要同步的对象的类的 Optional 或 Mandatory 属性列表中定义。

例如,在"症状"部分中提到的错误消息中,引用对象是 CN=TestGroup。 当您在 Active Directory 中查看 CN=TestGroup 对象,并检查此类及其所有父类的属性列表时,会看到此列表中的一个或多个属性不在 ADAM 中为此类启用的 Mandatory 或 Optional 属性列表中。

备注

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

解决方案

若要解决此问题,请按照以下步骤操作。

确定对象的属性和类

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

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

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

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

当属性不属于 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 中此类的 Mandatory 或 Optional 属性列表中存在但在 ADAM 中缺失的属性列表。

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

  8. 如果问题属性在 LDF 文件的"#attributes"部分不太明显,请按照以下步骤查找问题属性:

    1. 目前,对类所做的所有修改都处于 LDF 文件的一个部分下。 这是"#Updating元素"部分。 在此部分下,找到更新存在问题的类的部分。 例如,如果 Group 类存在问题,您将找到类似于以下内容的部分:

      # Update 元素:group
      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 元素:group
      dn: cn=Group,cn=Schema,cn=Configuration,dc=X
      changetype: modify
      add:mayContain
      # mayContain: adminCount
      mayContain:1.2.840.113556.1.4.150
      -

      # Update 元素:group
      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 文件中的问题属性。 failed 属性在 DisplayName 中可能有"DUP-"前缀。
    2. 请注意 OID (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. 完成疑难解答后,将 Category 16 LDAP Interfaces 注册表项的值重置为 0。 否则,将淹没事件日志。

联系 Microsoft 支持

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

状态

此行为是设计使然。

更多信息

若要使用 Adamsync 工具将数据从 Active Directory 同步到 ADAM,请按照以下步骤操作:

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

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

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

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

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