Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

AD-Gruppen eine AD-Benutzers per Script auslesen

Frage Entwicklung VB for Applications

Mitglied: Alecane

Alecane (Level 1) - Jetzt verbinden

28.01.2011 um 11:52 Uhr, 10479 Aufrufe, 11 Kommentare

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?

01.
Const FOR_APPENDING = 8 
02.
 
03.
set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE") 
04.
 
05.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
06.
Set objFile = objFSO.OpenTextFile(".\liste.txt", FOR_APPENDING, True) 
07.
 
08.
for each objMember in objGroup.Members 
09.
objFile.WriteLine(objMember.sAMAccountName) & "" & (objMember.Name) 
10.
next 
11.
objFile.Close
Wie kann ich das jetzt erweitern, ich trau mich gar nicht euch den letzten Test Code zu zeigen ;)

Gruß Alecane
Mitglied: bastla
28.01.2011 um 12:20 Uhr
Hallo Alecane und willkommen im Forum!

Andere waren schon fleißig , 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
Bitte warten ..
Mitglied: Alecane
28.01.2011 um 12:25 Uhr
Erstmal danke, aber wird dafür soviel Code benötigt?

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

01.
Set colGroups = objUser.Groups 
02.
For Each objGroup in colGroups 
03.
    Wscript.Echo objGroup.CN 
04.
    GetNested(objGroup) 
05.
Next 
06.
Function GetNested(objGroup) 
07.
    On Error Resume Next 
08.
    colMembers = objGroup.GetEx("memberOf") 
09.
    For Each strMember in colMembers 
10.
        strPath = "LDAP://" & strMember 
11.
        Set objNestedGroup = _ 
12.
        GetObject(strPath) 
13.
        WScript.Echo objNestedGroup.CN 
14.
        GetNested(objNestedGroup) 
15.
    Next 
16.
End Function
Fehlermeldung:
Zeile 2
Zeichen 1
Das Objekt unterstüzt diese Methode nicht: objUser.Groups
Code: 800A01B6
Bitte warten ..
Mitglied: BigWim
28.01.2011 um 12:30 Uhr
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

01.
set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE") 
02.
 
03.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
04.
Set objFile = objFSO.OpenTextFile(".\liste.txt", FOR_APPENDING, True) 
05.
 
06.
for each objMember in objGroup.Members 
07.
objFile.WriteLine(objMember.sAMAccountName) & "" & (objMember.Name) 
08.
 
09.
set objUser = GetObject ("LDAP://CN=objMember.blablabal,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE") 
10.
for each objUsergruppe in objUser.blablabla 
11.
blablabla 
12.
next 
13.
next 
14.
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?
Bitte warten ..
Mitglied: bastla
28.01.2011 um 12:32 Uhr
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
Bitte warten ..
Mitglied: Alecane
28.01.2011 um 12:37 Uhr
Danke euch, ich werd dann mal am Wochende rum spielen ;)

Ich gebe auch dann am Montag eine Rückmeldung.
Bitte warten ..
Mitglied: bastla
28.01.2011 um 12:39 Uhr
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 ...
Noch als Nachtrag:
01.
Const ADS_UF_ACCOUNTDISABLE = 2 
02.
If Not objUser.userAccountControl AND ADS_UF_ACCOUNTDISABLE Then WScript.Echo "User aktiv"
Grüße
bastla
Bitte warten ..
Mitglied: Alecane
31.01.2011 um 07:25 Uhr
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.

01.
Set colGroups = objUser.Groups
Gruß Alecane
Bitte warten ..
Mitglied: bastla
31.01.2011 um 08:38 Uhr
Hallo Alecane!

Soeben erfrolgreich getestet:
01.
Const ListFile = "D:\liste.txt" 
02.
Const Delim = ";" 
03.
Const FOR_APPENDING = 8 
04.
 
05.
Set objgroup = GetObject ("LDAP://CN=BLA,OU=BLA,OU=BLA,OU=BLA,DC=BLA,DC=BLA,DC=BLA,DC=DE") 
06.
 
07.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
08.
Set objFile = objFSO.OpenTextFile(ListFile, FOR_APPENDING, True) 
09.
 
10.
For Each objUser In objGroup.Members 
11.
    UserInfo = objUser.sAMAccountName & Delim & objUser.Name 
12.
    Set colGroups = objUser.Groups 
13.
    For Each objGroup in colGroups 
14.
        UserInfo = UserInfo & Delim & objGroup.CN 
15.
        GetNested(objGroup) 
16.
    Next 
17.
    objFile.WriteLine UserInfo 
18.
next 
19.
objFile.Close 
20.
 
21.
Function GetNested(objGroup) 
22.
    On Error Resume Next 
23.
    colMembers = objGroup.GetEx("memberOf") 
24.
    For Each strMember in colMembers 
25.
        strPath = "LDAP://" & strMember 
26.
        Set objNestedGroup = _ 
27.
        GetObject(strPath) 
28.
        WScript.Echo objNestedGroup.CN 
29.
        GetNested(objNestedGroup) 
30.
    Next 
31.
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
Bitte warten ..
Mitglied: Alecane
31.01.2011 um 10:12 Uhr
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
Bitte warten ..
Mitglied: bastla
31.01.2011 um 10:40 Uhr
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 ...

Grüße
bastla
Bitte warten ..
Mitglied: Alecane
31.01.2011 um 10:42 Uhr
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?

01.
Const ListFile = ".\GPO-Test-Aktive-Benutzer.txt" 
02.
Const Delim = ";" 
03.
Const FOR_APPENDING = 8 
04.
Const ADS_UF_ACCOUNTDISABLE = 2 
05.
 
06.
Set objgroup = GetObject ("LDAP://Bla...") 
07.
 
08.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
09.
Set objFile = objFSO.OpenTextFile(ListFile, FOR_APPENDING, True) 
10.
 
11.
For Each objUser In objGroup.Members 
12.
	If Not objUser.userAccountControl AND ADS_UF_ACCOUNTDISABLE Then 
13.
    		UserInfo = objUser.sAMAccountName & Delim & objUser.Name 
14.
    		Set colGroups = objUser.Groups 
15.
    		For Each objGroup in colGroups 
16.
        	UserInfo = UserInfo & Delim & objGroup.CN 
17.
        	GetNested(objGroup) 
18.
  		Next 
19.
	    objFile.WriteLine UserInfo 
20.
	End if 
21.
next 
22.
objFile.Close 
23.
 
24.
WScript.Echo "Fertig" 
25.
 
26.
Function GetNested(objGroup) 
27.
    On Error Resume Next 
28.
    colMembers = objGroup.GetEx("memberOf") 
29.
    For Each strMember in colMembers 
30.
        strPath = "LDAP://" & strMember 
31.
        Set objNestedGroup = _ 
32.
        GetObject(strPath) 
33.
        REM WScript.Echo objNestedGroup.CN 
34.
        GetNested(objNestedGroup) 
35.
    Next 
36.
End Function
Gruß Alecane
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell Script zum verschachteln von AD Gruppen Domain Übergreifend (1)

Frage von Lukas4580 zum Thema Batch & Shell ...

Windows Userverwaltung
PS Skript AD Objekte auslesen (1)

Frage von m.reeger zum Thema Windows Userverwaltung ...

Windows Server
gelöst AD-User einer AD-Gruppe auslesen und in ein File schreiben (15)

Frage von Estefania zum Thema Windows Server ...

Windows Userverwaltung
gelöst Gruppenmitgliedschaft einer AD Gruppe per cmd auslesen (2)

Frage von RamboJay zum Thema Windows Userverwaltung ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...