加深理解活动目录的架构(之一)
在学习活动目录时,架构(Schema)一直是比较难以理解的问题,尤其是对象、属性和类之间的相互关系,比较抽象而且难以领会。幸运的是,最近在和兄弟一起探讨Schema,在兄弟的帮助下,把这个概念稍微搞明晰了一些。敝帚不敢自珍,也未经严格验证,就拿来和ITECN众粉丝一起分享,还望诸位兄弟帮盆盆一起把把关,以便找出其中可以挖掘的新思路,同时如果发现错误,还请在此跟贴,盆盆将及时更改,以免谬种流传。
以下主要描述一些盆盆所掌握的一些比较初级的了解,更多深层次的内容将会在后续的ITECN文章里发表。
一、以下是有关Schema的一般知识
1. Schema反映的是面向对象的思维方式,这对于Dev来说也许更容易理解。对象、属性、类等都是来自面向对象的概念。
2. 我们可以把对象看成是一个实体的数据表现,例如一个具体的人。而把类看成是模板(Template),例如是人类。
3. 每个对象由多个属性进行定义。例如一个人,其“头发颜色”属性可能是黑色、“眼珠颜色”属性可能是蓝色、“身高”属性可能是1.80米…
4. 类这个模板就是定义这些属性的名称、数据类型和语法限制等,例如“人类”这个类,就定义了“身高”属性,其数据类型应该是“浮点数”,当然其大小也应该有限制,例如显然不可能有负数;还定义了“头发颜色”属性,其数据类型是“字符串”,当然只能是七种颜色之一……
5. 而对象,实际上就是把类“实例化”,就是给类所包含的属性进行赋值,如此而已。而类则是对象的抽象,类定义对象应该具有的数据结构和语法限制,但是不包含属性的具体值。
6. 对于类来说,某些属性必须是强制的,例如“User”类,用户名、SID、密码等属性必须提供,否则就是“黑户口”。有些属性则不强制,例如电话号码等。
二、以下是Schema中比较难以理解的部分
1. 最精彩的地方在于活动目录把类和属性本身也当成对象来处理和存储。
2. 既然是当成对象,那么显然它们也是从类中实例化而来的。例如每个类的定义是作为一个classSchema对象,而保存在Schema分区里。也就是说每个类,实际上是classSchema类的一个实例。每个属性,则是attributeSchema类的一个实例。
3. classSchema对象定义了活动目录中类的组成形式,其包含的属性是该对象的RDN、强制属性集、可选属性集…。例如“User”这个类,它应该是由用户名、SID、密码等属性组成。也就是说“User”这个类,本身是classSchema类的一个实例,是一个classSchema对象。
4. 每个属性,也作为一个attributeSchema对象来存储,它是attributeSchema类的一个实例。attributeSchema这个类,定义了活动目录对象属性的组成形式。由于属性也是一个对象(attributeSchema对象),它也是由多个属性所组成,例如RDN、数据类型、是否允许复制到全局编录中等。每个具体的属性,就是把attributeSchema这个类实例化了。例如“用户名”这个属性,其数据类型应该是“多字符串”、应该复制到全局编录中…
三、怎么去理解类和属性也是对象
1. 首先要理解微软为什么要这样做。其实不难想象,这是为了便于开发人员的理解和编程。这样应用程序就可以用统一的接口去访问Schema和活动目录对象,简化开发难度。
2. 既然类和属性,本身也是对象。那么它们之上肯定还可以进行抽象,抽象的结果就是classSchema和attributeSchema这两个类。classSchema和attributeSchema这两个类本身不能再进行抽象,也就是说不能将其再当成对象,否则就会陷入鸡生蛋、还是蛋生鸡的麻烦。(记住,类是对象的抽象,对象是类的实例)
下文的图示,可以解释这个原理。例如要创建一个名为Bsmith的用户,首先在Schema分区里参考classSchema和attributeSchema这两个类,实例化出 “User”类(这个User类,是classSchema对象)。然后再从Schema分区里读取User类的定义,弹出“新建用户”的对话框,接受用户输入,以生成Bsmith用户对象,这时候实际上从User类中再次进行一次实例化。最后生成的Bsmith用户对象,包括在Domain分区里。

本图片取自Windows Server Resource Kit
四、公理〓没有道理
盆盆自己把classSchema和attributeSchema这两个类姑且命名为root class(不能抽象的类,根类)。这是Schema的基础,就好比几何学的基础来自于所谓的“公理”,公理是不能被证明的,也就是不能被抽象的,例如“两点间直线最短”这个道理,无法再进行抽象,无法进行证明,只能作为证明别人的基础。
五、理解以后的好处
1. 可以理解为什么Schema必须由单独的FSMO来充当。因为在整个森林里,Schema需要复制到全部DC,如果Schema不能保持唯一,那么各个DC创建的对象,可能包含不同的属性集,导致目录对象不一致。
2. 有效助眠,盆盆本人经过测试,在试图解释这些原理时,头晕程度不亚于吃一粒安眠药。
3. 为保持我们的薪水找到合适的借口。
六、欠扁的问题
嘻嘻,如果您已经看到这里,那么请尝试思考这样一个问题:
attributeSchema对象的其中一个属性是isMemberOfPartialAttributeSet,表示该attributeSchema对象所代表的属性能否复制到全局编录中。
而isMemberOfPartialAttributeSet既然也是一个属性,那么它在Schema分区中也会储存为一个attributeSchema对象,那么它本身也应该有一个isMemberOfPartialAttributeSet属性吧?
不妨用ADSI Edit看看哈
天哪~~~不管怎么样,盆盆反正濒临崩溃了~
