Active Directory: Computerinformationen auslesen
Hallo!
Ich möchte gerne alle Computerkonten im AD mittels VBS auslesen, um herauszufinden, ob es Computer gibt, an denen sich schon lange keiner mehr angemeldet hat.
Habe dazu schon einiges im Forum gefunden.
Leider habe ich bis jetzt erfolglos nach den Feldern lastLogon und LastLogoff gesucht.
Weiss jemand wie man diese anspricht?
Mein Skript:
Leider liest das Skript nur den Computernamen aus.
Danke
Hansi
Ich möchte gerne alle Computerkonten im AD mittels VBS auslesen, um herauszufinden, ob es Computer gibt, an denen sich schon lange keiner mehr angemeldet hat.
Habe dazu schon einiges im Forum gefunden.
Leider habe ich bis jetzt erfolglos nach den Feldern lastLogon und LastLogoff gesucht.
Weiss jemand wie man diese anspricht?
Mein Skript:
Const ADS_SCOPE_SUBTREE = 2 Dim OutPutFile Dim FileSystem Set FileSystem = WScript.CreateObject("Scripting.FileSystemObject") Set OutPutFile = FileSystem.CreateTextFile("Computer.csv", True) 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, lastLogonTimestamp, lastlogon from 'LDAP://DC=nv,DC=at' Where objectClass='computer'" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst outputfile.writeline "Computername;Objekt;Letzte Anmeldung" Do Until objRecordSet.EOF OutPutFile.WriteLine objRecordSet.Fields("name").Value & ";" & objRecordSet.Fields("lastLogonTimestamp").Value & ";" & objRecordSet.Fields("lastLogonTimestamp").Value objRecordSet.MoveNext Loop OutPutFile.Close Set FileSystem = Nothing Set oContainer = Nothing WScript.Echo "Finished: g:\Skripts\Computer.csv" WScript.Quit(0)
Leider liest das Skript nur den Computernamen aus.
Danke
Hansi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 47794
Url: https://administrator.de/contentid/47794
Ausgedruckt am: 26.11.2024 um 14:11 Uhr
20 Kommentare
Neuester Kommentar
Hallo Hansi,
frage am Besten das Attribut 'whenChanged" oder 'modifyTimeStamp' ab.
Grüße
Guido
frage am Besten das Attribut 'whenChanged" oder 'modifyTimeStamp' ab.
Option Explicit
const C_Log = "c:\Log\List_Letzte Kennwortänderung.log"
Const C_Computer = "LDAP://CN=forstpc-9,OU=EBZI32,DC=domaine,DC=de"
DIM O_File
DIM O_Log
Set O_File = CreateObject("Scripting.FileSystemObject")
Set O_Log = O_File.OpenTextFile(C_Log,2,true)
call S_ReadAttribut()
Sub S_ReadAttribut()
Dim O_Attribut
Set O_Attribut = GetObject(C_Computer)
O_Log.writeline "Letzte Kennwortänderung: " & O_Attribut.Get("whenChanged")
end sub
Grüße
Guido
Hi Hansi,
meinst Du gesperrt oder deaktiviert?
Ich habe das Script mal etwas ausführlicher gemacht.
Ein Ordner Log muss natürlich existieren, damit das Log-File geschrieben werden kann.
Grüße
Guido
meinst Du gesperrt oder deaktiviert?
Ich habe das Script mal etwas ausführlicher gemacht.
Ein Ordner Log muss natürlich existieren, damit das Log-File geschrieben werden kann.
Grüße
Guido
'User-Account Informationen erfragen
'09.01.07/ge
Option Explicit
Const C_User = "LDAP://CN=Eink.Guido,OU=Firma,DC=meine,DC=domäne,DC=DE"
Const C_Log = "c:\Log\Read_User-Account.log"
Dim O_User
Dim O_FSO
Dim O_Log
Set O_User = GetObject(C_User)
Set O_FSO = CreateObject("Scripting.FileSystemObject")
Set O_Log = O_FSO.OpenTextFile(C_Log,2,True)
O_Log.writeline C_User
O_Log.writeline ""
'O_User.GetInfo
O_Log.writeline "Profil Pfad: " & O_User.ProfilePath
O_Log.writeline "Script Path: " & O_User.ScriptPath
O_Log.writeline "Home Verzeichnis: " & O_User.HomeDirectory
O_Log.writeline "Home Laufwerk: " & O_User.HomeDrive
O_Log.writeline "CN: " & O_User.cn
O_Log.writeline "Firma: " & O_User.company
O_Log.writeline "Vorname: " & O_User.GivenName
O_Log.writeline "Nachname: " & O_User.sn
O_Log.writeline "Mail-Adresse: " & O_User.Mail
O_Log.writeline "AD-Name: " & O_User.Name
O_Log.writeline "sAMAccount: " & O_User.sAMAccountName
O_Log.writeline "User-Principal-Name: " & O_User.userPrincipalName
O_Log.writeline "Computer: " & O_User.userWorkstations
O_Log.writeline ""
If O_User.IsAccountLocked = True Then
O_Log.writeline "Account gesperrt: JA"
Else
O_Log.writeline "Account gesperrt: Nein"
End If
If O_User.userAccountControl And 2 Then
O_Log.writeline "Account deaktiviert: JA"
Else
O_Log.writeline "Account deaktiviert: Nein"
End If
Hi,
muss Du eine Domäne auslesen oder eine OU?
Du kannst ja eine Funktion bauen und ihr den LDAP-Pfad mit dem Computer übergeben.
Grüße
Guido
muss Du eine Domäne auslesen oder eine OU?
Du kannst ja eine Funktion bauen und ihr den LDAP-Pfad mit dem Computer übergeben.
Grüße
Guido
Const C_Computer = "LDAP://CN=FORSTPC-9,OU=EBZI32,DC=FORST,DC=BWL,DC=DE"
Dim O_Computer
Set O_Computer = GetObject(C_Computer)
If O_Computer.userAccountControl And 2 Then
wscript.echo " Account deaktiviert: JA"
Else
wscript.echo " Account deaktiviert: Nein"
End If
Hi,
komischerweise hat es bei mir über die Funktion nicht geklappt, aber mit einer Routine.
Das Script geht durch die Domäne, jeder Rechner wird an die Routine übergeben und die prüft den Account.
Grüße
Guido
komischerweise hat es bei mir über die Funktion nicht geklappt, aber mit einer Routine.
Das Script geht durch die Domäne, jeder Rechner wird an die Routine übergeben und die prüft den Account.
Grüße
Guido
const C_Log = "c:\Log\List_Computer-in-Domain.log"
const C_Domain = "DC=meine,DC=domäne,DC=DE"
DIM O_File
DIM O_Log
Set O_File = CreateObject("Scripting.FileSystemObject")
if not O_File.FolderExists("c:\Log") then
O_File.CreateFolder "c:\Log"
end if
Set O_Log = O_File.OpenTextFile(C_Log,2,true)
call S_SearchComputer
'###################################
sub S_SearchComputer
'on error resume next
DIM O_Con
DIM O_Com
DIM O_Exec
DIM L_Filter
DIM L_Domain
DIM L_CN
DIM i
i = 1
L_Domain = "<LDAP://" & C_Domain & ">"
L_Filter = "(&(objectCategory=Computer))"
L_CN = "distinguishedName,CN"
SET O_Con = CreateObject("ADODB.Connection")
O_Con.Provider = "ADsDSOObject"
O_Con.Open "Active Directory Provider"
Set O_Com = CreateObject("ADODB.Command")
O_Com.ActiveConnection = O_Con
O_Com.CommandText = L_Domain & ";" & L_Filter & ";" & L_CN & ";subtree"
O_Com.Properties("Page Size") = 100
O_Com.Properties("Sort On") = "Name"
set O_Exec = O_Com.Execute
if err.number <> 0 then
'msgbox "Der OU-Name wurde falsch geschrieben oder" & vbcrlf & "der Pfad stimmt nicht!",vbokonly + vbexclamation,"Fehler"
wscript.echo err.description
exit sub
end if
O_Exec.MoveFirst
Do until O_exec.eof
'O_Log.writeline " LDAP: " & O_Exec.fields(0)
O_Log.writeline i & ") Name: " & O_Exec.fields(1)
Call F_CheckAccount(O_Exec.fields(0))
i = i + 1
O_EXEC.Movenext
loop
'on error goto 0
end sub
Sub F_CheckAccount(P_Pfad)
Dim O_Computer
Dim L_Pfad
L_Pfad = "LDAP://" & P_Pfad
Set O_Computer = GetObject(L_Pfad)
If O_Computer.userAccountControl And 2 Then
O_log.writeline " Account deaktiviert: JA"
Else
O_log.writeline " Account deaktiviert: Nein"
End If
End Sub
Hi Hansi,
im Script brauchst Du oben bei C_Domain doch lediglich noch Deine Domäne eintragen, einen Ordner Log haben und schon werden Dir zu jedem Rechner angezeigt, ob er aktiviert oder deaktiviert ist.
Bei mir läuft das Script einwandfrei durch.
Natürlich muss man der Funktion den LDAP-Pfad übergeben, der LDAP-Pfad wird ja auch an der Sub-Routine übergeben.
Obwohl innerhalb der Funktion alles einwandfrei ankam, hat es trotzdem nicht funktioniert.
Aber mit der Routine klappt es einwandfrei.
Hast Du das Script überhaupt schon einmal ausprobiert?
Die Routine F_CheckAccount macht doch genau das, was Du brauchst.
Ausgabe:
149) Name: FA301PC-9
Account deaktiviert: Nein
150) Name: FA395-ALT
Account deaktiviert: JA
Grüße
Guido
im Script brauchst Du oben bei C_Domain doch lediglich noch Deine Domäne eintragen, einen Ordner Log haben und schon werden Dir zu jedem Rechner angezeigt, ob er aktiviert oder deaktiviert ist.
Bei mir läuft das Script einwandfrei durch.
Natürlich muss man der Funktion den LDAP-Pfad übergeben, der LDAP-Pfad wird ja auch an der Sub-Routine übergeben.
Obwohl innerhalb der Funktion alles einwandfrei ankam, hat es trotzdem nicht funktioniert.
Aber mit der Routine klappt es einwandfrei.
Hast Du das Script überhaupt schon einmal ausprobiert?
Die Routine F_CheckAccount macht doch genau das, was Du brauchst.
Ausgabe:
149) Name: FA301PC-9
Account deaktiviert: Nein
150) Name: FA395-ALT
Account deaktiviert: JA
Grüße
Guido
Hallo
Danke für die hilfe...ich habe jedoch ein problem.....der timestamp stimmt nicht. Mein notebook war als seint 3 tagen eingeloggt angezeigt und das kann nicht sein da ich mich jeden abend auslogge. Weiters waren die logonzeiten unserer Server nicht io (einer wurde lt protokoll in der nacht um 22:35 heruntergefahren - da kann aber nicht sein da die niemals offline gehen.) - kann mir jemand erklären was es damit ausich hat? weil auf das ergebniss kann ich mich nicht verlassen.
mfg Bert
Danke für die hilfe...ich habe jedoch ein problem.....der timestamp stimmt nicht. Mein notebook war als seint 3 tagen eingeloggt angezeigt und das kann nicht sein da ich mich jeden abend auslogge. Weiters waren die logonzeiten unserer Server nicht io (einer wurde lt protokoll in der nacht um 22:35 heruntergefahren - da kann aber nicht sein da die niemals offline gehen.) - kann mir jemand erklären was es damit ausich hat? weil auf das ergebniss kann ich mich nicht verlassen.
mfg Bert