hansis1
Goto Top

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:
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

Content-Key: 47794

Url: https://administrator.de/contentid/47794

Printed on: April 24, 2024 at 19:04 o'clock

Member: Tundra
Tundra Jan 03, 2007 at 07:31:49 (UTC)
Goto Top
Hallo Hansi,

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
Member: hansis1
hansis1 Jan 03, 2007 at 08:06:40 (UTC)
Goto Top
Hallo Guido!

Recht herzlichen Dank!

Sag mal, kennst Du einen Link, wo man sich all diese Feldnamen anschauen kann?

Danke
Hansi
Member: Tundra
Tundra Jan 03, 2007 at 08:37:52 (UTC)
Goto Top
Hallo Hansi,

eine Doku ist z. B. adsi25.chm.
Oft hilft es auch einen Blick in ADSIEdit (ich glaube in den Support-Tools) zu werfen.

Es ist aber nicht immer einfach alle Attribute auszulesen oder zu setzen, da es für manche Attribute unterschiedliche Verfahren gibt.

Grüße
Guido
Member: hansis1
hansis1 Jan 10, 2007 at 12:13:48 (UTC)
Goto Top
Hallo!

Ich muss nochmals etwas nachfragen:

Ich möchte nun alle deaktivierten accounts auslesen. Weiß jemand wie ich das in das o.a. Skript einfügen kann?

Danke
Hansi
Member: Tundra
Tundra Jan 10, 2007 at 13:45:46 (UTC)
Goto Top
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

'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
Member: hansis1
hansis1 Jan 10, 2007 at 14:07:53 (UTC)
Goto Top
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

Hallo Guido
Ich möchte die deaktivierten Computerkonten auslesen.
Hier mein Code:
    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 * 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;Letzte Anmeldung"  
    Do Until objRecordSet.EOF
        OutPutFile.WriteLine objRecordSet.Fields("isAccountLocked") & ";" & objRecordSet.Fields("name").Value & ";" & objRecordSet.Fields("lastLogonTimestamp").Value & ";" & objRecordSet.Fields("lastLogonTimestamp").Value & ";" & objRecordSet.Fields("whenChanged").Value & ";" & objRecordSet.Fields("modifyTimeStamp").Value  
        objRecordSet.MoveNext
    Loop

    OutPutFile.Close
    Set FileSystem = Nothing
    Set oContainer = Nothing
    WScript.Echo "Finished: g:\Skripts\Computer.csv"  
    WScript.Quit(0)
Member: Tundra
Tundra Jan 10, 2007 at 14:32:43 (UTC)
Goto Top
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
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
Member: hansis1
hansis1 Jan 10, 2007 at 14:48:46 (UTC)
Goto Top
Hallo!

Ich muss eine Domäne auslesen.
objCommand.CommandText = "Select * from 'LDAP://DC=nv,DC=at' Where objectClass='computer'"    
Nur kann ich danach nicht auf das Feld "isAccountLocked" zugreifen.

lg
Hansi
Member: Tundra
Tundra Jan 10, 2007 at 15:32:07 (UTC)
Goto Top
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

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
Member: hansis1
hansis1 Jan 11, 2007 at 15:30:14 (UTC)
Goto Top
Hallo!

Wie gesagt, ich muss eine Domäne auslesen.
Wenn ich die Überprüfung, ob der Computer deaktiviert ist, über eine Funktion mache, muss ich natürlich das Objekt übergeben, bzw. den LDAP-Pad.
Ich habe lalle Objecte in einem Recordset. Jetzt müsste ich halt noch den Container auslesen können.
Ich weiss leider absolut nicht, wie ich das machen könnte.

lg
Hansi
Member: Tundra
Tundra Jan 12, 2007 at 06:30:58 (UTC)
Goto Top
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
Member: hansis1
hansis1 Jan 12, 2007 at 11:15:36 (UTC)
Goto Top
Hallo!

Danke, jetzt funktioniert es. Hatte nur einen Fehler bei der Abänderung vom Skript.

Danke
Hansi
Member: hansis1
hansis1 Jan 12, 2007 at 12:41:49 (UTC)
Goto Top
HJallo!

Jetzt hätte ich doch noch eine Frage:

Du rufst die Funktion folgenderweise auf:
O_Log.writeline i & ") Name: " & O_Exec.fields(1)  
Call F_CheckAccount(O_Exec.fields(0))
Woher weisst Du, welchen Feldindex Du verwenden willst? Ich möchte mir nähmlich gerne alle Indizes (sprich Spaltenüberschriften) ausdrucken. Hast Du vielleicht eine Ahnung wie das geht?

Thx
Hansi
Member: Ametrin
Ametrin Jun 20, 2007 at 08:35:14 (UTC)
Goto Top
Hallo! Da ich erst seit 3 monaten in dieser Branche arbeite und mich mit scripts überhaupt nicht auskenne bitte ich dich (euch) mir das fertige script bereitzustellen damit ich auch die Clienst auslesen kann.
Danke im Vorraus
Member: hansis1
hansis1 Jun 20, 2007 at 09:17:47 (UTC)
Goto Top
Hallo!

Hier ist mein fertiges Skript:

'Global variablesConst ADS_SCOPE_SUBTREE = 2Dim OutPutFileDim FileSystem'Initialize global variablesSet 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"'Initialize RecordsetSet objCOmmand.ActiveConnection = objConnectionobjCommand.CommandText = "SELECT ADsPath FROM 'LDAP://DC=nv,DC=at' WHERE objectClass='computer'"objCommand.Properties("Page Size") = 1000objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE Set objRecordSet = objCommand.ExecuteobjRecordSet.MoveFirst'run through recordsetoutputfile.writeline "Computername;Letzte Anmeldung;(de)aktiviert"Do Until objRecordSet.EOF OutputFile.WriteLine get_Output(objRecordSet.Fields("ADsPath")) objRecordSet.MoveNextLoop'Clean upOutPutFile.CloseSet FileSystem = NothingSet oContainer = NothingWScript.Echo "Finished: g:\Skripts\Computer.csv"WScript.Quit(0)Function get_Output(objAccount) Set objComputer = GetObject(objAccount) Output = objComputer.sAMAccountName & ";" & objComputer.whenChanged if (objComputer.userAccountControl and 2) Then Output = Output & ";deaktiviert" else Output = Output & ";aktiviert" end if get_Output = OutputEnd Function

lg
Hansi
Member: Ametrin
Ametrin Jun 20, 2007 at 13:31:48 (UTC)
Goto Top
Und wo oder wie muss ich das jetzt ausführen...und bekomme ich dann die letzten logonzeiten von allen clients???
Member: hansis1
hansis1 Jun 20, 2007 at 13:50:45 (UTC)
Goto Top
In folgender Zeile gibst Du den Start vom Skript an:
objCommand.CommandText = "SELECT ADsPath FROM 'LDAP:DC=XX,DC=XX' WHERE objectClass='computer'"

Es werden nun alle Computer-Objekte gesucht und in folgender Form in die Datei
Computer.csvgeschrieben:
Computername Letzte Anmeldung (de)aktiviert
Computername// 27.02.2007 18:35 aktiviert

Die Datei gibst Du in folgender Zeile bekannt:
Set OutPutFile = FileSystem.CreateTextFile("Computer.csv", True)
Die Datei wird in das gleiche Verzeichnis geschrieben, in der die .vbs-Datei liegt.

Hoffe Ich habe Dir geholfen.

lg
Hansi
Member: Ametrin
Ametrin Jun 25, 2007 at 05:52:10 (UTC)
Goto Top
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
Member: hansis1
hansis1 Jun 26, 2007 at 09:08:04 (UTC)
Goto Top
Hallo Bert!
Wenn ich es richtig verstanden habe, zeigt Dir das Feld nicht an, wann Du Dich das letzte mal eingeloggt hast, sondern wann sich das Objekt das letzt mal geändert hat.
Und das hat mir in meinem Fall gereicht.

lg
Hansi
Member: Ametrin
Ametrin Jun 27, 2007 at 13:33:23 (UTC)
Goto Top
Aber in meinem fall reicht das nicht ..ich bräuchte nämlich die letzte Anmeldezeit an der DOMAIN, damit ich die Computer-Leichen aus dem AD entfernen kann...verstehst du mein Problem?

mfg Bert