60376
Goto Top

ActiveDirectory Gruppen-User Zuordnung

Hallo Leute, bin sehr unerfahren was VB-Programmierung angeht und habe deshalb eine (vielleicht sehr dumme) Frage.

Und zwar brauch ich ein Script, welches aus dem ActiveDirectory die Gruppen und User ausliest und Datenbankmäßig ausgibt, also quasi
"Gruppe1,User1"
"Gruppe1,User2"
"Gruppe2,User1"
"Gruppe2,User3"

usw...

von VB habich leider nicht viel Ahnung, deshalb dachte ich ihr könnt mir vielleicht helfen?

Benutzt werden sollen die Befehle dsquery und dsget, aber vielleicht geht das auch anders?

Danke schonmal

Content-Key: 78838

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: Tohla
Tohla 22.01.2008 um 17:04:58 Uhr
Goto Top
Moin,

ich denke CSVDE könte da helfen.

googel mal nach CSVDE, damit kanst du aus und in die AD Lesen oder Schreiben.
Wird dann als CSV rausgegeben.
Das holst du dir dann in Excel

damit hast du dann schon was in der hand.

Tohla
Mitglied: bastla
bastla 22.01.2008 um 18:18:00 Uhr
Goto Top
Hallo dnbCommander!

Eine VBS-Lösung (unter starker Anlehnung an diese "Scripting Guy"-Kolumne) könnte so aussehen:
Const strDomain = "firma.de"  
Const strListFile = "D:\Gruppenliste.txt"  
Const strDelim = ","  

Set objListFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strListFile, 2, True)  
Set colGroups = GetObject("WinNT://" & strDomain)  
colGroups.Filter = Array("Group")  
For Each objGroup In colGroups
    strGroup = objGroup.Name 
    For Each objUser in objGroup.Members
		strUserName = objUser.Name
		If Right(strUserName, 1) <> "$" Then  
			objListFile.WriteLine Chr(34) & strGroup & strDelim & objUser.Name & Chr(34)
		End If
    Next
Next
objListFile.Close

Könntest Du dann bitte einen Deiner Beiträge zu diesem Thema (mit dem Hinweis auf den anderen Beitrag) als "Wie kann ich einen Beitrag als gelöst markieren?" kennzeichnen?

Grüße
bastla
Mitglied: 60376
60376 23.01.2008 um 08:12:58 Uhr
Goto Top
okay danke funktioniert soweit schonmal =) dankeschön


und...wodran ich grad verzweifel... ich muss für bestimmte OU's nur die gruppen/user auslesen
wie kann ich das bestimmen, das er nich die ganze domäne ausliest? ldap pfand angeben?
wär super wenn du nochmal helfen könntest
Mitglied: bastla
bastla 23.01.2008 um 14:55:08 Uhr
Goto Top
Hallo dnbCommander!

Ersetze die Zeile
Set colGroups = GetObject("WinNT://" & strDomain)  
durch eine passende "LDAP"-Angabe:
Set colGroups = GetObject("LDAP://ou=bestimmteOU,dc=deinedomain,dc=local")  
Für die Abfrage der User wäre dann noch der Filter auf "User" zu setzen.

Ansonsten sieh Dir vielleicht auch noch folgende Artikel an: Die Suche in Active Directory mit Skripten (Teil 1) sowie dessen Teil 2.

Grüße
bastla
Mitglied: 60376
60376 23.01.2008 um 15:01:21 Uhr
Goto Top
genau das hatte ich probiert, braucht aber ewig zum schauen und dann kommt nen fehler

EDIT:
b zw, gibts die OU nicht sagter das sofort, gibts die OU prüfter zwar aber schreibt nix in die datei
Mitglied: bastla
bastla 23.01.2008 um 15:55:47 Uhr
Goto Top
Hallo dnbCommander!

gibts die OU prüfter zwar aber schreibt nix in die datei
Kann ich nicht nachvollziehen - es sollte sogar zuviel in die Datei geschrieben werden, da die jeweilgen Namen als RID in der Schreibweise "CN=Name" zurückgegeben werden. Abhilfe schafft dafür folgende Änderung:
strGroup = Replace(objGroup.Name, "CN=", "")  
bzw
strUserName = Replace(objUser.Name, "CN=", "")  

Vielleicht zur Sicherheit noch der Hinweis, dass Gruppen nur ausgegeben werden, wenn sie auch Mitglieder haben. Um das zu ändern:
...
For Each objGroup In colGroups
    strGroup = Replace(objGroup.Name, "CN=", "")  
	If objGroup.Members.Count <> 0 Then
		For Each objUser in objGroup.Members
			strUserName = Replace(objUser.Name, "CN=", "")  
			If Right(strUserName, 1) <> "$" Then  
				objListFile.WriteLine Chr(34) & strGroup & strDelim & strUserName & Chr(34)
			End If
		Next
	Else
		objListFile.WriteLine Chr(34) & strGroup & strDelim & Chr(34)		
	End If
Next
objListFile.Close

Falls das bei Dir nicht klappt, könntest Du immer noch die in den verlinkten Artikeln beschriebene Vorgangsweise versuchen.

Grüße
bastla
Mitglied: 60376
60376 24.01.2008 um 10:45:12 Uhr
Goto Top
super, funktioniert soweit face-smile

aaaaber wie immer gibts noch probleme wo ich nicht hinterkomme, wär super wenn du da nochmal drüberschauen könntest.

Soweit funktioniert das programm ja. Aber mal angemommen die struktur ist wiefolgt aufgebaut:
OU Administration
- OU Gruppen
- OU User
CN Bla
CN Blub

OU ...
CN..
OU...

Wenn ich aber die OU Administration angebe, passiert natürlich nichts weil er in keine unterordner geht, wie krieg ich ds nun mit den unterordnern hin falls es welche gibt?

und, wie mach ich das, das auch nicht nur eine OU oder CN durchsucht wird, sondern sagen wir mal 3 oder mehr bestimmte?
Mitglied: bastla
bastla 25.01.2008 um 00:35:28 Uhr
Goto Top
Hallo dnbCommander!

Damit wären wir bei der SQL-Abfrage-Variante angelangt:
On Error Resume Next

Const strListFile = "D:\Gruppenliste.txt"  
Const strDelim = ","  

aOU = Array( _
	"ou=eineOU,dc=deinedomain,dc=local", _  
	"ou=eineandereOU,dc=deinedomain,dc=local", _  
	"ou=dieletzteOU,dc=deinedomain,dc=local" _  
	)

Const ADS_SCOPE_SUBTREE = 2	
Set objListFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strListFile, 2, True)  

For Each OU In aOU
	ListGroup OU
Next

objListFile.Close
' ####### Ende Hauptprogramm #######  


Sub ListGroup(strOU)
Set objConnection = CreateObject("ADODB.Connection")  
Set objCommand = CreateObject("ADODB.Command")  
objConnection.Provider = "ADsDSOObject"  
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 Name, Member FROM 'LDAP://" & strOU & "' WHERE objectCategory='group'"    
Set objRecordSet = objCommand.Execute

If objRecordSet.RecordCount > 0 Then
	objRecordSet.MoveFirst
	Do Until objRecordSet.EOF
		strGroupName = objRecordSet.Fields("Name").Value  
		If IsNull(objRecordSet.Fields("Member").Value) Then  
			objListFile.WriteLine Chr(34) & strGroupName & strDelim & Chr(34) 		
		Else
			aUsers = objRecordSet.Fields("Member").Value  
			For Each strUserCN In aUsers
				Set objUser = GetObject("LDAP://" & strUserCN)  
				strUserName = objUser.sAMAccountName
				objListFile.WriteLine Chr(34) & strGroupName & strDelim & strUserName & Chr(34) 
			Next
		End If
		objRecordSet.MoveNext
	Loop
End If
End Sub
Bitte beachten: Nach der letzten im Array angegebenen OU ist kein Komma zu setzen.

Wo Du Details zur Funktionsweise nachlesen könntest, weißt Du ja inzwischen ...

Grüße
bastla
Mitglied: 60376
60376 25.01.2008 um 08:47:08 Uhr
Goto Top
geeeenial...dankeschön face-smile hast mir sehr geholfen!