dabaeuml
Goto Top

Alle User aus dem AD in txt-Datei mittels .vbs

Hallo liebe Administrator-Gemeinde,

habe ein "kleines" Problem mit einer vbScript, welche mir bestimmte Parameter jeden Users im AD, auslesen soll...
Das Script funktioniert soweit, allerdings bekomme ich es nicht hin, dass ich alle User "ausgeworfen" bekomme, sondern ich müsste nach jedem einzeln suchen...

Hier das Script:


Option Explicit

Const C_User = "LDAP://CN=Test,OU=IT,DC=Test,DC=de"  
Const C_Log = "C:\test.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 "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 ""  

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


Bei mir hackt es hier an der Variablen "jeder User"...
Könnt ihr mir da weiterhelfen???


Vielen Dank schon einmal für eure Hilfe...

Content-Key: 179528

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

Printed on: April 16, 2024 at 18:04 o'clock

Member: bastla
bastla Jan 25, 2012 at 13:55:05 (UTC)
Goto Top
Hallo dabaeuml und willkommen im Forum!

Im "Script Center"
http://gallery.technet.microsoft.com/scriptcenter/site/search?f.Type=RootCategory&f.Value=activedirectory&f.Text=Active%20Directory&f[1].Type=SubCategory&f[1].Value=useraccounts&f[1].Text=Benutzerkonten&pageIndex=1
sollte sich doch etwas Passendes (zB das) als Anhaltspunkt finden lassen (auch wenn dort nicht "VBS", sondern "VB.NET" steht) ...

Grüße
bastla
Member: dabaeuml
dabaeuml Jan 25, 2012 at 14:31:05 (UTC)
Goto Top
Hallo bastla,

Danke für die schnelle Info...

Leider hilft mir auch dieser Ansatz nicht viel weiter...
(hab nicht wirklich viel Ahnung vom scripten)... face-confused/
Member: bastla
bastla Jan 25, 2012 at 18:14:15 (UTC)
Goto Top
Hallo dabaeuml!

Da das verlinkte Script etwas schütter kommentiert ist, hole ich es mal rüber und gebe etwas Senf dazu (das Testen überlasse ich aber Dir face-wink):
'* Original von: http://gallery.technet.microsoft.com/scriptcenter/1e3eca73-21c5-4ee4-9bb0-e43ed138aec7  
'*  
'* description: export users from Active Directory to a comma separated text file.   
'*  Use the text file to create users in a new AD with the accompanying import script.   
'*                 
'* author: Chris Pilling   
'* date: 18 June 2008   
'* edit the attributes exported to suit   
'* after running it is probably best to delete lines from the text file for system generated accounts   
  
Zieldatei = "C:\test.log"  
Delim = ";" ' Trennzeichen für Felder in der Zieldatei (im Original ",")  
  
Const ForAppending = 8 
  
Set objRoot = GetObject("LDAP://RootDSE")     ' \   
strDNC = objRoot.Get("DefaultNamingContext")  '  |-> Objekt für Domain-Root als Ausgangspunkt erstellen  
Set objDomain = GetObject("LDAP://" & strDNC) ' /  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
  
Call enumMembers(objDomain) ' Aufruf der eigentlichen Verarbeitungsschleife  
'  Wenn ab einer bestimmten OU begonnen werden soll, oben zB mit  
'Set objDomain = GetObject("LDAP://OU=IT,DC=Test,DC=de")  
' diese OU vorgeben ...  

'Ende Hauptprogramm  

Sub enumMembers(objDomain) ' Unterprogramm, das für jeden Container / jede OU aufgerufen wird  
On Error Resume Next 'Fehler werden uns nicht stoppen! ;-)  
  
For Each objMember In objDomain ' alle Objekte durchgehen  
    If objMember.Class = "user" Then ' verarbeiten, wenn es ein "User"-Objekt ist  
        '* edit the attributes you want to export here - von den folgenden Zeilen nur jene  
        '  behalten, die benötigt werden (die übrigen auskommentieren oder löschen) und  
        '  fehlende Zeilen (wie zB für "company") ergänzen -   
        '  entsprechend dann auch unten die Erstellung des Datensatzes anpassen  
		
        If Not(IsEmpty(objMember.samAccountName)) Then  
            samAccountName = objMember.samAccountName  
        Else  
            samAccountName = ""    
        End If 
        If Not(IsEmpty(objMember.CN)) Then Cn = objMember.CN Else Cn = "" End If   
        If Not(IsEmpty(objMember.GivenName)) Then FirstName =objMember.GivenName Else FirstName = "" End If   
        If Not(IsEmpty(objMember.sn)) Then Lastname = objMember.sn Else LastName = "" End If   
        If Not(IsEmpty(objMember.UserPrincipalName)) Then  
            UserPrincipalName = objMember.UserPrincipalName  
        Else  
            Name = ""    
        End If 
        If Not(IsEmpty(objMember.ProfilePath)) Then  
            ProfilePath = objMember.ProfilePath  
        Else  
            Profile = ""    
        End If 
        If Not(IsEmpty(objMember.HomeDrive)) Then HomeDrive = objMember.HomeDrive Else HomeDrive = "" End If   
        If Not(IsEmpty(objMember.HomeDirectory)) Then  
            HomeDirectory = objMember.HomeDirectory  
        Else  
            HomeDirectory = ""  
        End If 
        If Not(IsEmpty(objMember.ScriptPath)) Then
            LoginScript = objMember.ScriptPath
        Else  
            LoginScript = ""    
        End If 

        ' ab jetzt stehen alle oben ausgelesenen Werte in den entsprechenden Variablen zur Verfügung  
		
        'Datensatz zusammenstellen, im Original Komma als Trennzeichen, in der adaptierten Fassung das oben per Variable festgelegte ";"  
        ' Original-Zeile:   
        strText1 = SamAccountName & "," & CN & "," & FirstName & "," & LastName & "," & UserPrincipalName & _   
            "," & ProfilePath & "," & HomeDrive & "," & HomeDirectory & "," & LoginScript  
        ' adaptiert:  
        strText1 = SamAccountName & Delim & CN & Delim & FirstName & Delim & LastName & Delim & UserPrincipalName & _ 
            Delim & ProfilePath & Delim & Homedrive & Delim & HomeDirectory & Delim & LoginScript
	
        'WScript.Echo strText1 ' Ausgabe des Datensatzes in der Konsole (wenn über "cscript" gestartet; zu empfehlen) oder als MsgBox   
 
        Set objTextFile = objFSO.OpenTextFile(Zieldatei, ForAppending, True) ' Textdatei zum Anfügen (des neuen Satzes / der neuen Zeilen) öffnen  
        objTextFile.WriteLine(strText1) ' Datensatz in Textdatei schreiben und  

        '### hier Deinen Ausgabecode als Ersatz für die einzeilige Version mit strText1 platzieren, also etwa:  
        'objTextFile.WriteLine objMember.ADSPath  
        'objTextFile.WriteLine  
        'objTextFile.WriteLine "CN: " & Cn  
        ' ...  
        ' ####  

        objTextFile.Close                ' Zieldatei wieder schließen  

    End If  
   
    If objMember.Class = "organizationalUnit" or objMember.Class = "container" Then  ' Ist das Objekt ein Container / eine OU ...  
        enumMembers (objMember)  ' ... das Unterprogramm (rekursiv) aufrufen, um dieses Objekt abzuarbeiten  
    End If  
Next  
End Sub
Aufgrund des "On Error Resume Next" ließen sich die Zeilen der Art
If Not(IsEmpty(objMember.CN)) Then Cn = objMember.CN Else Cn = "" End If
auch auf
Cn = "" : Cn = objMember.CN
vereinfachen.

Grüße
bastla
Member: dabaeuml
dabaeuml Jan 26, 2012 at 08:07:52 (UTC)
Goto Top
Hervorragend, ich glaube genau sowas habe ich gesucht..
Werde mich gleich mal darüberstürzen.... face-smile


Eine Frage hab ich zumindest schon mal...
Warum nimmst du mal "If Not" und dann mal wieder "If" her??

Gruß
dabaeuml
Member: dabaeuml
dabaeuml Jan 26, 2012 at 08:34:52 (UTC)
Goto Top
Hallo bastla,

Super, habe das Skript bissl abgeändert und es funktioniert so wie ich es haben möchte... face-wink

DANKESCHÖÖÖÖN... face-wink
Member: bastla
bastla Jan 26, 2012 at 08:50:09 (UTC)
Goto Top
Hallo dabaeuml!
Warum nimmst du mal "If Not" und dann mal wieder "If" her??
Ich war das doch gar nicht ... face-wink

"Not" ist ja nur eine "Verneinung" und kehrt einfach die Fragestellung um -
If Not(IsEmpty(objMember.CN)) Then ...
heißt dann eben "Wenn der Rückgabewert von objMember.CN nicht leer ist" oder, einfacher, wenn objMember.CN einen Rückgabewert liefert, dann ...

Da es keine Funktion "IsFull()" face-wink gibt, muss eben nach dem Gegenteil gefragt werden (an doppelte Verneinungen gewöhnt man/frau sich mit der Zeit) ...

Grüße
bastla