demseinadmin
Goto Top

VBS LDAP - Auslesen ob Benutzerkonto deaktiviert ist, wenn nicht...

soll der Benutzer zur Anzahl der Mitglieder einer Gruppe addiert werden.

Hallo zusammen,

ich habe da noch ein Problem mit einem Skript von mir. Ziel ist es, alle Benutzer in den Gruppen einer bestimmten OU auszulesen und in eine Textdatei zu schreiben.

Hier mein bisheriger Code:

Option Explicit

Dim GROUP, OUNIT, DOMAENE, FSO, RESULTFILE, SOURCEFILE, LIST, RESULT, ANZ, ARRMEMBEROF, MEMBER

Set FSO = CreateObject("Scripting.FileSystemObject")  
RESULTFILE = "dat\result.txt"  
Set RESULT = FSO.OpenTextFile(RESULTFILE, 2)

RESULT.WriteLine("+++BEGINN RESSOURCENGRUPPEN+++")  

'+++++++++++++++++++++++++++++++++++  
'Ressourcen-Gruppen Quelle festlegen  
SOURCEFILE = "dat\ou_res.txt"  
OUNIT = "res"  
'+++++++++++++++++++++++++++++++++++  

If FSO.FileExists(SOURCEFILE) Then
	Set LIST = FSO.OpenTextFile(SOURCEFILE, 1)
	Do While Not (LIST.AtEndOfStream)
		On Error Resume Next
		GROUP = LIST.ReadLine
		Set DOMAENE = GetObject("LDAP://blablablubb")  
		ANZ = 0
		ARRMEMBEROF = DOMAENE.GetEx("member")  
		If (Err.Number = 0) Then 
			ANZ  = UBound(ARRMEMBEROF) + 1 
		End If
		On Error GoTo 0
		If (ANZ >= 1) then
			RESULT.WriteLine(GROUP)
			For Each MEMBER In ARRMEMBEROF
				RESULT.WriteLine(MEMBER)
			Next
		Else
			RESULT.WriteLine(GROUP)
		End If
	Loop
	Set LIST = Nothing
End If

RESULT.WriteLine("+++ENDE RESSOURCENGRUPPEN+++")  
RESULT.WriteLine("+++BEGINN USERGRUPPEN+++")  

'+++++++++++++++++++++++++++++++++++  
'User-Gruppen Quelle festlegen  
SOURCEFILE = "dat\ou_usr.txt"  
OUNIT = "usr"  
'+++++++++++++++++++++++++++++++++++  

If FSO.FileExists(SOURCEFILE) Then
	Set LIST = FSO.OpenTextFile(SOURCEFILE, 1)
	Do While Not (LIST.AtEndOfStream)
		On Error Resume Next
		GROUP = LIST.ReadLine
		Set DOMAENE = GetObject("LDAP://blablablubb")  
		ANZ = 0
		ARRMEMBEROF = DOMAENE.GetEx("member")  
		If (Err.Number = 0) Then 
			ANZ  = UBound(ARRMEMBEROF) + 1 
		End If
		On Error GoTo 0
		If (ANZ >= 1) then
			RESULT.WriteLine(GROUP & ";" & ANZ)  
		Else
			RESULT.WriteLine(GROUP & ";0")  
		End If
	Loop
	Set LIST = Nothing
End If

RESULT.WriteLine("+++ENDE USERGRUPPEN+++")  

Set LIST = Nothing
Set RESULT = Nothing
Set FSO = Nothing
Set DOMAENE = Nothing

So weit so gut, mit der Funktion GetEx() klappt das auch. Allerdings muss ich nun die deaktivierten Benutzer aus den Gruppen von der Anzahl subtrahieren, bzw. gar nicht erst berücksichtigen.
Wie man einen Benutzer deaktivieren kann, habe ich mir schon angesehen, nur leider habe ich keine Antwort auf meine Frage gefunden.

Hat jemand eine Idee? Gerne mit Beispiel anhand des obigen Quellcodes.


Gruß
Simon

Content-ID: 129990

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

Ausgedruckt am: 25.11.2024 um 16:11 Uhr

TsukiSan
TsukiSan 23.11.2009 um 08:54:45 Uhr
Goto Top
nur leider habe ich keine Antwort auf meine Frage gefunden.

Hat jemand eine Idee?

Ist das die Frage?
DemseinAdmin
DemseinAdmin 23.11.2009 um 09:05:53 Uhr
Goto Top
Nein, die Frage ist: Wie vermehren sich kernlose Orangen?
bastla
bastla 23.11.2009 um 09:23:02 Uhr
Goto Top
Hallo DemseinAdmin und TsukiSan!

Nachdem Ihr die Frage, was die Frage ist, geklärt habt, könntet Ihr das folgende Stück Code testen:
Set DOMAENE = GetObject("LDAP://blablablubb")  
ARRMEMBEROF = DOMAENE.GetEx("member")  
ANZ = 0
For i = 0 To UBound(ARRMEMBEROF)
    Set User = GetObject("LDAP://" & ARRMEMBEROF(i))  
    If Not User.AccountDisabled Then
        ANZ = ANZ + 1
        'WScript.Echo User.sAMAccountName  
    End If
Next
WScript.Echo ANZ
Grüße
bastla
DemseinAdmin
DemseinAdmin 23.11.2009 um 10:19:01 Uhr
Goto Top
Hallo bastla,

das schaut schon sehr gut aus! Vielen Dank erst einmal.
Ich konnte folgenden Code nur kurz antesten, da mir grade die Zeit fehlt:

If FSO.FileExists(SOURCEFILE) Then
	Set LIST = FSO.OpenTextFile(SOURCEFILE, 1)
	Do While Not (LIST.AtEndOfStream)
		On Error Resume Next
		GROUP = LIST.ReadLine
		Set DOMAENE = GetObject("LDAP://blabla)  
		ANZ = 0
		ARRMEMBEROF = DOMAENE.GetEx("member")  
		If (Err.Number = 0) Then
			For i = 0 to UBound(ARRMEMBEROF)
				Set USER = GetObject("LDAP://blabla CN=" & ARRMEMBEROF(i))  
				If Not USER.AccountDisabled Then
					ANZ = ANZ + 1
				End If
			Next
		End If
		On Error GoTo 0
		If (ANZ >= 1) then
			RESULT.WriteLine(GROUP & ";" & ANZ)  
		Else
			RESULT.WriteLine(GROUP & ";0")  
		End If
	Loop
	Set LIST = Nothing
End If

Allerdings spuckt er mir eine maximale Anzahl von einem Benutzer aus. Also entweder 0 oder 1, obwohl es z.B. 1500 Benutzer wären. Wahrscheinlich habe ich irgendwo einen flüchtigen Fehler gemacht, aber melde mich morgen noch mal dazu, falls ich nicht fündig geworden bin.

Vielen Dank soweit!

Gruß
Simon
TsukiSan
TsukiSan 24.11.2009 um 02:39:30 Uhr
Goto Top
Hallo DemseinAdmin,

das ist erklärbar.

in Zeile 3 startest du eine While Do - Schleife und in Zeile 7 setzt du permanent die Variable "Anz" auf NULL.
Setze besser Anz vor die Zeile 3, so ähnlich, wie bastla es schon in seinem Codeschnippsel getan hat.
Dann müsstest du über die EINS hinauskommen.

Gruss
Tsuki
DemseinAdmin
DemseinAdmin 24.11.2009 um 08:28:28 Uhr
Goto Top
Moin, moin,

naja das ist nicht ganz richtig, denn wenn ich die Anzahl nicht in der Schleife auf NULL setze, zählt er die Mitglieder gruppenübergreifend hoch.
Jede Zeile dich ich einlese, steht ja für eine Gruppe.

Gruß
Simon
DemseinAdmin
DemseinAdmin 24.11.2009 um 08:47:57 Uhr
Goto Top
Ja gut, es war natürlich wieder was total simples:

Option Explixit und das Verwenden einer undeklarierten Variable ( For i = 0 to....) verträgt sich nicht so gut face-wink
Aufgrund des "On Error Resume Next" gab es leider auch keine Fehlermeldung.

Jetzt noch eine Sache:
Kann man, ähnlich der Abfrage auf deaktiviert oder nicht, auch noch eine If-Anweisung einfügen, welche prüft, ob das Objekt ein Benutzer oder eine Gruppe ist?
Gruppen sollten nicht mitgezählt werden.


Gruß
Simon
TsukiSan
TsukiSan 24.11.2009 um 09:03:36 Uhr
Goto Top
eventuell mit
If Not USER.AccountDisabled and not user.Name then
DemseinAdmin
DemseinAdmin 24.11.2009 um 10:46:05 Uhr
Goto Top
Hm ne, das klappt nicht so ganz. Hast du es getestet?
Nicht das es bei mir noch an einem anderen Punkt scheitert.
DemseinAdmin
DemseinAdmin 24.11.2009 um 12:04:10 Uhr
Goto Top
Ich habe es jetzt so gelöst:

OBJCAT = USER.objectCategory
BOLGROUP = InStr(1, OBJCAT, "CN=Group", 1)  
'Nur zaehlen, wenn das Objekt keine Gruppe ist  
If (BOLGROUP = "0") Then  
'Nur zaehlen, wenn der Account nicht deaktiviert ist  
   If Not (USER.AccountDisabled) Then
      ANZ = ANZ + 1
   End If
End If

Vielen Dank an alle, für die Hilfe.

Gruß
Simon