相信很多網管人員都有這個痛,也曾經在網路上尋尋覓覓,始終找不到一個很好的方法、工具,來解決那些在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.沒有篩選功能
真是優質的好分享,大推。
tom6507大大這種模式不錯,從問答中再整理成更完整的知識,讓有需要的人可以更容易閱讀、使用。