berginet
Goto Top

VBS - AD Gruppen auslesen und vergleichen?

Neuling braucht etwas Hilfestellung

Ich möchte mit VBS aus 2 Gruppen auslesen das ich soweit auch schon hinkriege was ich aber nicht weiss, wie kann ich die User der beiden Gruppen dann miteinander vergleichen ob ein User in beiden Gruppen auftaucht.

Mein Skript bisher was nur die Gruppen ausliest.

Option Explicit

DIM network, domainname
DIM objGroup1, objGroup2, arrMemberOf1, arrMemberOf2, strMember
DIM i, z, wert

on error resume next

'**************************************************************************************************************  

set network = CreateObject("Wscript.Network")  

domainname = network.UserDomain				   

set objGroup1 = GetObject("LDAP://CN=Gruppe1,CN=Users,DC=" &domainname &",DC=test")  
objGroup1.GetInfo

set objGroup2 = GetObject("LDAP://CN=Gruppe2,CN=Users,DC=" &domainname &",DC=test")  
objGroup2.GetInfo 

arrMemberOf1 = objGroup1.GetEx("member")  
arrMemberOf2 = objGroup2.GetEx("member")  

'**************************************************************************************************************  
i = 0
z = 0
For Each strMember in arrMemberOf1 
    	if strmember <> "" THEN  
    		WScript.echo strMember
		i = i + 1
	end if
Next
For Each strMember in arrMemberOf2     
    	if strmember <> "" THEN  
    		WScript.echo strMember
		z = z + 1
	end if
Next

wscript.echo "i" &i  
wscript.echo "z" &z  

Für Hilfestellung wäre ich sehr dankbar.

lg
Alex

Content-ID: 98259

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

Ausgedruckt am: 25.11.2024 um 19:11 Uhr

bastla
bastla 01.10.2008 um 15:23:38 Uhr
Goto Top
Hallo berginet und willkommen im Forum!

Ungetestet etwa so:
Option Explicit

DIM network, domainname
DIM objGroup1, objGroup2, arrMemberOf1, arrMemberOf2, strMember, strG2

on error resume next

'**************************************************************************************************************  

set network = CreateObject("Wscript.Network")  

domainname = network.UserDomain				   

set objGroup1 = GetObject("LDAP://CN=Gruppe1,CN=Users,DC=" &domainname &",DC=test")  
objGroup1.GetInfo

set objGroup2 = GetObject("LDAP://CN=Gruppe2,CN=Users,DC=" &domainname &",DC=test")  
objGroup2.GetInfo 

arrMemberOf1 = objGroup1.GetEx("member")  
arrMemberOf2 = objGroup2.GetEx("member")  

'**************************************************************************************************************  
strG2 = "#" & Join(arrMemberOf2, "#") & "#"  
For Each strMember in arrMemberOf1 
    If strMember <> "" THEN  
        If InStr(strG2, "#" & strMember & "#") > 0 Then WScript.Echo strMember  
    End If
Next

WScript.Echo "Anzahl Gruppe 1: " & CStr(UBound(arrMemberOf1))  
WScript.Echo "Anzahl Gruppe 2: " & CStr(UBound(arrMemberOf2))  
Durch das Zusammenfassen der in Gruppe 2 befindlichen User in einen String kann anstelle einer Schleife über alle User einfach mit "InStr()" gesucht weden. Damit keine Teilstrings gefunden werden (zB "bauer" in "unterbauer") wird jeder Username durch "#" begrenzt.
Weitere Alternative zu der beschriebenen Vorgangsweise: Ein "dictionary" aufbauen ...

Grüße
bastla

[Edit] In Zeile 24 auf "arrMemberOf2" korrigiert [/Edit]
Logan000
Logan000 01.10.2008 um 15:29:24 Uhr
Goto Top
Moin Moin

Du muss Deine beiden For-next schleifen schachteln.
Etwa so:
...
For Each strMember1 in arrMemberOf1 
   if strmember1 <> "" THEN  
      For Each strMember2 in arrMemberOf2     
         if strmember2 <> "" THEN  
            If strmember1 = strmember2 Then
               wscript.echo strmember1 & " ist in beiden Gruppen vorhanden."  
            end if
         end if
      Next
   end if
Next
...

Gruß L.
berginet
berginet 02.10.2008 um 11:54:11 Uhr
Goto Top
Hallo vielen Dank für die schnelle Hilfe, werde beide Varianten testen.

Kann es aber sein, dass bei StrG2 die arrMemberOf2 nicht 1 zusamengefasst werden müssen?

Das mit dem Dictionary wenn Du kurz erläutern könntest wäre super, aber ich kanns auch suchen wenn ich mal dazu komme.

Sorry das ich erst jetzt Antworten konnte.
lg
Bergi
berginet
berginet 02.10.2008 um 11:54:22 Uhr
Goto Top
Hallo vielen Dank für die schnelle Hilfe, werde beide Varianten testen.
Sorry das ich erst jetzt Antworten konnte.
lg
Bergi
bastla
bastla 02.10.2008 um 13:06:39 Uhr
Goto Top
Hallo berginet!

Kann es aber sein, dass bei StrG2 die arrMemberOf2 nicht 1 zusamengefasst werden müssen?
Es kann nicht sein, sondern muss face-wink - sorry, war falsch ...
Bei der Variante "dictionary" würden die Zeilen ab 24 etwa so aussehen:
Set d2 = CreateObject("Scripting.Dictionary")  
d2.CompareMode = vbTextCompare

For Each strMember In arrMemberOf2
  d2.Add strMember, ""  
Next

For Each strMember In arrMemberOf1
  If d2.Exists(strMember) Then WScript.Echo strMember
Next
Eigentlich ist ein "dictionary" dazu gedacht, Wertepaare (bestehend aus Schlüssel und zugeordnetem Wert) aufzunehmen - da hier aber nur der Schlüssel (bzw dessen allfälliges Vorhandensein) interessiert, wird als Wert jeweils ein Leerstring zugewiesen.

Doku: http://msdn.microsoft.com/en-us/library/x4k5wbx4(VS.85).aspx

Grüße
bastla