Active Directory Schema
This chapter describes the Active Directory data model and the way in which the rules of the schema enforce it. You can approach this chapter with the following three purposes:
To understand better how Active Directory works behind the scenes
To enhance administration by learning, for example, which attributes are indexed to make searches faster
To learn the technical background to extend the schema of your forest and to prepare you for the next chapter about schema extensions
This chapter has the following sections:
Overview of the Active Directory data model
Schema in general
Attributes and syntaxes
Overview of the Active Directory Data Model
Active Directory uses the LDAP data model, which is derived from the X.500 data model and, consequently, Active Directory implements many of X.500 features. However, Active Directory is not a full X.500 directory service.
In this first section we introduce the Active Directory data model, including most notably classes and attributes, as well as their relationship to the normal user and other objects that you see in your domains.
Classes, Objects, and Attributes
As you know, information in Active Directory is represented as objects, and there is an object for each user, computer, printer, and so on. Objects of the same type belong to the same class, so all user objects belong to the class user, all computer objects to the class computer, and all printer objects to the class printQueue.
You also know that information in an object is stored as values of various properties, which the corresponding class supports. For example, a user may have a phone number and home folder, whereas a printer might have knowledge about supported forms or print speed. Because this chapter is about the inner architecture of Active Directory, we want to use the slightly fancier term attribute instead of property. You can use these two words interchangeably.
The schema dictates which object classes and attributes a given forest supports. The base schema that ships with Windows 2000 supports 142 object classes and 863 attributes for those classes. The user class uses 207 attributes of the pool of 863. Active Directory implements most of the X.500 standard classes, but not quite all. The classes that it does not implement are alias, strongAuthenticationUser, and groupOfUniqueNames.
The attribute pool is common to all classes. The description attribute, for example, may be used by several classes (actually, all classes use it).
Bringing in another fancy term, you could say that each object is an instantiation of the corresponding class. For example, the Jack Brown object is an instantiation of the user class. Just as the class contains a number of attributes, the instantiated object contains the values for those attributes. However, only some of the attributes for a class are mandatory, which means that they must contain a value (a single-valued attribute such as homePhone) or values (a multivalued attribute such as otherHomePhone). Most of the attributes for a given class are optional; that is, they may contain a value, but more often they don't. Figure 8.1 shows these relationships.
Figure 8.1 The class user defines 7 mandatory and 200 optional attributes for which any user object must or may contain values.
You can see only a small subset of object types in the Users and Computers snap-in and only a subset of attributes for each object.
To create user objects with the Users and Computers snap-in, you must enter the user principal name (i.e., user logon name), even though it is just an optional attribute behind the scenes.
Each attribute has one of 23 syntaxes, such as Integer 14, Unicode string "abc", or Generalized time 04/26/2000 2:59:01 PM. We discuss syntaxes later in this chapter.
As you see in Figure 8.2, some of the classes (actually, most of them) are something other than the familiar users, groups, and computers.
Figure 8.2 Each of the 142 classes uses a number of attributes, which in turn use a certain syntax.
Container and Leaf Objects
Active Directory objects of some classes are container objects, and the objects of the remaining classes are leaf objects. If you compare this to a file system, container objects correspond to folders and leaf objects correspond to files. We call these two types of classes container classes and leaf classes.
One obvious example of a container class is organizationalUnit. There are also many others, however, because a total of 56 classes of the base schema are container classes and 86 are leaf classes. Interestingly, user is also a container class; user objects may contain nTFRSSubscriptions and classStore objects.
"Container" can also mean a specific classone of the 56 container classes is called container. Two examples of this class are CN=Users and CN=Computers, which you see with the Users and Computers snap-in under any domain.
Even though the base schema contains 86 leaf classes, those classes are not doomed to "eternal leafhood." You can modify the schema to make a leaf class a possible superior (i.e., a parent) to some other class. When you do so, a former leaf class (except for schema objects) becomes a container class.
One difference in our file system analogy is that in Active Directory both containers and leafs contain data, whereas in a file system files contain data, but folders don't.
Just as there is a class called container, one of the 86 leaf classes is called leaf. You can make also that class a container, so one of your container classes could be called leaf.
Indexing and the Global Catalog
An Active Directory database can contain thousands or even millions of objects. Therefore, we obviously need indexing to locate the right object or objects fast. Of the base schema, 64 attributes are indexed, examples being givenName, sn (Surname) and birthLocation. Searching and retrieving objects via indexed attributes is naturally much faster and efficient than using nonindexed attributes.
The global catalog helps in making local searches in a multidomain forest. One hundred thirty-eight attributes of the base schema are part of the global catalog, including cn, userPrincipalName, givenName, sn (Surname), and printStaplingSupported.