对象的元数据在复制过程中如何被更改
让我们看一下4步骤的一个例子:
1.server A上一个对象(一个用户)被创建
2.对象被复制到B
3.对象接着在B上被修改
4.在B上的修改被复制给A
整个过程如图:
How metadata is modified during replication
Step1:A上用户的建立
当在A上建立一个用户对象时,A就是原始DC,在建立新用户的活动目录事务动作中,一个USN (1000)被分配
给该事务,用户对象的usnCreated和usnChanged属性自动被设置为1000.所有该用户对象的其他属性
被一些数据初始化,如下:(注:对象初次建立所有的属性都有相同的USN)
对象属性值根据系统的缺省值或者在建立过程中提供的参数被设置
对象属性的USN被设置为1000
对象属性的版本号被设置为1
对象属性的时间戳被设置为对象创建时的时间
对象的原始写Server的GUID属性被设置为server A的GUID
对象的原始写server USN属性被设置为 1000 (该事务的USN号)
你可以从中知道这个用户对象在事务处理1000中被建立。--usnCreated=1000
这个用户对象最后一次修改是在事务处理1000中。 --usnChanged=1000
这个用户对象从来没有被更改过原始值 version number=1
这个用户对象的每个属性的值被设置的原始出处是server A,事务号1000(原始serverGuid,原始server USN)
对象的属性值可以用repadmin,ADSIEdit,LDP等工具查看
Step2.复制原始写到server B
对象被复制到server B, B增加用户对象到活动目录副本--以复制写的方式。
在这个事务中,USN 2500被分配。用户对象的usnCreated和usnChanged属性值被修改为server B上相应的事务USN 2500.
由此可知这个用户是在事务2500中被建立在serverB上的。对象从来没有被修改过,应为version number =1
还可以看出对象的每个属性的原始写server和原始USN.
Step3. server B上修改用户密码
Originating write原始写(密码修改)发生在server B上的replicated-write复制写用户对象上,该事务的USN为3777,用户对象的usnChanged属性也改为3777.
同时:
密码的版本号由1变为2
密码usn被设置为3777
密码时间戳被修改
密码的原始写server从A改为B,原始USN改为3777
Step4.密码修改被复制给server A
注意更新发生在属性级别而非对象级别。因此仅仅密码属性被复制。
类似于step2. A上被分配usn 1333,对象的usnChanged属性值被修改为A上的事务号1333
在真实的DC复制过程中,有2处不同:
1.从A复制到B,CN属性会显示原始写来自B而不是A,这牵涉到后台的实现细节,
仅此一处发生这样的差异
2.密码的修改实际上更新了好几个属性,而非仅仅1处,这涉及到dBCSPwd,unicodePwd,ntPwdHistory,lmPwdHistory等属性。
这也牵涉到后台的实现细节。对于其他属性,单个的修改只会影响单个属性和复制。密码只是一个特殊的例子。