大家都知道 Windows活动目录中 默认情况下 域用户可以在任意域计算机上登陆 哪么如何阻止这种现象发生呢?
常见的方法有在ADUC中设置用户属性中的登陆到 指定他能够登陆到的计算机 还有就是在客户端组策略的安全设置|本地策略|用户权限指派| 在本地登陆 设置允许在该计算机上登陆的用户和组 还有就是并发登陆 这里我们不讨论这个 微软有一个limitlogon工具 没怎么用过 至少我下下来我不知道从哪里下手 _ 另外我在网上也看到一些解决办法 比如 大智弱驴 的一片博文提到的的 将用户登陆状态写入到SQL数据库中
似乎这些方法都有一个点 需要手动一个一个的去设置用户的登陆属性 这对于大型环境 会打来很大的工作量 为此 我提出下面这个方法 主要思想创建一条域组策略的是将在该计算机上登陆最多的用户添加到 在本地登陆 中去 但是不同的机器又不同的用户 如何解决这个问题呢 我的处理方法是在每个客户端添加一个本地用户组 在策略 在本地登陆 中 将一个组添进去 将登陆客户端机器最多的用户添加到这个组中去 创建本地组和添加用户到组是可以采用脚本来实现的 从而解决了逐个设置的麻烦
本人脚本不是很熟 很多是参照其他的脚本写的 也许有的地方不是很完美
一 创建本地组
有两种方式 一种BAT脚本 一种VBS脚本 将脚本作为启动脚本
BAT方式 net localgroup LogonUser /add /comment:允许本地登组 VBS strComputer = Set objComputer = GetObject( WinNT:// & strComputer & computer ) Set objGroup = objComputer Create( group LogonUser ) objGroup SetInfo |
二 找出在客户端登陆最多的用户
谁的机器 一般情况下当然是谁使用谁登陆的最多 哪么如何找出这个用户呢?登陆登陆 对了 审核 哪么我们得在域中的策略中将登陆成功审核开启 我们只需要检索谁登陆成功审核日志最多 首先第一个要解决的问题就是 我如何获得在这台机器上登陆过得域账户?
每一个域账户登陆后 都会在注册表SOFTWAREMicrosoftWindows NTCurrentVersionProfileList写入一个记录 下面的子项是他们的SID 哪么我只需要读出这些SID就可以了 在反过来通过SID查处用户
Set oReg=GetObject( winmgmts:{impersonationLevel=impersonate}!\ &_ strComputer & rootdefault:StdRegProv ) strKeyPath = SOFTWAREMicrosoftWindows NTCurrentVersionProfileList oReg EnumKey HKEY_LOCAL_MACHINE strKeyPath arrSubKeys For Each subkey In arrSubKeys If left(subkey ) = S Then 比较SID 只统计域帐户 上面这一行是域用户SID的前面一段 应该属于域ID Set objWMIService = GetObject( winmgmts:\ & strComputer & rootcimv ) Set colItems = objWMIService ExecQuery _ ( Select * from Win _UserAccount Where LocalAccount= False And SID= & subkey & ) For Each objItem in colItems LogonTimes=CountLogon( cotoso\ & objitem Name) 函数CountLogon 统计事件日志安全 中成功审核的事件次数 |
Function CountLogon(Username) strComputer = Set objWMIService = GetObject( winmgmts:{(Security)}\ & _ strComputer & rootcimv ) Set colEvents = objWMIService ExecQuery _ ( SELECT * FROM Win _NTLogEvent WHERE LogFile = Security AND & _ EventCode = AND User = & username & ) 统计事件 的用户 CountLogon=colEvents Count end Function |
三 将该账户添加到LogonUser组中
Function GroupADD(MUser) Set objWshShell = WScript CreateObject( WScript Shell ) End Function |
四 为了避免每次开机重复执行 我们需要做一个记录 如果已经执行过操作 我们就不再继续执行 我的办法是建立一个文本文档 启动的时候检查下有没有这个文档 有就不再做上面的操作
检查历史记录 Function CheckRecord() Set objFSO = WScript CreateObject( Scripting FileSystemObject ) Set existFSO = WScript CreateObject( Scripting FileSystemObject ) If existFso FileExists( c:windowssystem mainuser dat ) Then CheckRecord = End if End Function 记录历史 Function DoRecord() Set objFSO = WScript CreateObject( Scripting FileSystemObject ) Set OutPutFile = objFSO CreateTextFile( c:windowssystem mainuser dat True) OutPutFile Writeline 域重要文件! OutPutFile Close End Function |
五 创建域级别策略 仅允许LogonUser Domain admin Administrators登陆