1. 模拟环境
根域为contoso.msft,dc为dc1.contoso.msft,dc2.contoso.msft同时也是GC,所处站点site 1;
子域为child.contoso.msft,dc为child-dc.child.contoso.msft,所处站点site 2不是GC;在域child.contoso.msft上有用户john用于验证本实验!
2. Gc存储着森林中所有域的域分区的所有对象的部分属性
同时还存储着林中所有通用组的成员列表,在域用户登录的过程中和查询过程中,GC发挥着重要的作用;或者可以说没有GC域用户在一般情况下就不能登录,这里为什么说是在一般情况下,因为有特例(后面再说)!
先说说域用户的登录过程和GC的关系:首先域用户要想登录成功,必须从所在域的dc那里成功构建“安全访问令牌”,没有这个安全访问令牌域用户是不能登录的;那么这个域用户所在域的dc是如何来为用户成功构建安全访问令牌呢?要成功构建安全访问令牌必须满足三个条件:
a. 从dc那里取得这个域用户的SID
b. 从DC那里取得这个域用户所具有的权限
c. 取得这个域用户的所属组:包括本地域组、全局组、通用组;本地域组和全局组可以向dc查询,但是通用组只有由DC向GC去查询,因为只有GC存储了通用组的成员列表;这里不管这个用户是否属于某个通用组,都要去查询GC来确定这个用户是否属于某个通用组。
综合以上三个因素,所以当GC不在线的情况下,即使当前域的dc是ok的,当前域的dns是ok的,同样用户不能登录域!
结合实例就是:当contoso.msft中的dc2.contoso.msft(同时也是GC)宕机的情况下,其子域中的用户john是不能登录其所在的域child.contoso.msft的,即使child-dc.child.comtoso.msft是正常的!
例外:
a 域管理员组的成员不受此限制
b 登陆过的客户端可以使用本机的缓存来登录
c 2003的域模式如果为默认的混合模式,在这种情况下通用组是不可用的,所以这个时候是不用去查询GC来确定通用组的情况的!
3. 通用组成员缓存
那如何在GC不在线的情况下,也能让域用户顺利登录呢?
解决问题的方法就是使用通用组成员缓存(当然了,在每个站点都设置GC就不提了,这样做就要考虑硬件成本,毕竟GC会复制大量信息;单域的情况下除外,单域中建议所有的dc都提升为GC,这个时候是不会增加复制流量的);要想在GC不在线的情况下,域用户也能登录;那就必须使用缓存,使用客户机的缓存(前提是此用户必须在这个客户机上登录)或使用dc缓存(这样即使此用户没有在这台客户机上登录,也能登录;当然了要有缓存信息的话,必须要在域中的某个地方登录);这个缓存在dc上信息的可以在dc上看的到的。
4.验证
首先在child-dc.child.contoso.msft上新建一个用户john,然后在dc上看一下;这个用户的msds-cached-membership属性,是空的,是not set!这个属性就是缓存用户的通用组和全局组的信息的!
a. 首先来看一下,在哪里设置通用组成员缓存
b. 禁用dc2.contoso.msft的网卡(相当于GC不可用),在域child.contoso.msft内用用户john在xp客户端登录,这时会发现登录不了(即使这个时候dc和dns都是ok的)
c. 启用GC,用john在child-dc.child.contoso.msft上登录(没有多余的客户端了,前提是修改默认域控制器策略允许john在本地登录),以让child-dc.child.contoso.msft从GC上缓存该用户的通用组和全局组的信息!
这个时候john用户在child-dc.child.contoso.msft上是可以登录的;注销;用administrator登录看看这个用户的缓存的信息:
d. 禁用GC,在xp客户端上用john登录!这个时候你会发现即使gc不在线,即使这个用户以前没有在xp这台客户端上登录过(一点要在本域的其他地方登陆过),它照样能登录成功。
转载于:https://blog.51cto.com/xuesanglang/380893