相信很多网管人员都有这个痛,也曾经在网路上寻寻觅觅,始终找不到一个很好的方法、工具,来解决那些在AD中不断增加却不会减少的电脑。
小弟也曾经在AD里面,如何自动移除已不存在的PC分享过自己写的script,经过网路的洗礼,收集了各位大德的建议,在这边用分享的方式来继续这段script,期望各位能够继续支持,并加以协助修改成为更完整的script来造福芸芸众生:P
首先,先来个批次档
第一行是去呼叫编辑好的script,接着会呼叫"Active Directory 使用者及电脑",所以这个程式必须在AD主机上执行
cscript 停用消失的电脑.vbsC:\WINDOWS\system32\dsa.msc
接下来就是重头戏,找出那些消失很久的电脑,目前已经设定可以排除"Domain Controllers"这个群组内的电脑,以免发生惨剧,也不会将电脑删除,只会停用。
当然啦,script还是要有admin的权限才可以执行!!
有网友反应,希望只要列出名单就好,不要停用,这部分虽然我没写出来,不过还是有撇步可以用,当各位在执行批次档的时候,会开启一个Dos模式的视窗,也会看到正在被停用的电脑,因为最后会呼叫"AD使用者及电脑",所以在"AD使用者及电脑"不关闭的状况下,Dos视窗并不会被关闭,也就是说各位可以用複製的方式,将那些电脑名称给複製出来。
on error resume nextSet objRootDSE = GetObject("LDAP://rootDSE")Domain=objRootDSE.Get("defaultNamingContext")Const ADS_SCOPE_SUBTREE = 2Const adOpenStatic = 3Const adLockOptimistic = 3Const adUseClient = 3Set AD_Connection = CreateObject("ADODB.Connection")Set objCommand = CreateObject("ADODB.Command")AD_Connection.Provider = "ADsDSOObject"AD_Connection.Open "Active Directory Provider"Set objCommand.ActiveConnection = AD_ConnectionobjCommand.Properties("Page Size") = 10000objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.CommandText = _ "SELECT sAMAccountName,cn,department,adspath FROM 'LDAP://"&domain&"' WHERE objectCategory='computer'" Set ADRecordSet = objCommand.ExecuteADRecordSet.MoveFirstDo Until ADRecordSet.EOFstrPath = ADRecordSet.Fields("AdsPath").ValueComputerCN = ADRecordSet.Fields("CN").ValueIf 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 IfADRecordSet.MoveNextLoopAMS_cpf_cpyRecordset.CloseADRecordSet.close
如果想要停用那些3个月以上没登入过的帐号,请把程式码第19行最后一段objectCategory='computer'中的computer改成 user 就可以了
后记:
曾经有网友不小心把DC主机都给停用了@@,解决的方法很简单,将程式码里面的true这个字串改成false,然后再执行一次就好了。程式会把所有被停用的电脑再次启用,然后将不要被停用的电脑先移到Domain Controllers群组内,才可以再次执行停用。
修改纪录:
1.新增排除群组
2.64位元主机不会被误判
3.没有筛选功能