45521
Goto Top

Alle Benutzer einer Domäne auflisten und Unter-OUs

Hallo,

ich hätte mal (wieder) gerne eine Problem ;)

Und zwar will ich per VBScript in der Active Directory alle Benutzer der Domäne DE auslesen. In der Domäne befinden sich noch etliche OUs,.. bräuchte alle Benutzer, ob die nun direkt in DE liegen oder in DE/Standort/Users/,... Die genaue Anzahl an OUs bzw. deren Namen sind mir auch nicht bekannt, sonst könnte ich das ja so lösen.

Kann mir da bitte jemand helfen? Bin am Verzweifeln. In Google findet man (fast) alles, aber dazu wurde ich bisher nicht fündig.

Achso: In meinem bisherigen Script baue ich die Verbindung zum LDAP so auf:

ldap = "LDAP://" & ADIP & "/" & OUs & "," & DCs  

Set ons = GetObject("LDAP:")  
Set ocontainer = ons.OpenDSObject(ldap, user, pw, ADS_SECURE_AUTHENTICATION)

Also nicht mit dem ADODB.Connect, wäre schön, wenn es auch ohne das ginge, da ich sonst ja entweder doppelt gemoppelt eine Verbindung aufbauen würde oder mein komplettes Script umbauen muß. Btw. (falls jemand Zeit und Lust hat): Wo liegen denn die Unterschiede zwischen "meiner" Art und der Adodb-Connect?

Danke und Grüße,

Marc

Content-ID: 62795

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

damicka
damicka 02.07.2007 um 10:35:14 Uhr
Goto Top
Hallo face-smile,
sehr komplexe Abfragen kannst du mit carlos.hta machen.
Hierbei kannst du auch aussuchen was genau du dir ausgeben lassen möchtest.
Nachteil ist das es passieren kann das keine Verbindung aufgebaut wird.
Dann einfach mal das Konto prüfen mit dem du zugreifst. (Current User der Arbeitsstation).

Gruß
Micha
PS: Richtig schön kann man sich das dann über ASP ausgeben lassen. face-smile
45521
45521 02.07.2007 um 11:05:32 Uhr
Goto Top
Hi Micha,

danke, bringt mir aber leider gar nichts. Ich brauche alle Benutzer, weil ich die weiterverarbeiten will. Ich will die Benutzer in einem Select-Feld zur Auswahl stellen. Es ist nämlich so, daß jede Gruppe in unserer AD 3 Ansprechpartner haben, die dafür verantwortlich sind, wer in die Gruppe aufgenommen wird,... Diese sollen im Feld "Notes" eingetragen werden. Um nun den richtigen "Eintragenamen" zu erhalten will ich alle Benutzer aus der AD (so 4.000 in DE) auslesen und dann in das SELECT-Feld übernehmen.

Hab mir auch mal den Quelltext der Datei angeschaut - bringt mir leider auch nicht sooo viel. Der macht das ja auch nicht so, wie ich das in dem obigen Beispiel geschrieben habe....

Danke und Grüße,

Dirk
bastla
bastla 02.07.2007 um 16:08:31 Uhr
Goto Top
Hallo Meanmachine!

Die folgende Skizze könnte als Basis für Dein Vorhaben dienen:
strDelim = ";"  
Set adoConnection = CreateObject("ADODB.Connection")  
Set adoCommand = CreateObject("ADODB.Command")  
adoConnection.Provider = "ADsDSOOBject"  
adoConnection.Open "Active Directory Provider"  
Set adoCommand.ActiveConnection = adoConnection

Set objRootDSE = GetObject("LDAP://RootDSE")  
strDNSDomain = objRootDSE.Get("DefaultNamingContext")  
strFilter = "(objectClass=user)"  

strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter _  
    & ";distinguishedName,sAMAccountName,Name,givenName,sn;subtree"  

adoCommand.CommandText = strQuery

Set adoRecordSet = adoCommand.Execute
strUserList = ""  
Do Until adoRecordset.EOF
	If Right(adoRecordSet.Fields("sAMAccountName"), 1) <> "$" Then  
		If strUserList <> "" Then   
			strUserList = strUserList & strDelim & adoRecordSet.Fields("sAMAccountName")  
		Else
			strUserList = adoRecordSet.Fields("sAMAccountName")  
		End If
	End If
    adoRecordSet.MoveNext
Loop
'WScript.Echo strUserList  
aUsers = Split(strUserList, strDelim)
For i = 0 To UBound(aUsers)
	'WScript.Echo aUsers(i)  
Next
Da Du nicht genau ausgeführt hast, welchen "Namen" Du benötigst, enthält die Abfrage mit "distinguishedName,sAMAccountName,Name,givenName,sn" eine Sammlung von Möglichkeiten.

Die Schleife für die Auswertung schreibt zunächst alle gefundenen (Anmelde-)Namen (außer den Computernamen mit "$" am Ende) in einen String und zerteilt diesen dann in ein Array - bei Deiner Menge an Benutzern habe ich die jeweilige Test-Ausgabe lieber auskommentiert ... face-wink

Grüße
bastla
45521
45521 02.07.2007 um 18:39:24 Uhr
Goto Top
Hi bastla,

wie schon so oft: viiiiieeeeelen Dank!

Werde das morgen im Geschäft gleich mal testen...

Danke und Grüße,

Marc
bastla
bastla 02.07.2007 um 18:46:08 Uhr
Goto Top
Hallo Meanmachine!

Immer wieder gerne. face-smile

Noch ein Hinweis zum Testen: Wenn Du das Script über CMD aufrufst, also etwa
cscript //nologo ListAllADUsers.vbs > AllADUsers.txt
könntest Du auch das eine oder andere WScript.Echo ausführen lassen ...

Grüße
bastla
45521
45521 03.07.2007 um 10:40:57 Uhr
Goto Top
Hi,

ich hab dein Beispiel mal ausprobiert, finde aber nirgends, wie ich das machen kann, wenn ich mich authentifzieren muß (ADS_SECURE_AUTHENTICATION)...

Dann habe ich es mit dem SQL von ADODB versucht, aber da bin ich ja in Rente bis es mir da 4.000 Benutzer ausgelesen hat. Außerdem habe ich gerade noch ein anderes "Problem". Ich soll schauen, ob eine Gruppen in einem der Subtrees in einer best. OU besteht. Die Dokumentation ist so schlecht, ich finde weder, wo ich die gefundenen Datensätze zählen kann, noch, wie ich ein Update der Informationen einer Gruppe darüber absetze,...

Kann ich nicht einfach mit folgendem:

[code]
On Error Resume Next
ldap = "LDAP://" & ADIP & "/" & OUs & "," & DCs
Set ons = nothing
Set oContainer = nothing
Set ons = GetObject("LDAP:")
Set ocontainer = ons.OpenDSObject(ldap, user, pw, ADS_SECURE_AUTHENTICATION)

ocontainer.filter=array("group")
[/code]

arbeiten und rausfinden, wo die gesuchte Gruppe liegt (müßte den "Pfad" zur Gruppe dann ja auch irgendwie rausbekommen, um sie ändern zu können - macht ja einen Unterschied, ob die Gruppe jetzt direkt in DE, in DE/ABC oder in DE/DEF liegt).

Kann ich in das von mir genannte Beispiel nicht einfach irgendwie subtree einbauen? Hab's schon bei filter = array("group",subtree) versucht, aber das will er irgendwie nicht....

Danke und Grüße,

Marc
bastla
bastla 03.07.2007 um 11:54:33 Uhr
Goto Top
Hallo Meanmachine!

Um etwas Überblick zu gewinnen, könntest Du Dir vielleicht den Softerra LDAP Browser ansehen.
Deinen Wunsch, ohne "ADODB" auszukommen, hatte ich leider völlig überlesen face-sad ...

Grüße
bastla

P.S.: Für mehr reicht im Moment meine Zeit nicht ...
45521
45521 03.07.2007 um 12:06:59 Uhr
Goto Top
Hi bastla,

danke! Leider kann ich das Teil nicht installieren - hab keine Admin-Rechte auf meinen Desktop (bin ja nur ein Studentenkopf der da sein Praktikum macht und bekomme nur die benötigten Rechte).

Werde mal weitersuchen, vielleicht meldet sich ja noch jemand...

Danke und Grüße,

Marc
45521
45521 03.07.2007 um 12:31:52 Uhr
Goto Top
Hi bastla,

ich glaube, ich wurde fündig. MS macht es so, daß ich zuerst alle, bei denen sind's Computer, suchen über ADODB und dann, wenn die Schleife mit allen gefundenen Namen durchlaufen wird, bauen sie mit OpenDSObject eine Verbindung dazu auf (bzw. ich würde dann halt dje jeweilige Gruppe wählen wenn vorhanden und anpassen).

Werde das mal probieren. Mal schaun, wie schnell das geht,... ;)

Grüße,

Marc
45521
45521 03.07.2007 um 12:49:38 Uhr
Goto Top
Hier mal, wie ich es jetzt gemacht habe:


On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2
Const ADS_SECURE_AUTHENTICATION = 1
Const ADS_USE_ENCRYPTION = 2
Const ADS_PROPERTY_UPDATE = 2


Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Properties("User ID") = "USER"
objConnection.Properties("Password") = "PASSWORT"
objConnection.Properties("Encrypt Password") = FALSE
objConnection.Properties("ADSI Flag") = 1

objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
'objCommand.Properties("Sort On") = "Name"

objCommand.CommandText = _
"SELECT distinguishedName FROM 'LDAP:11.11.11.11/ou=bla,ou=DE,dc=dom,dc=ain' WHERE objectCategory='group'"
Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

user = "USER"
pw = "PASSWORT"

Do Until objRecordSet.EOF
'strComputer =
ldap = "LDAP:
11.11.11.11/" & objRecordSet.Fields("distinguishedName").Value

Set ons = GetObject("LDAP:")
Set ocontainer = ons.OpenDSObject(ldap, user, pw, ADS_SECURE_AUTHENTICATION)
ocontainer.Put "info","Test1"
ocontainer.PutEx ADS_PROPERTY_UPDATE, "description", Array("JUHU")
ocontainer.SetInfo

objRecordSet.MoveNext
Loop

MSGBOX "Fertsch"

Lasse das Thema mal noch offen, vielleicht will noch jemand was ergänzen. Funktionieren tut's aber definitiv...