網路上看到一篇網友的問題:
因為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


這樣一來就算是"""半自動""了 也不會誤砍去生小孩或是留職停薪的帳號!

 

 


HarlemHsu 發表在 痞客邦 PIXNET 留言(0) 人氣()