对象类和对象类别
对象类的每个实例都有一个多值 objectClass 属性,用于标识该对象是哪个类的实例,以及该类派生的所有结构或抽象超级类。 因此,用户对象的 objectClass 属性将标识 top、person、organizationalPerson 和 user 类。 objectClass 属性不包括列表中的辅助类。 系统会在创建对象实例时设置 objectClass 值,且该值不可更改。
对象类的每个实例也有一个 objectCategory 属性,这是一个单值属性,其中包含对象实例所属类或其超级类的可分辨名称。 创建对象时,系统会将其 objectCategory 属性设置为其对象类的 defaultObjectCategory 属性指定的值。 对象的 objectCategory 属性不可更改。
有关更多信息,以及检索对象 objectClass 属性的代码示例,请参阅检索 objectClass 属性。
重要
在 Windows Server 2008 之前,objectClass 属性没有编制索引。 这是因为它有多个值,而且高度非唯一;也就是说,objectClass 属性的每个实例都包括 top 类。 这意味着索引将非常庞大且效率低下。 要查找给定类中的对象,可使用 objectCategory 属性,该属性为单值且有索引。 有关在搜索筛选器中使用这些属性的详细信息,请参阅决定搜索内容。
对于大多数类,defaultObjectCategory 是类的 classSchema 对象的可分辨名称。 例如,organizationalUnit 类的 defaultObjectCategory 是“CN=Organizational-Unit,CN=Schema,CN=Configuration,<DC=forestroot>”。 但是,有些类会将另一个类作为其 defaultObjectCategory 来引用。 这样,即使对象的类别不同,查询也能很容易地找到相关的对象组。 例如 user、person、organizationalPerson 和 contact 类都在其 defaultObjectCategory 属性中标识了 person 类。 这样,像 (objectCategory=person) 等搜索筛选器只用一次查询就能找到所有这些类的实例。 对人员的查询非常常见,因此这是一个简单的优化。
如果从结构类创建子类,最佳做法是将新类的 defaultObjectCategory 值设置为与超级类相同的可分辨名称。 这样,标准 UI 就能“查找”子类。