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

VBS - Auslesen aller Gruppen einer OU samt Unter-OUs mit einigen Bedingungen

Frage Entwicklung VB for Applications

Mitglied: TuXHunt3R

TuXHunt3R (Level 3) - Jetzt verbinden

27.05.2009, aktualisiert 16:10 Uhr, 5084 Aufrufe, 12 Kommentare

Hallo ans Forum

Ich habe ein kleines Problem bei einem VBScript, welches ich für den Betrieb schreiben sollte. Hier der Code:

01.
Const ADS_SCOPE_SUBTREE = 10 
02.
Set objConnection = CreateObject("ADODB.Connection") 
03.
Set objCommand =   CreateObject("ADODB.Command") 
04.
objConnection.Provider = "ADsDSOObject" 
05.
objConnection.Open "Active Directory Provider" 
06.
Set objCommand.ActiveConnection = objConnection 
07.
objCommand.Properties("Page Size") = 1000 
08.
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  
09.
 
10.
objCommand.CommandText = "SELECT AdsPath,samAccountName FROM 'LDAP://ou=Tralala,dc=beispiel,dc=ch' WHERE objectCategory='group'"   
11.
Set objRecordSet = objCommand.Execute 
12.
objRecordSet.MoveFirst 
13.
 
14.
Do Until objRecordSet.EOF 
15.
	if Instr(objRecordSet.Fields("samAccountName").Value, "D-") > 0 Then 
16.
		Gruppenname=objRecordSet.Fields("samAccountName").Value 
17.
		UserCounter = 0 
18.
		' Mitglieder zählen 
19.
		Set objGroup = GetObject(objRecordSet.Fields("AdsPath").Value) 
20.
		objGroup.GetInfo 
21.
 		arrMemberOf = objGroup.GetEx("member") 
22.
		For Each strMember in arrMemberOf 
23.
			UserCounter = UserCounter + 1 
24.
		Next 
25.
		if UserCounter < 2 Then 
26.
			'Owner auslesen 
27.
			Owner = GetOwner(objRecordSet.Fields("AdsPath").Value) 
28.
			wscript.echo Gruppenname & ";" & Owner 
29.
		End if 
30.
		 
31.
		 
32.
	End if 
33.
Loop 
34.
 
35.
'******************************************************************************************** 
36.
' Funktionen: 
37.
 
38.
Function GetOwner(adsPath) 
39.
	Set objGroup = GetObject(adsPath) 
40.
	Set objNtSecurityDescriptor = objGroup.Get("ntSecurityDescriptor") 
41.
	GetOwner = objNtSecurityDescriptor.Owner 
42.
End Function 
43.
 
Dieses Script soll folgendes machen:
Es soll rekursiv alle Unter-OUs von ou=Tralala,dc=beispiel,dc=ch' abgrasen und von jeder Gruppe, die mit "D-" beginnt und weniger als 2 Mitglieder hat, den Namen, die Anzahl Mitglieder und den Owner auslesen. Wenn ich das Script mit CScript in der CMD-Shell starte, kommt zwar keine Fehlermeldung, allerdings sieht die Ausgabe dann so aus:

01.
D-Gruppe1;Beispiel\User1 
02.
D-Gruppe1;Beispiel\User1 
03.
D-Gruppe1;Beispiel\User1 
04.
D-Gruppe1;Beispiel\User1 
05.
D-Gruppe1;Beispiel\User1 
06.
D-Gruppe1;Beispiel\User1 
07.
D-Gruppe1;Beispiel\User1 
08.
D-Gruppe1;Beispiel\User1 
09.
D-Gruppe1;Beispiel\User1 
10.
D-Gruppe1;Beispiel\User1 
11.
D-Gruppe1;Beispiel\User1 
12.
D-Gruppe1;Beispiel\User1 
13.
D-Gruppe1;Beispiel\User1 
14.
D-Gruppe1;Beispiel\User1 
15.
D-Gruppe1;Beispiel\User1 
16.
D-Gruppe1;Beispiel\User1 
17.
D-Gruppe1;Beispiel\User1 
18.
D-Gruppe1;Beispiel\User1 
19.
D-Gruppe1;Beispiel\User1 
20.
D-Gruppe1;Beispiel\User1 
21.
D-Gruppe1;Beispiel\User1 
22.
D-Gruppe1;Beispiel\User1 
23.
D-Gruppe1;Beispiel\User1 
24.
D-Gruppe1;Beispiel\User1 
25.
D-Gruppe1;Beispiel\User1 
26.
D-Gruppe1;Beispiel\User1 
27.
D-Gruppe1;Beispiel\User1 
28.
D-Gruppe1;Beispiel\User1 
29.
D-Gruppe1;Beispiel\User1 
30.
D-Gruppe1;Beispiel\User1 
31.
D-Gruppe1;Beispiel\User1
Es wird also dieselbe Gruppe mit demselben Owner unendlich mal angezeigt (so scheint es mir zumindest, ich habs nach einer Minute abgebrochen). Kann mir das einer erklären, rsp. eine Lösung anbieten? Ich werde daraus nicht schlau...


Grüsse aus der Schweiz
TuXHunT3R
Mitglied: 76109
27.05.2009 um 16:59 Uhr
Hallo TuXHunt3R,

am Ende Deiner Loop-Schleife fehlt ein <objRecordSet.MoveNext>

Gruß Dieter
Bitte warten ..
Mitglied: bastla
27.05.2009 um 17:12 Uhr
Hallo TuXHunt3R und didi1954!

Das eigentliche Problem sollte schon gelöst sein, daher nur noch zwei Anmerkungen:

Wenn der Gruppenname mit "D-" beginnen soll, wäre die genauere Abfrage
If UCase(Left(objRecordSet.Fields("samAccountName").Value, 2)) = "D-" Then
Die Anzahl der Gruppenmitglieder sollte sich etwas direkter auch mit
UserCounter = UBound(objGroup.GetEx("member")) + 1
bestimmen lassen (mit einem On Error Resume Next davor für den Fall, dass die Gruppe keine Mitglieder hat) ...

Grüße
bastla
Bitte warten ..
Mitglied: TuXHunt3R
27.05.2009 um 20:44 Uhr
am Ende Deiner Loop-Schleife fehlt ein <objRecordSet.MoveNext>

Mein Gott, bin ich dämlich....... Ich habe sicher eine Stunde nach dem Fehler gesucht und übersehe so einen besch** MoveNext. Herzlichen Dank jedenfalls.

Wenn der Gruppenname mit "D-" beginnen soll, wäre die genauere Abfrage
Danke für den Hinweis, aber die Gross/Kleinschreibung ist egal.


mit einem On Error Resume Next davor für den Fall, dass die Gruppe keine Mitglieder hat
Guter Tipp, ich werde aber sehen, dass ich das irgendwie anders abfangen kann, z.B. mit einer weiteren Iteration.


Ich lass den Beitrag mal noch offen. Ich werde es morgen im Geschäft ausprobieren, gebe dann Feedback und poste das funktionierende Script.
Bitte warten ..
Mitglied: bastla
27.05.2009 um 21:07 Uhr
Hallo TuXHunt3R!
... die Gross/Kleinschreibung ist egal.
Dir vielleicht , aber VBS unterscheidet da sehr wohl.

Das "genauer" bezog sich allerdings mehr auf die Tatsache, dass mit InStr() im gesamten Text gesucht wird, während Left() nur den Anfang des Strings betrachtet ...

Wie sehr Du Dich auf die Richtigkeit der Gruppennamen verlassen kannst bzw willst (und daher die genannten Aspekte tatsächlich nicht zum Tragen kommen sollten), musst Du natürlich selbst entscheiden.

Grüße
bastla
Bitte warten ..
Mitglied: 76109
27.05.2009 um 22:56 Uhr
Hallo TuXHunt3R und bastla!

Zitat von TuXHunt3R:
Mein Gott, bin ich dämlich....... Ich habe sicher eine Stunde
nach dem Fehler gesucht und übersehe so einen besch** MoveNext.
Tja, manchmal sieht man den Wald vor lauter Bäumen nicht
Danke für den Hinweis, aber die Gross/Kleinschreibung ist egal.
Ist nur egal, wenn Du die Option TextCompare angibst (Default=vbBinaryCompare):
01.
if Instr(1, objRecordSet.Fields("samAccountName").Value, "D-", vbTextCompare) > 0

Gruß Dieter

[Edit] Aufgrund des Hinweises von bastla, die Startposition noch eingefügt, weil diese
bei Angabe der Vergleichsart auch angegeben werden muss (sonst optional).[/Edit]
Bitte warten ..
Mitglied: bastla
27.05.2009 um 23:27 Uhr
... was allerdings einerseits noch immer nicht nur den Anfang des Strings vergleicht und andererseits nur funktioniert, wenn Du auch eine Startposition angibst:
If InStr(1, objRecordSet.Fields("samAccountName").Value, "D-", vbTextCompare) > 0 Then
Grüße
bastla
Bitte warten ..
Mitglied: 76109
28.05.2009 um 00:00 Uhr
Hallo bastla!

Zitat von bastla:
... was allerdings einerseits noch immer nicht nur den Anfang des Strings vergleicht
und andererseits nur funktioniert, wenn Du auch eine Startposition angibst:
Wieso denn? Die Startposition ist optional und wird sie nicht angegeben, dann ist die Startposition das 1. Zeichen

Allerdings hast Du insoweit Recht, dass ein "D-" auch an anderer Stelle im Suchstring gefunden werden könnte. In dem Fall müsste der Vergleich If InStr(...) = 1 Then.... heissen.

Aber von dem abgesehen, würde ich persönlich auch UCase(Left..) verwenden.

Gruß Dieter
Bitte warten ..
Mitglied: bastla
28.05.2009 um 00:08 Uhr
@76109
Die Startposition ist optional und wird sie nicht angegeben, dann ist die Startposition das 1. Zeichen
... es sei denn, die MS-Doku wäre korrekt: "The start argument is required if compare is specified."

Grüße
bastla
Bitte warten ..
Mitglied: 76109
28.05.2009 um 00:12 Uhr
Hallo bastla!

Aja, stimmt. Wenn Vergleich angegeben wird, dann muss auch die Startposition angegeben werden.

Werde es oben ändern.

Gruß Dieter
Bitte warten ..
Mitglied: bastla
28.05.2009 um 00:21 Uhr
Auch ein Test mit
WScript.Echo InStr("Versuch", "U", vbTextCompare)
vs
WScript.Echo InStr(1, "Versuch", "U", vbTextCompare)
spricht dafür, dass der Wert wohl anzugeben ist ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
28.05.2009 um 00:29 Uhr
Hallo nochmal,

äh, hab ich doch schon geschrieben oder warst Du wieder zu schnell, während ich meine Antwort noch mal geändert hatte?

Gruß Dieter
Bitte warten ..
Mitglied: bastla
28.05.2009 um 00:32 Uhr
warst Du wieder zu schnell, während ich meine Antort noch mal geändert hatte?
Ausnahmsweise ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Entwicklung
Zählerstände über SNMP und VBS auslesen (4)

Frage von motofuzy zum Thema Entwicklung ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...