пятница, 11 апреля 2014 г.

VBScript: поиск и удаление устаревших учётных записей компьютеров в Active Directory

Скрипт предназначен для поиска в Active Directory учётных записей персональных компьютеров, которые по каким либо причинам давно не синхронизировались с доменом.
Чтобы начать работу, необходимо прописать начальные значения следующих переменных:

FQDN - имя LDAP вашего домена или нужной ветки;
intTimeLimit - считать записи устаревшими, если они не синхронизировались более данного количества дней назад;
flagDelete - может принимать два значения:
    TRUE - выполнять удаление при поиске учётных записей;
    FALSE - режим чтения, только отображать информацию.

ON ERROR RESUME NEXT
FQDN = "DC=mydomain,DC=corp" 'Input your Fully Qualified Domain Name or LDAP path to subtree
intTimeLimit = 360  'Time limit in number of days
flagDelete = FALSE  'Flag for deleting old computers. FASLE = find only, TRUE = find and DELETE!!!
Const ADS_SCOPE_SUBTREE = 2
SET objConnection = CreateObject("ADODB.Connection")
SET objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
SET objCommand.ActiveConnection = objConnection
objCommand.CommandText = "Select Name,distinguishedName,lastLogon from " & "'LDAP://" & FQDN & "' where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
SET objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
DO UNTIL objRecordset.EOF
 objLogon = objRecordSet.Fields("lastLogon")
 intLogonTime = objLogon.HighPart * (2^32) + objLogon.LowPart
 intLogonTime = intLogonTime / (60 * 10000000)
 intLogonTime = intLogonTime / 1440
 IF intLogonTime + #1/1/1601# < Now - intTimeLimit THEN
  Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
  Wscript.Echo "Path: " & objRecordSet.Fields("distinguishedName").Value
  WScript.Echo "Approx last logon timestamp: " & intLogonTime + #1/1/1601#
  Wscript.Echo "=========================================================" 
  IF flagDelete THEN
   SET objComputer = GetObject("LDAP://" & objRecordSet.Fields("distinguishedName").Value)
   objComputer.DeleteObject(0)
  END IF
 END IF
    objRecordSet.MoveNext
LOOP

Особенно внимательным нужно быть с переменной "intTimeLimit"!!!
Задание слишком малого значения может привести к потери практически всех компьютерных аккаунтов!!!

Для удобства скрипт лучше запускать с помощью "cscript.exe".

Комментариев нет:

Отправить комментарий