網路上看到一篇網友的問題:
因為AD中的電腦進進出出的,所以有很多電腦是未使用的
找到方法,用2003可以利用dsquery 來查詢管理物件
例如:
dsquery computer domainroot -inactive 12 可以查詢未登入的電腦帳號
可是在實作時使用
dsquery computer domainroot 可以找到所有電腦帳號
但是在加上-inactive 12
dsquery computer domainroot -inactive 12
就會出現錯誤訊息:
"dsquery 已失敗:參數錯誤。:Windows 無法執行這個查詢,因為您已連線到一個不支援這個查詢的網域"。
不知是否那裡應該注意,而產生錯誤,請大家幫忙!
身為系統管理者,最痛的就是承接以前亂七八糟的管理與毫無章法的亂建置,後面有心收尾的人可是粉痛阿,電腦盯太久眼睛痛,鍵盤滑鼠用太久手挽痛,姿勢都不變腰痛,加班處理不能領加班費心痛,出門太陽沒出來、回家太陽早落下老婆看了心痛............
所以要利用一點小技巧來達到事半功倍的效果,分享一個比較""個人白痴""的做法,但不保證適合每個人作業環境哦!
1.建立一個LIST.BAT檔案,內容如下
cscript "LastLogonComputer.vbs" > Computer.TXT
2.建立一個""LastLogonComputer.VBS”檔案,程式碼如下:Option Explicit
Dim objRootDSE, strConfig, objConnection, objCommand, strQuery
Dim objRecordSet, objDC
Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
Dim strDN, dtmDate, objDate, lngDate, objList, strUser
Dim strBase, strFilter, strAttributes, lngHigh, lngLow
' Use a dictionary object to track latest lastLogon for each user.
Set objList = CreateObject("Scripting.Dictionary")
objList.CompareMode = vbTextCompare
' Obtain local Time Zone bias from machine registry.
Set objShell = CreateObject("Wscript.Shell")
lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
& "TimeZoneInformation\ActiveTimeBias")
If UCase(TypeName(lngBiasKey)) = "LONG" Then
lngBias = lngBiasKey
ElseIf UCase(TypeName(lngBiasKey)) = "VARIANT()" Then
lngBias = 0
For k = 0 To UBound(lngBiasKey)
lngBias = lngBias + (lngBiasKey(k) * 256^k)
Next
End If
' Determine configuration context and DNS domain from RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strConfig = objRootDSE.Get("configurationNamingContext")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
' Use ADO to search Active Directory for ObjectClass nTDSDSA.
' This will identify all Domain Controllers.
Set objCommand = CreateObject("ADODB.Command")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strBase = "
strFilter = "(objectClass=nTDSDSA)"
strAttributes = "AdsPath"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 100
objCommand.Properties("Timeout") = 60
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
' Enumerate parent objects of class nTDSDSA. Save Domain Controller
' AdsPaths in dynamic array arrstrDCs.
k = 0
Do Until objRecordSet.EOF
Set objDC = _
GetObject(GetObject(objRecordSet.Fields("AdsPath")).Parent)
ReDim Preserve arrstrDCs(k)
arrstrDCs(k) = objDC.DNSHostName
k = k + 1
objRecordSet.MoveNext
Loop
' Retrieve lastLogon attribute for each user on each Domain Controller.
For k = 0 To Ubound(arrstrDCs)
strBase = "
strFilter = "(objectCategory=Computer)"
strAttributes = "distinguishedName,lastLogon"
strQuery = strBase & ";" & strFilter & ";" & strAttributes _
& ";subtree"
objCommand.CommandText = strQuery
On Error Resume Next
Set objRecordSet = objCommand.Execute
If Err.Number <> 0 Then
On Error GoTo 0
Wscript.Echo "Domain Controller not available: " & arrstrDCs(k)
Else
On Error GoTo 0
Do Until objRecordSet.EOF
strDN = objRecordSet.Fields("distinguishedName")
lngDate = objRecordSet.Fields("lastLogon")
On Error Resume Next
Set objDate = lngDate
If Err.Number <> 0 Then
On Error GoTo 0
dtmDate = #1/1/1601#
Else
On Error GoTo 0
lngHigh = objDate.HighPart
lngLow = objDate.LowPart
If lngLow < 0 Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0 ) Then
dtmDate = #1/1/1601#
Else
dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
+ lngLow)/600000000 - lngBias)/1440
End If
End If
If objList.Exists(strDN) Then
If dtmDate > objList(strDN) Then
objList(strDN) = dtmDate
End If
Else
objList.Add strDN, dtmDate
End If
objRecordSet.MoveNext
Loop
End If
Next
' Output latest lastLogon date for each user.
For Each strUser In objList
Wscript.Echo strUser & " ; " & objList(strUser)
Next
' Clean up.
objConnection.Close
Set objRootDSE = Nothing
Set objConnection = Nothing
Set objCommand = Nothing
Set objRecordSet = Nothing
Set objDC = Nothing
Set objDate = Nothing
Set objList = Nothing
Set objShell = Nothing
將 LIST.BAT 與 LastLogonComputer.VBS 一起放到DOMAIN SERVER上執行
這樣會DOWN出全部的電腦,且會一筆一筆show出Computer最後一次被DC找到的時間,如果Computer都沒開機的話,就是show出最後一次關機的時間,
接下來我會用EXCEL把【Computer.TXT】過濾一下,確認電腦帳號是否真的需要停用,需要停用的帳號,我會先停用關閉,以免誤砍
用上述的方式過濾出電腦+登入時間後,同理把匯出的TXT檔轉到EXCEL整理後,再次編排確定要砍的電腦帳號
我會用以下指令列 來大量停用帳號或是砍殺帳號!
指令如下
DSMOD COMPUTER CN=ADAMS_KENG,OU=不分類電腦帳號,OU=GlobalComputerForDepartment,DC=tpest,DC=tfn -disabled /yes
DSMOD COMPUTER CN=ATRIC_CHANG01,OU=不分類電腦帳號,OU=GlobalComputerForDepartment,DC=tpest,DC=tfn -disabled /yes
DSMOD COMPUTER CN=ATRIC_CHANG,OU=不分類電腦帳號,OU=GlobalComputerForDepartment,DC=tpest,DC=tfn -disabled /yes
DSMOD COMPUTER CN=CHENCHENG_LIN,OU=不分類電腦帳號,OU=GlobalComputerForDepartment,DC=tpest,DC=tfn -disabled /yes
DSMOD COMPUTER CN=DALLAR_HUNG,OU=不分類電腦帳號,OU=GlobalComputerForDepartment,DC=tpest,DC=tfn -disabled /yes
這樣一來就算是"""半自動""了 也不會誤砍去生小孩或是留職停薪的帳號!
Recommend to Front page

Comment Permissions: Allow commenting