iT邦幫忙

20

AD中,自動停用太久沒連上AD的電腦&帳號

相信很多網管人員都有這個痛,也曾經在網路上尋尋覓覓,始終找不到一個很好的方法、工具,來解決那些在AD中不斷增加卻不會減少的電腦。
小弟也曾經在AD裡面,如何自動移除已不存在的PC分享過自己寫的script,經過網路的洗禮,收集了各位大德的建議,在這邊用分享的方式來繼續這段script,期望各位能夠繼續支持,並加以協助修改成為更完整的script來造福芸芸眾生:P
首先,先來個批次檔
第一行是去呼叫編輯好的script,接著會呼叫"Active Directory 使用者及電腦",所以這個程式必須在AD主機上執行

cscript 停用消失的電腦.vbs
C:\WINDOWS\system32\dsa.msc

接下來就是重頭戲,找出那些消失很久的電腦,目前已經設定可以排除"Domain Controllers"這個群組內的電腦,以免發生慘劇,也不會將電腦刪除,只會停用。
當然啦,script還是要有admin的權限才可以執行!!

有網友反應,希望只要列出名單就好,不要停用,這部分雖然我沒寫出來,不過還是有撇步可以用,當各位在執行批次檔的時候,會開啟一個Dos模式的視窗,也會看到正在被停用的電腦,因為最後會呼叫"AD使用者及電腦",所以在"AD使用者及電腦"不關閉的狀況下,Dos視窗並不會被關閉,也就是說各位可以用複製的方式,將那些電腦名稱給複製出來。

on error resume next
Set objRootDSE = GetObject("LDAP://rootDSE")
Domain=objRootDSE.Get("defaultNamingContext")
Const ADS_SCOPE_SUBTREE = 2
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3

Set AD_Connection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
AD_Connection.Provider = "ADsDSOObject"
AD_Connection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = AD_Connection

objCommand.Properties("Page Size") = 10000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = _
    "SELECT sAMAccountName,cn,department,adspath FROM 'LDAP://"&domain&"' WHERE objectCategory='computer'"  
Set ADRecordSet = objCommand.Execute

ADRecordSet.MoveFirst

Do Until ADRecordSet.EOF
	strPath = ADRecordSet.Fields("AdsPath").Value
	ComputerCN = ADRecordSet.Fields("CN").Value
	If InStr(strPath,"Domain Controllers")=0 Then 
	Set objPC = GetObject(strPath)
	Set objLastLogon = objPC.Get("lastLogon") 
    	intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart 
	intLastLogonTime = intLastLogonTime / (60 * 10000000) 
	intLastLogonTime = intLastLogonTime / 1440 
	StrTime = intLastLogonTime + #1/1/1601# 
	dtmEndingDate = strTime 
	intDays = DateDiff("d", dtmEndingDate, Now) 

	If (intDays > 60) And (intDays < 90) Then 
		' 停用 60 天以上到  90 天內未登入的電腦帳戶 
		WScript.Echo "停用 " & ComputerCN & " " & strTime & " " & Intdays 
		objPC.AccountDisabled = True 
		objPC.SetInfo 
	ElseIf intDays > 90 Then 
		' 停用 90 天未登入的電腦帳戶 
		WScript.Echo "停用 " & ComputerCN & " " & strTime & " " & Intdays 
		objPC.AccountDisabled = True 
		objPC.SetInfo 
' 		objPC.DeleteObject(0) 
	End If 
	end If
	ADRecordSet.MoveNext
Loop

AMS_cpf_cpyRecordset.Close
ADRecordSet.close

如果想要停用那些3個月以上沒登入過的帳號,請把程式碼第19行最後一段objectCategory='computer'中的computer改成 user 就可以了

後記:
曾經有網友不小心把DC主機都給停用了@@,解決的方法很簡單,將程式碼裡面的true這個字串改成false,然後再執行一次就好了。程式會把所有被停用的電腦再次啟用,然後將不要被停用的電腦先移到Domain Controllers群組內,才可以再次執行停用。

修改紀錄:
1.新增排除群組
2.64位元主機不會被誤判
3.沒有篩選功能


2 則留言

0
wordsmith
iT邦高手 1 級 ‧ 2008-12-23 11:06:50

真是優質的好分享,大推。

tom6507大大這種模式不錯,從問答中再整理成更完整的知識,讓有需要的人可以更容易閱讀、使用。

0
xxxyyyzzz
iT邦研究生 1 級 ‧ 2008-12-25 07:28:31

謝謝分享,書上查不到的.

我要留言

立即登入留言