alecane
Goto Top

AD-Gruppen eine AD-Benutzers per Script auslesen

Hallo Community ;)

Ich habe von einem Arbeitskollegen den Auftrag bekommen mich mal mit VBS Scripten und Active Directory auseinander zu setzen, weil ich ja so toll Linux Scripten kann, der faule hund ;)

Auftrag: Ich möchte von einer OU des Active Directory alle vorhanden Benutzer auslesen, am besten nur die Aktivierten, danach soll von jedem Benutzer die Gruppen ausgelesen werden, das ganze soll in eine Text-Datei geschrieben werden.

Die Benutzer kann ich schon erfolgreich auslesen, zwar auch die deaktivierten, aber besser als nix. Doch ich komme einfach nicht weiter, wie kann ich von den einzelnen Benutzer die ganzen Gruppen auslesen und auch in die Text-Datei schreiben?

Const FOR_APPENDING = 8

set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE")  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile(".\liste.txt", FOR_APPENDING, True)  

for each objMember in objGroup.Members
objFile.WriteLine(objMember.sAMAccountName) & "" & (objMember.Name)  
next
objFile.Close

Wie kann ich das jetzt erweitern, ich trau mich gar nicht euch den letzten Test Code zu zeigen ;)

Gruß Alecane

Content-Key: 159654

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

Printed on: April 26, 2024 at 12:04 o'clock

Member: bastla
bastla Jan 28, 2011 at 11:20:27 (UTC)
Goto Top
Hallo Alecane und willkommen im Forum!

Andere waren schon fleißig face-wink, zB die Scripting Guys oder R.L. Mueller

Allgemeine Beispielscripts für VBScript: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b4cb2678-da ...

Grüße
bastla
Member: Alecane
Alecane Jan 28, 2011 at 11:25:22 (UTC)
Goto Top
Erstmal danke, aber wird dafür soviel Code benötigt?

Wenn ich folgenden Code Versuche Auszuführen, bekomme ich eine Fehlermeldung:

Set colGroups = objUser.Groups
For Each objGroup in colGroups
    Wscript.Echo objGroup.CN
    GetNested(objGroup)
Next
Function GetNested(objGroup)
    On Error Resume Next
    colMembers = objGroup.GetEx("memberOf")  
    For Each strMember in colMembers
        strPath = "LDAP://" & strMember  
        Set objNestedGroup = _
        GetObject(strPath)
        WScript.Echo objNestedGroup.CN
        GetNested(objNestedGroup)
    Next
End Function

Fehlermeldung:
Zeile 2
Zeichen 1
Das Objekt unterstüzt diese Methode nicht: objUser.Groups
Code: 800A01B6
Member: BigWim
BigWim Jan 28, 2011 at 11:30:31 (UTC)
Goto Top
Hallo Alecane,

vorneweg die schlechte Nachricht: VBS und LDAP ist nicht meiner Welt, aber:

Wenn Du Dir mal die Hilfe von dsget user /? ansiehst, wirst Du feststellen, dass es einen Parameter (= Eigenschaft für die LDAP-Abfrage) gibt, der das aussortieren kann (-disabled).

Desweiteren bin ich der Überzeugung, um an die Gruppenmitgliedschaften zu kommen, muß Du das Userobjekt im Zugriff nehmen, um darüber an die Gruppenmitgliedschaften zu kommen.

Viel Erfolg
Markus

set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE")  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile(".\liste.txt", FOR_APPENDING, True)  

for each objMember in objGroup.Members
objFile.WriteLine(objMember.sAMAccountName) & "" & (objMember.Name)  

set objUser = GetObject ("LDAP://CN=objMember.blablabal,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE")  
for each objUsergruppe in objUser.blablabla
blablabla
next
next
objFile.Close


NS: Das blabla ist nicht bös gemeint, ich weiß nur die Syntax nicht.
In der Konsole kämst Du mit diesen Befehlen ans Ziel:

dsquery group /user
dsget group / user

Edit:
Boah, sitzt Ihr eigentlich vor dem Webserver? Warum geht das immer so schnell?
Member: bastla
bastla Jan 28, 2011 at 11:32:47 (UTC)
Goto Top
Hallo Alecane!

Du beziehst Dich vermutlich auf die (von mir zuerst verlinkte) Version von R.L. Mueller - die Antwort ist:

Natürlich nicht, wenn Du auf Dokumentation und das wenige, was VBS an "Benutzeroberfläche" und Errorhandling zu bieten hast, verzichten kannst ...

Grüße
bastla
Member: Alecane
Alecane Jan 28, 2011 at 11:37:01 (UTC)
Goto Top
Danke euch, ich werd dann mal am Wochende rum spielen ;)

Ich gebe auch dann am Montag eine Rückmeldung.
Member: bastla
bastla Jan 28, 2011 at 11:39:56 (UTC)
Goto Top
Hallo Alecane!
Wenn ich folgenden Code Versuche Auszuführen, bekomme ich eine Fehlermeldung:
Wenn Du Dich noch entschließen könntest, vor Zeile 1 ein Objekt "objUser" - und sei es zu Testzwecken nur ganz einfach der angemeldete Benutzer mit
Set objUser = GetObject("LDAP://" & CreateObject("ADSystemInfo").UserName)
zu erzeugen, sollte das Ergebnis erfreulicher aussehen ... face-wink
Noch als Nachtrag:
Const ADS_UF_ACCOUNTDISABLE = 2
If Not objUser.userAccountControl AND ADS_UF_ACCOUNTDISABLE Then WScript.Echo "User aktiv"  
Grüße
bastla
Member: Alecane
Alecane Jan 31, 2011 at 06:25:25 (UTC)
Goto Top
Guten Morgen,

sorry, den "GetObjekt" hatte ich bereits drin, vorher nur raus kopiert, warum auch immer ;)
Ich bekomme immer eine Fehlermeldung die mir sagt das folgende Methode nicht unterstüzt wird.

Set colGroups = objUser.Groups

Gruß Alecane
Member: bastla
bastla Jan 31, 2011 at 07:38:27 (UTC)
Goto Top
Hallo Alecane!

Soeben erfrolgreich getestet:
Const ListFile = "D:\liste.txt"  
Const Delim = ";"  
Const FOR_APPENDING = 8

Set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE")  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile(ListFile, FOR_APPENDING, True)

For Each objUser In objGroup.Members
    UserInfo = objUser.sAMAccountName & Delim & objUser.Name
    Set colGroups = objUser.Groups
    For Each objGroup in colGroups
        UserInfo = UserInfo & Delim & objGroup.CN
        GetNested(objGroup)
    Next
    objFile.WriteLine UserInfo
next
objFile.Close

Function GetNested(objGroup)
    On Error Resume Next
    colMembers = objGroup.GetEx("memberOf")  
    For Each strMember in colMembers
        strPath = "LDAP://" & strMember  
        Set objNestedGroup = _
        GetObject(strPath)
        WScript.Echo objNestedGroup.CN
        GetNested(objNestedGroup)
    Next
End Function
Dass damit nicht, wie von Dir beschrieben, die Benutzer einer bestimmten OU, sondern die Mitglieder einer vorgegebenen Gruppe aufgelistet werden, sei nur am Rande angemerkt ...

Grüße
bastla
Member: Alecane
Alecane Jan 31, 2011 at 09:12:04 (UTC)
Goto Top
Hi und danke für deine mühe ;)

Das Script Funktioniert aufjedenfall, aber könntest du mir vielleicht erklären was genau passiert?

Also ich verstehe es so, das Script sucht in meiner angegebenen OU die Gruppen und deren aktivierten benutzer herraus?

Gruß Alecane
Member: bastla
bastla Jan 31, 2011 at 09:40:19 (UTC)
Goto Top
Hallo Alecane!
das Script sucht in meiner angegebenen OU die Gruppen
Nein - Du gibst ja eine konkrete Gruppe (mit "LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE") an; die Gruppe heißt "1. BLA" und befindet sich in der OU "2. Bla", welche eine Unter-OU der OU "3. BLA" ist, etc ...
Dann werden nur die Mitglieder dieser (einen) Gruppe (ab Zeile 10) einzeln betrachtet ...
und deren aktivierten benutzer herraus?
Bisher ist die Unterscheidung zwischen aktiven und deaktivierten Benutzern noch nicht eingebaut - ich wollte Dir ja auch noch Gelegenheit zu eigener Leistung lassen ... face-wink

Grüße
bastla
Member: Alecane
Alecane Jan 31, 2011 at 09:42:43 (UTC)
Goto Top
Jetzt habe ich es durch das testen heraus gefunden, sehr vielen Dank.

Ich werd mich dann mal daran setzen und wieder antworten wenn ich eine Lösung habe ;)

EDIT: So funktioniert es mit den aktieven/deaktiven Benutzern, kann ich den Code auch so stehen lassen, oder gibt es noch was zu bemängeln?

Const ListFile = ".\GPO-Test-Aktive-Benutzer.txt"  
Const Delim = ";"  
Const FOR_APPENDING = 8
Const ADS_UF_ACCOUNTDISABLE = 2

Set objgroup = GetObject ("LDAP://Bla...")  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile(ListFile, FOR_APPENDING, True)

For Each objUser In objGroup.Members
	If Not objUser.userAccountControl AND ADS_UF_ACCOUNTDISABLE Then
    		UserInfo = objUser.sAMAccountName & Delim & objUser.Name
    		Set colGroups = objUser.Groups
    		For Each objGroup in colGroups
        	UserInfo = UserInfo & Delim & objGroup.CN
        	GetNested(objGroup)
  		Next
	    objFile.WriteLine UserInfo
	End if
next
objFile.Close

WScript.Echo "Fertig"  

Function GetNested(objGroup)
    On Error Resume Next
    colMembers = objGroup.GetEx("memberOf")  
    For Each strMember in colMembers
        strPath = "LDAP://" & strMember  
        Set objNestedGroup = _
        GetObject(strPath)
        REM WScript.Echo objNestedGroup.CN
        GetNested(objNestedGroup)
    Next
End Function

Gruß Alecane