大家都知道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)
If existFsoFileExists(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登陸
From:http://tw.wingwit.com/Article/os/xtgl/201311/8707.html