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