标签: VBS 域 限制多点登录 用户 本地管理员 组 AD 休闲 职场
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://iamxh.blog.51cto.com/464046/775775
前段时间公司部署了基于WIN2008 R2的AD域环境,客户端数量约200台左右,结合EXCHANGE2010使用,部署客户端前,在AD上做了组策略,通过添加受限制的组功能,把DOMAIN USERS添加到了客户端本地管理员组里,这样员工使用域用户登录后,就同时拥有了本机管理员权限,可以自行安装一些软件,减少了很多的维护量。
可是随之而来的问题也产生了,客户端本地管理员组中包括DOMAIN USERS组,意味着所有的域用户都具有任何客户端本地管理员权限,也就是说任何一个域用户都可以登录任意一台电脑,且拥有最高权限,更可怕的是拥有了管理员权限,通过网络访问任意一台电脑的默认隐藏共享盘也是轻而易举,针对以上2个问题,百度,GOOGLE发现没有完整的解决方案,经过苦心琢磨,拼凑,加上反复的测试,最后终于找到了终极解决方案,现在已经在公司域环境内验证通过。
第一个问题:任何一个域用户都具有任意一台电脑的最高本地管理员权限。
解决方案:结合域组策略和VBS脚本实现:
第一步:针对整个AD域包括计算机和用户新建一条策略,在计算机--策略--WINDOWS设置--脚本(启动/关机) 添加启动脚本,脚本内容流程为开机保留DOMAIN ADMINS组前提下,自动清空管理员组中用户,并添加 DOMAIN USERS组,(此处脚本不能填写UNC路径,因为开机脚本访问不到网络路径)让全部域用户拥有任意一台域内电脑的本地管理员权限。
将以下内容复制到TXT文件内,保存格式为VBS。
On Error Resume Next
dim objGroup
dim objDgroup
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
names = array("Administrator", "此处替换为域名\Domain Admins")
ValidUsers = join(names,":")
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
If InStr(ValidUsers,objUser.Name)=0 Then
objGroup.Remove(objUser.ADsPath)
End IF
Next
Set objDGroup = GetObject("WinNT://TCGROUP/Domain Users,group")
Set oNet = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators,group")
If Not objGroup.IsMember(objDGroup.AdsPath) Then
objGroup.Add(objDGroup.AdsPath)
End If
第二步:在原有策略里 选择用户--策略--WINDOWS设置--脚本(登录/注销),分别添加登录注销脚本,把脚本放在任何域用户都能访问到的域内服务器的共享文件夹内,脚本名格式为\\IP地址\共享文件夹名\脚本名.vbs,脚本如下:
脚本的内容执行流程是:用户登录后,将目前登录的域用户加入到本地管理员组中,同时删除在本地管理员组中存在的DOMAIN USERS组,这样只有登录的域用户拥有本地管理员权限,如果之前未做开机脚本,则此脚本执行不成功,因为没有管理员权限。注:如存在WIN7系统,需关闭UAC才可成功执行,可以在组策略里配置,计算机--策略--WINDOWS设置--安全设置--本地策略--安全选项--用户账户控制:以管理员批准模式运行所有管理员,把此项设置为已禁用即可禁用UAC。
将以下内容复制到TXT文件内,保存格式为VBS。
On Error Resume Next
dim objUser
dim objGroup
dim objDGroup
Set oNet = CreateObject("Wscript.Network")
strComputer = "."
sUser = oNet.UserName
sDomain = oNet.UserDomain
Set objUser = GetObject("WinNT://"&sDomain&"/"&sUser&",user")
Set objGroup = GetObject("WinNT://"&strComputer&"/administrators,group")
If Not objGroup.IsMember(objUser.AdsPath) Then
objGroup.Add(objUser.AdsPath)
End If
On Error Resume Next
Set oNet = CreateObject("Wscript.Network")
strComputer = "."
Set objDGroup = GetObject("WinNT://此处替换为域名/domain users,group")
Set objGroup = GetObject("WinNT://"&strComputer&"/administrators,group")
If objGroup.IsMember(objDgroup.AdsPath) Then
objGroup.Remove(objDgroup.AdsPath)
End If
执行以上操作后,只有登录此客户端的用户拥有本地管理员权限。但其他用户还是可以登录客户端,还是一样可以获得管理员权限,所以请接下去看第二个问题。
第二个问题:任何域用户都可以登录到任意一台域内电脑
解决方案:完成以上第一个问题的解决方案步骤后,域用户登录电脑后可以自动获得本地管理员权限,但还是不能控制其他用户登录到此电脑,所以需要在域内,新建一个OU,把在第一个问题解决方案内登录过且成功获取权限的计算机(只是计算机)加入到新的OU里,新的OU设置为阻止策略继承,然后在新建的OU内新建一条组策略,在计算机--策略--WINDOWS设置--安全设置--本地策略--用户权利指派--允许本地登录内,只添加ADMINISTRATORS组,确保只保留这一个组。这样,用户重启后,因为阻止了策略继承,所以之前设置的添加DOMAIN USERS到本地管理员的策略不会生效,本地管理员组内就只剩下登录过的域用户和DOMAIN ADMINS,而现在又设置了允许本地登录内只包含ADMINISTRATORS,所以其他域用户也登录不了这台客户端,只有此域用户可以登录且拥有管理员权限,以后加入域的新电脑会默认在COMPUTERS组内,待域用户登录过一次后,把计算机移动到新建的阻止策略继承的组,就可同时实现加域用户到本地管理员组和拒绝其他用户登录的功能,如因员工离职,电脑给其他人使用,只需把计算机移动回COMPUTERS组,待新用户登录过一次后,再移动回阻止策略继承的OU内即可。这样做下来,省了好多维护的工作量,何乐而不为,同时兼顾了安全。可根据自己实际应用的环境和需求,做适当调整,灵活运用。