Active Directory: letzte Benutzer oder Workstation-Anmeldung auslesen
letzte Benutzer oder Workstation-Anmeldung aus dem Active Directory auslesen
Hallo Admins!
Habe jetzt schon mehrere Foren-Einträge durchforstet, aber keiner trifft so richtig mein Problem.
Ich suche ein Programm, mit dem ich folgende Daten aus dem AD auslesen kann.
Das Tool soll am besten tabellarisch, oder in der AD-Verwaltung selbst den letzen Anmeldezeitpunkt eines Benutzers bzw.
einer Workstation anzeigen.
Ich hatte mal ein Programm, das einen zusätlichen Reiter in der AD-Verwaltung mit diesen Infos eingetragen hat, jedoch finde ich es nicht wieder. Am liebsten wäre mir aber wie beschrieben eine tabellarische Aufbereitung.
Vielen Dank im Voraus!
Gruß
Stefan
Hallo Admins!
Habe jetzt schon mehrere Foren-Einträge durchforstet, aber keiner trifft so richtig mein Problem.
Ich suche ein Programm, mit dem ich folgende Daten aus dem AD auslesen kann.
Das Tool soll am besten tabellarisch, oder in der AD-Verwaltung selbst den letzen Anmeldezeitpunkt eines Benutzers bzw.
einer Workstation anzeigen.
Ich hatte mal ein Programm, das einen zusätlichen Reiter in der AD-Verwaltung mit diesen Infos eingetragen hat, jedoch finde ich es nicht wieder. Am liebsten wäre mir aber wie beschrieben eine tabellarische Aufbereitung.
Vielen Dank im Voraus!
Gruß
Stefan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 26401
Url: https://administrator.de/contentid/26401
Ausgedruckt am: 25.11.2024 um 13:11 Uhr
8 Kommentare
Neuester Kommentar
http://www.systemtools.com/hyena/ sollte das können. Auch sonst ist es ein tolles Tool.
In einer 2003 Domäne müsstest du deine Infos aber auch direkt über eine Abfrage in "AD Benutzer und Computer" bekommen könen.
In einer 2003 Domäne müsstest du deine Infos aber auch direkt über eine Abfrage in "AD Benutzer und Computer" bekommen könen.
Bat-Datei anlegen:
@echo off
usrstat up | grep %1
pause
exit
Datei aus den W2k-Server-Admintools: Usrstat.exe
Den Pfad mit der bat-Datei in PATH eintragen.
Unter der Konsole kannst du mit "batdatei-name userlogin" auch von mehreren DC den Login abfragen (dauert)
@echo off
usrstat up | grep %1
pause
exit
Datei aus den W2k-Server-Admintools: Usrstat.exe
Den Pfad mit der bat-Datei in PATH eintragen.
Unter der Konsole kannst du mit "batdatei-name userlogin" auch von mehreren DC den Login abfragen (dauert)
Hallo,
auch wenn das Problem bzw der Thread schon älter ist, bin ich bei der Suche auf Google darauf gestoßen.
Es wird sicherlich jemanden helfen, wenn ich hier ein VB-Script poste, was mehr oder weniger zusammengeklaut und gebastelt ist, aber den Sinn und Zweck gut erfüllt bei Computern im AD. Es funktioniert sogar mit mehreren DCs.
empfohlener Aufruf: cscript <scriptname> //NoLogo > test.csv
Gruß
Markus
auch wenn das Problem bzw der Thread schon älter ist, bin ich bei der Suche auf Google darauf gestoßen.
Es wird sicherlich jemanden helfen, wenn ich hier ein VB-Script poste, was mehr oder weniger zusammengeklaut und gebastelt ist, aber den Sinn und Zweck gut erfüllt bei Computern im AD. Es funktioniert sogar mit mehreren DCs.
empfohlener Aufruf: cscript <scriptname> //NoLogo > test.csv
Gruß
Markus
' LastLogon.vbs
' VBScript program to determine when each computer in the domain last logged
' on.
'
Option Explicit
if not IsHostCscript() then
wscript.echo("Bitte mit cscript <scriptname> starten!!!")
wscript.quit
end if
Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery
Dim adoRecordset, objDC
Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
Dim strDN, dtmDate, objDate, objList, strUser, objList_LogonServer
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
' Anmeldeserver mit abspeichern!
Set objList_LogonServer = CreateObject("Scripting.Dictionary")
objList.CompareMode = vbTextCompare
' Obtain local Time Zone bias from machine registry.
' Die lokale Zeitzone des Rechners bestimmen, an dem dieses Script ausgeführt wird.
' Der Wert aus der Registry wird dann mit in die Berechnung des Anmeldezeitpunkts einbezogen
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 adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection
strBase = "<LDAP://" & strConfig & ">"
strFilter = "(objectClass=nTDSDSA)"
strAttributes = "AdsPath"
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 60
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute
' Enumerate parent objects of class nTDSDSA. Save Domain Controller
' AdsPaths in dynamic array arrstrDCs.
k = 0
Do Until adoRecordset.EOF
Set objDC = _
GetObject(GetObject(adoRecordset.Fields("AdsPath").Value).Parent)
ReDim Preserve arrstrDCs(k)
arrstrDCs(k) = objDC.DNSHostName
k = k + 1
adoRecordset.MoveNext
Loop
adoRecordset.Close
' Retrieve lastLogon attribute for each user on each Domain Controller.
' Das lastLogon Attribut für jeden User auf jedem DC ermitteln. Der höchste Wert aller DC's gewinnt
For k = 0 To Ubound(arrstrDCs)
strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
strFilter = "(&(objectCategory=Computer)(objectClass=Computer))"
strAttributes = "distinguishedName,lastLogon,cn,dNSHostName"
strQuery = strBase & ";" & strFilter & ";" & strAttributes _
& ";subtree"
adoCommand.CommandText = strQuery
On Error Resume Next
Set adoRecordset = adoCommand.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 adoRecordset.EOF
strDN = adoRecordset.Fields("distinguishedName").Value
On Error Resume Next
Set objDate = adoRecordset.Fields("lastLogon").Value
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) = True) Then
If (dtmDate > objList(strDN)) Then
objList.Item(strDN) = dtmDate
objList_LogonServer.Item(strDN) = arrstrDCs(k) & ";" & adoRecordset.Fields("cn").Value & ";" & adoRecordset.Fields("dNSHostName").Value
End If
Else
objList.Add strDN, dtmDate
objList_LogonServer.Add strDN, arrstrDCs(k) & ";" & adoRecordset.Fields("cn").Value & ";" & adoRecordset.Fields("dNSHostName").Value
End If
adoRecordset.MoveNext
Loop
adoRecordset.Close
End If
Next
' Output latest lastLogon date for each user.
For Each strUser In objList.Keys
Wscript.Echo strUser & ";" & objList.Item(strUser) & ";" & objList_LogonServer.Item(strUser)
Next
' Clean up.
adoConnection.Close
Set objRootDSE = Nothing
Set adoConnection = Nothing
Set adoCommand = Nothing
Set adoRecordset = Nothing
Set objDC = Nothing
Set objDate = Nothing
Set objList = Nothing
Set objShell = Nothing
function IsHostCscript()
on error resume next
dim strFullName
dim strCommand
dim i, j
dim bReturn
bReturn = false
strFullName = WScript.FullName
i = InStr(1, strFullName, ".exe", 1)
if i <> 0 then
j = InStrRev(strFullName, "\", i, 1)
if j <> 0 then
strCommand = Mid(strFullName, j+1, i-j-1)
if LCase(strCommand) = "cscript" then
bReturn = true
end if
end if
end if
if Err <> 0 then
wscript.echo L_Text_Error_General01_Text & L_Space_Text & L_Error_Text & L_Space_Text _
& L_Hex_Text & hex(Err.Number) & L_Space_Text & Err.Description
end if
IsHostCscript = bReturn
end function