欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

加深理解活动目录的架构(之一)

在学习活动目录时,架构(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. 既然类和属性,本身也是对象。那么它们之上肯定还可以进行抽象,抽象的结果就是classSchemaattributeSchema这两个类。classSchemaattributeSchema这两个类本身不能再进行抽象,也就是说不能将其再当成对象,否则就会陷入鸡生蛋、还是蛋生鸡的麻烦。(记住,对象的抽象,对象的实例)

下文的图示,可以解释这个原理。例如要创建一个名为Bsmith的用户,首先在Schema分区里参考classSchemaattributeSchema这两个类,实例化出 “User”类(这个User类,是classSchema对象)。然后再从Schema分区里读取User类的定义,弹出“新建用户”的对话框,接受用户输入,以生成Bsmith用户对象,这时候实际上从User类中再次进行一次实例化。最后生成的Bsmith用户对象,包括在Domain分区里。

本图片取自Windows Server Resource Kit

四、公理〓没有道理

盆盆自己把classSchemaattributeSchema这两个类姑且命名为root class(不能抽象的类,根类)。这是Schema的基础,就好比几何学的基础来自于所谓的“公理”,公理是不能被证明的,也就是不能被抽象的,例如“两点间直线最短”这个道理,无法再进行抽象,无法进行证明,只能作为证明别人的基础。

五、理解以后的好处

1. 可以理解为什么Schema必须由单独的FSMO来充当。因为在整个森林里,Schema需要复制到全部DC,如果Schema不能保持唯一,那么各个DC创建的对象,可能包含不同的属性集,导致目录对象不一致。

2. 有效助眠,盆盆本人经过测试,在试图解释这些原理时,头晕程度不亚于吃一粒安眠药。

3. 为保持我们的薪水找到合适的借口。

六、欠扁的问题

嘻嘻,如果您已经看到这里,那么请尝试思考这样一个问题:

attributeSchema对象的其中一个属性是isMemberOfPartialAttributeSet,表示该attributeSchema对象所代表的属性能否复制到全局编录中。

isMemberOfPartialAttributeSet既然也是一个属性,那么它在Schema分区中也会储存为一个attributeSchema对象,那么它本身也应该有一个isMemberOfPartialAttributeSet属性吧?

不妨用ADSI Edit看看哈

天哪~~~不管怎么样,盆盆反正濒临崩溃了~

已发表 2007年11月3日 1:53 作者 ahpeng
归档在:

评论通知

如果您想在帖子更新时接到邮件通知,请先登录。这里

订阅帖子评论使用 RSS

评论

2007年11月3日 11:23 by qiqinghua

# re: 加深理解活动目录的架构(之一)

老大的schema的说法让我对架构有了新的视角和观感,我现在看schema的用途就是用脚本朝里写属性的时候的一个属性参考地方。从来没有深究里面的含义,以后要多多的学习

2007年11月3日 18:47 by renyi

# re: 加深理解活动目录的架构(之一)

学过OO的人,应该比较好理解这些东西。谢谢老大的分享

2007年11月4日 10:16 by ahpeng

# re: 加深理解活动目录的架构(之一)

To renyi:确实如此,熟悉OOP的Dev,他们对这个概念很容易理解。

然而Schema的架构,却并不是那么简单,其难点在于Class和Attribute本身也是当成Object来处理的,也就是说必然存在一个SuperClass,用来对这些Class和Attribute进行抽象。

2007年11月5日 0:57 by yinjie

# re: 加深理解活动目录的架构(之一)

精彩。。

2007年11月5日 11:21 by ahpeng

# re: 加深理解活动目录的架构(之一)

To Yinjie:多谢老大支持!

2007年11月5日 16:25 by jerry xie

# re: 加深理解活动目录的架构(之一)

only one question:Class和Attribute本身也是当成Object来处理的,也就是说必然存在一个SuperClass,用来对这些Class和Attribute进行抽象。

--------where is the "superclass"?

2007年11月6日 12:49 by calen3

# re: 加深理解活动目录的架构(之一)

能看到这样的讲解实在是幸运!

ps:主人不乏幽默!!

2007年11月15日 16:15 by Jason_ljh

# re: 加深理解活动目录的架构(之一)

太精辟了,不然真的很难理解

说说您的看法?

(必填) 
必填 
(必填)