Чтение из AD параметров компьютеров (Имя, дата создания объекта, дата последнего входа и т.д.)
'***********************************************************************
' Скрипт вытаcкивает много атрибутов объекта компьютер из домена
' никаких привелегий не требуется кроме пользовательских
'maden by DmiSh
'***********************************************************************
' ----------------------------------------------------------------------
Option Explicit
'--------------имя файла отчета и его создание
Const StrNameTextFileReport = "c:\LastLogon.csv"
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set CSVFile=FSO.OpenTextFile(StrNameTextFileReport, 2 ,true)
'--------------объявление переменных
Dim objRootDSE, strConfig, objConnection, objCommand, strQuery
Dim objRecordSet, objDC
Dim FSO, CSVFile
Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
Dim strDN, dtmDate, objDate, lngDate, objList, strUser
Dim strBase, strFilter, strAttributes, lngHigh, lngLow
'переменные строки для временного хранения значений атрибутов
Dim Strcn,StrDescription,StrOperatingSystem,StrOperatingSystemVersion,StrOperatingSystemServicePack,StrWhenCreated,StrLogonCount,StrlastLogoff,StrlastLogon
Dim StrRes
Dim objCN,objdistinguishedName,objDescription,objOperatingSystem,objOperatingSystemVersion,objOperatingSystemServicePack,objWhenCreated,objLogonCount,objlastLogoff,objlastLogon
'----------------------------------------
'-------------- Используем объект dictionary для хранения параметров для каждого компьютера
Set objList = CreateObject("Scripting.Dictionary")
objList.CompareMode = vbTextCompare
'--------------objCN
Set objCN = CreateObject("Scripting.Dictionary")
objCN.CompareMode = vbTextCompare
'--------------objdistinguishedName
Set objdistinguishedName = CreateObject("Scripting.Dictionary")
objdistinguishedName.CompareMode = vbTextCompare
'--------------objDescription
Set objDescription = CreateObject("Scripting.Dictionary")
objDescription.CompareMode = vbTextCompare
'--------------objOperatingSystem
Set objOperatingSystem = CreateObject("Scripting.Dictionary")
objOperatingSystem.CompareMode = vbTextCompare
'--------------objOperatingSystemVersion
Set objOperatingSystemVersion = CreateObject("Scripting.Dictionary")
objOperatingSystemVersion.CompareMode = vbTextCompare
'--------------objOperatingSystemServicePack
Set objOperatingSystemServicePack = CreateObject("Scripting.Dictionary")
objOperatingSystemServicePack.CompareMode = vbTextCompare
'--------------WhenCreated
Set objWhenCreated = CreateObject("Scripting.Dictionary")
objWhenCreated.CompareMode = vbTextCompare
'--------------objLogonCount
Set objLogonCount = CreateObject("Scripting.Dictionary")
objLogonCount.CompareMode = vbTextCompare
'--------------objlastLogoff
Set objlastLogoff = CreateObject("Scripting.Dictionary")
objlastLogoff.CompareMode = vbTextCompare
'--------------objlastLogon
Set objlastLogon = CreateObject("Scripting.Dictionary")
objlastLogon.CompareMode = vbTextCompare
'-------------------------------------
'-------------- Получение настроек о зонах времени из регистра
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
'-------------------------------------
' Определение контекста конфигурации и DNS из RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strConfig = objRootDSE.Get("configurationNamingContext")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
'-------------------------------------
' Используем ADO для поиска Active Directory на передмет ObjectClass nTDSDSA.
' Это определит все контроллеры домена
Set objCommand = CreateObject("ADODB.Command")
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strBase = "<LDAP://" & strConfig & ">"
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
'-------------------------------------
' Перечисление родительских оъектов класса nTDSDSA. Save Domain Controller
' AdsPaths в динамическом массиве 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
'-------------------------------------
' Получение атрибутов компьютера на каждом контроллере домена
For k = 0 To Ubound(arrstrDCs)
strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
'strFilter = "(&(objectCategory=person)(objectClass=user))"
strFilter = "(&(objectCategory=computer)(objectClass=computer))"
'strAttributes = "distinguishedName,lastLogon"
strAttributes = "cn,distinguishedName,Description,OperatingSystem,OperatingSystemVersion,OperatingSystemServicePack,WhenCreated,LogonCount,lastLogoff,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")
' objCN.Add strDN, objRecordSet.Fields("cn")
' objdistinguishedName.Add strDN, objRecordSet.Fields("distinguishedName")
' objDescription.Add strDN,objRecordSet.Fields("Description")
' objOperatingSystem.Add strDN,objRecordSet.Fields("OperatingSystem")
' objOperatingSystemVersion.Add strDN,objRecordSet.Fields("OperatingSystemVersion")
' objOperatingSystemServicePack.Add strDN,objRecordSet.Fields("OperatingSystemServicePack")
' objWhenCreated.Add strDN,objRecordSet.Fields("WhenCreated")
' objLogonCount.Add strDN,objRecordSet.Fields("LogonCount")
' objlastLogoff.Add strDN,objRecordSet.Fields("lastLogoff")
StrCN = objRecordSet.Fields("cn").Value
StrOperatingSystem = objRecordSet.Fields("OperatingSystem")
StrOperatingSystemVersion = objRecordSet.Fields("OperatingSystemVersion")
StrOperatingSystemServicePack = objRecordSet.Fields("OperatingSystemServicePack")
StrWhenCreated = objRecordSet.Fields("WhenCreated")
StrLogonCount = objRecordSet.Fields("LogonCount")
StrlastLogoff = objRecordSet.Fields("lastLogoff")
StrlastLogon = objRecordSet.Fields("lastLogon")
'---------------------------- добавление данных в "Scripting.Dictionary"-s
If objList.Exists(strDN) Then
If dtmDate > objList(strDN) Then
objList(strDN) = FuncConvertTime( StrlastLogon ) 'dtmDate
End If
Else
objList.Add strDN, FuncConvertTime( StrlastLogon ) 'dtmDate
End If
'----------------------------
If objCN.Exists(strDN) Then
Else
objCN.Add strDN, StrCN
End If
'----------------------------
If objdistinguishedName.Exists(strDN) Then
Else
objdistinguishedName.Add strDN, strDN
End If
'----------------------------
'********************************
objDescription.Add strDN,FuncGetDescriptionComputerFromAdByDistinguishedName( strDN )
'----------------------------
If objOperatingSystem.Exists(strDN) Then
Else
objOperatingSystem.Add strDN, StrOperatingSystem
End If
'----------------------------
If objOperatingSystemVersion.Exists(strDN) Then
Else
objOperatingSystemVersion.Add strDN, StrOperatingSystemVersion
End If
'----------------------------
If objOperatingSystemServicePack.Exists(strDN) Then
Else
objOperatingSystemServicePack.Add strDN, StrOperatingSystemServicePack
End If
'----------------------------
If objWhenCreated.Exists(strDN) Then
Else
objWhenCreated.Add strDN, StrWhenCreated
End If
'----------------------------
If objlastLogoff.Exists(strDN) Then
Else
objlastLogoff.Add strDN, FuncConvertTime(StrlastLogoff)
End If
'----------------------------
If objLogonCount.Exists(strDN) Then
Else
objLogonCount.Add strDN, StrLogonCount
End If
'----------------------------
objRecordSet.MoveNext
Loop
End If
Exit For
Next
'-------------------------------------
' Вывод даты последнего lastLogon для каждого пользователя
CSVFile.WriteLine("cn;distinguishedName;Description;OperatingSystem;OperatingSystemVersion;OperatingSystemServicePack;WhenCreated;LogonCount;lastLogoff;lastLogon")
For Each strUser In objList
CSVFile.WriteLine(objCN(strUser) & " ; " & strUser & " ; " & objDescription(strUser) & " ; " & objOperatingSystem(strUser) & " ; " & objOperatingSystemVersion(strUser) & " ; " & objOperatingSystemServicePack(strUser) & " ; " & objWhenCreated(strUser) & " ; " & objLogonCount(strUser) & " ; " & objlastLogoff(strUser) & " ; " & objList(strUser))
Next
'-------------------------------------
' Очистка
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
WScript.Echo "Файл " & StrNameTextFileReport & " заполнен"
'********************************************************
'функция преобразует дату из числового формата в нормальный
Function FuncConvertTime(x)
' Получение настроек о зонах времени из регистра
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
On Error Resume Next
Set objDate = x'lastLogon'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
FuncConvertTime = #1/1/1601#
Else
FuncConvertTime = #1/1/1601# + (((lngHigh * (2 ^ 32)) + lngLow)/600000000 - lngBias)/1440
End If
End If
End Function
'********************************************************
'функция возвращает описание компьютера из AD по DistinguishedName
Function FuncGetDescriptionComputerFromAdByDistinguishedName( DN )
Dim LDAPQuery
LDAPQuery = "LDAP://" & DN ' & vbCrLf
'WScript.Echo "<<" & LDAPQuery & ">>"
Dim objComputer
Dim StrobjPropertyDescription
Set objComputer = GetObject( LDAPQuery )
'--------------Description
On Error Resume Next
FuncGetDescriptionComputerFromAdByDistinguishedName = objComputer.Get("Description")
If IsNull(FuncGetDescriptionComputerFromAdByDistinguishedName) Then
FuncGetDescriptionComputerFromAdByDistinguishedName = "-"
Else
End If
StrobjPropertyDescription = Null
End Function
Интересное на сайте:
Голосов пока нет

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