narthan
Goto Top

Problem bei Batch Code (betreffend AD)

Hallo,

ich habe folgendes Problem. Ich soll mit einer Batch Datei aus dem AD die Owner einer Gruppe (sind in der Beschreibung aufgelistet), alle Gruppen die dem Owner gehören und sämtliche Mitglieder dieser Gruppen in Owner-abhängige .txt Dateien auslesen und speichern. Ich bin nun soweit, dass ich die Owner auslesen und in Dateien speichern kann, allerdings erstellt er pro gefundenen Owner eine neue .txt Datei.
Das Problem ist dabei, wenn ich nun 3 Gruppen mit dem gleichen Owner (z.B. Owner: Müller) habe, dann erstellt er mir auch 3 .txt Dateien... Ich möchte aber eine .txt für jeden Owner, in dieser .txt Datei sollten dann alle Gruppen mit Membern aufgelistet werden.


Mein Code sieht wie folgt aus:


@ECHO OFF & setlocal enabledelayedexpansion

dsquery group "Pfad,Domain" -limit 400 | dsget group -desc > DescriptionList.txt  


SET /a num=0

FOR /F "delims=" %%a IN (DescriptionList.txt) DO CALL :ausgabe "%%a"  
ECHO.
ECHO Anzeige der erzeugten Variablen:
SET v
PAUSE
GOTO :eof

:ausgabe
SET /a num=%num%+1
ECHO Textzeile ist %1
ECHO Zeilennummer=%num%
SET var%num%=%1
ECHO Variableninhalt=!var%num%!

ECHO !var%num%! | findstr "Owner">NUL  
IF not errorlevel 1  ECHO !var%num%! > Owner_var%num%.txt



Über Hilfe wäre ich sehr dankbar (Powershell, VBS, etc. kommen nicht in Frage, nur Batch (DOS, Win2k3 Server).

Gruß

Content-ID: 197336

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

Ausgedruckt am: 08.11.2024 um 11:11 Uhr

bastla
bastla 21.01.2013 um 11:47:56 Uhr
Goto Top
Hallo narthan!

Ändere versuchsweise die letzte Zeile auf
IF not errorlevel 1 ECHO !var%num%! >>Owner_var%num%.txt
BTW: Wozu speicherst Du alle Zeilen in einzelnen Variablen?

Grüße
bastla

P.S.: "Code"-Formatierung lässt sich auch nachträglich noch anwenden ...
narthan
narthan 21.01.2013 um 12:06:56 Uhr
Goto Top
Hey danke für die Antwort!

Ich musste die "Descriptions" in eine Datei speichern, um diese dann jedoch weiterzuverwenden, musste ich die Datei zeilenweise auslesen und in Variablen speichern, um auch nur die Werte, in denen "Owner" enthalten ist, in eine neue Datei zu speichern. (Bin übrigens ein totaler Batch-Neuling, sieht man vllt ja :D )


Die Änderung der Zeile hatte nicht den gewünschten Effekt, da dieselbe Ausgabe einfach nur innerhalb der Datei angehängt wurde. :/

Gruß
bastla
bastla 21.01.2013 aktualisiert um 16:53:30 Uhr
Goto Top
Hallo narthan!

Wie sieht denn (schematisch) eine solche Zeile mit "Owner" aus?
Ich musste die "Descriptions" in eine Datei speichern
Hast Du schon mal
FOR /F "delims=" %%a IN ('dsquery group "Pfad,Domain" -limit 400 ^| dsget group -desc ^| findstr "Owner"') DO echo "%%a"
versucht?

Grüße
bastla

[Edit] schließenden Apostroph ergänzt [/Edit]
narthan
narthan 21.01.2013 um 12:52:53 Uhr
Goto Top
Hey,

nein noch nicht, danke, probier ich gleich mal und melde mich dann wieder (muss nur kurz was in der Stadt besorgen).

Die Zeilen sehen sehr simpel aus: "Owner: Max Mustermann"
Mehr steht in einer solchen Zeile nicht drin.

Gruß face-smile
narthan
narthan 21.01.2013 um 14:20:25 Uhr
Goto Top
Hi, da bin ich wieder.

FOR /F "delims=" %%a IN ('dsquery group "Pfad,Domain" -limit 400 ^| dsget group -desc ^| findstr "Owner" ) DO echo "%%a" 



..führt leider zu einem Fehler, passiert auch nichts mit den Dateien. :/

Grüße
bastla
bastla 21.01.2013 aktualisiert um 16:54:05 Uhr
Goto Top
Hallo narthan!
..führt leider zu einem Fehler
Hab's schon gesehen - der schließende Apostroph hat gefehlt (ist jetzt oben nachgetragen).
passiert auch nichts mit den Dateien. :/
Soll es ja ohnehin nicht - da steht ja nur ein simples
echo "%%a"
damit Du Dir einmal die Ausgabe ansehen kannst.

Was Du dann damit vorhast, leuchtet mir noch nicht so ganz ein, denn Dein ursprünglicher Ansatz würde ja nach Deiner Beschreibung versuchen, Dateien wie "Owner_Owner: Max Mustermann.txt" mit dem Inhalt "Owner: Max Mustermann" zu erzeugen - sieht nicht sehr informativ aus ...

Vielleicht holst Du noch etwas weiter aus und postest die ersten paar Zeilen (für zB 3 Gruppen) Deiner "DescriptionList.txt" und das gewünschte Resultat.

Grüße
bastla
narthan
narthan 22.01.2013 um 08:11:48 Uhr
Goto Top
Moin,

alles klar, probier ich aus face-smile

Also meine DescriptionList.txt sieht wie folgt aus:
Owner: Max Mustermann
Owner: Peter Meier
Owner: Karsten Müller
Owner: Max Mustermann
Owner: Ulla Schulz
Owner: Ulla Schulz
usw...

und nun müsste ich ne .txt erstellen (zu einem dieser Owner, z.B. Max Mustermann), die wie folgt gegliedert sein sollte:

MaxMustermann.txt

Owner: Max Mustermann
Gruppe ABC:
- Ulla Schulz
- Karsten Müller
- Peter Meier

Gruppe DCE:
- Ulla Schulz
- Peter Meier 

Max Mustermann wäre in diesem Fall der Owner der Gruppen ABC und DCE, darunter sind die dazugehörigen Gruppenmitglieder aufgelistet.

Grüße
bastla
Lösung bastla 22.01.2013, aktualisiert am 25.04.2014 um 09:53:25 Uhr
Goto Top
Hallo narthan!

Dann wäre das eher so zu lösen (weitgehend ungetestet):
@echo off & setlocal
::Gruppen ermitteln und einzeln im Unterprogramm ":ProcessGroup" weiterverarbeiten  
for /f "delims=" %%a in ('dsquery group "Pfad,Domain" -limit 400') do call :ProcessGroup "%%a"  
:: Batch hier beenden
goto :eof

:ProcessGroup
:: Gruppe steht in %1
:: Owner auslesen (steht nach erstem ":" und " " und kann Leerzeichen enthalten)  
for /f "tokens=1* delims=: " %%i in ('dsget group %1 -desc ^| findstr "Owner"') do set "Owner=%%j"  
:: Dateinamen (ohne Leerzeichen + ".txt") erstellen  
set "File=%Owner: =%.txt"  
:: Gruppennamen ermitteln (steht nach "CN" und "=" und vor ",")  
for /f "tokens=2 delims==," %%i in (%1) do set "Group=%%i"  
:: Gruppeninfo in Datei schreiben
setlocal enabledelayedexpansion
:: Owner nur beim Erstellen der Datei eintragen
if not exist "%File%" >>"%File%" echo Owner: %Owner%  
>>"%File%" echo Gruppe %Group%:  
endlocal
:: Gruppenmitglieder ermitteln und eintragen
for /f "tokens=2 delims==," %%i in ('dsget group %1 -members') do >>"%File%"  echo - %%i  
:: Leerzeile eintragen
>>"%File%" echo(  
:: Rücksprung in das Hauptprogramm
goto :eof
Grüße
bastla
narthan
narthan 22.01.2013 um 12:45:51 Uhr
Goto Top
Hey bastla!

Danke für den Quellcode, allerdings füllt der die Datei nicht so aus wie erhofft.
Er erstellt eine Datei die folgenden Inhalt hat:

Owner: 
Gruppe :

Gruppe :

Gruppe :

Gruppe :

Gruppe :

Gruppe :

Gruppe :

Gruppe : 

Allerdings ohne Werte. face-sad
Während die Batch ausgeführt wird, kommt auch bei jeder Zeile die gleiche Fehlermeldung, allerdings konnte ich nicht richtig sehen welche, weil das so schnell durchgelaufen ist (glaube etwas mit dsget und Zielobjekt).

Grüße face-smile
bastla
bastla 22.01.2013 um 13:03:17 Uhr
Goto Top
Hallo narthan!

Einen Batch solltest Du auch nicht per Doppelklick, sondern aus einer CMD-Shell starten (oder zumindest eine Zeile
pause
unmitelbar vor dem Ende - also hier vor Zeile 5 - verwenden) ...
Schau Dir vor allem an, ob Dein Eintrag für "Pfad,Domain" richtig ist.

Grüße
bastla
narthan
narthan 22.01.2013 um 13:11:30 Uhr
Goto Top
Hallo!

Zitat von @bastla:
Hallo narthan!

Einen Batch solltest Du auch nicht per Doppelklick, sondern aus einer CMD-Shell starten (oder zumindest eine Zeile
pause
> 
unmitelbar vor dem Ende - also hier vor Zeile 5 - verwenden) ...

Ok hab ich gemacht, dann kommt folgende Fehlermeldung:

Geben Sie "dsget /?" ein, um die Hilfe anzuzeigen.Die Datei ""CN" kann nicht gefunden werden.  
Fehler bei dsget:Der Wert für "Zielobjekt für diesen Befehl" hat ein falsches Format.  
Geben Sie "dsget /?" ein, um die Hilfe anzuzeigen.Fehler bei dsget:Der Wert für "Zielobjekt für diesen Befehl"  
 hat ein falsches Format.

Diese tritt wiederholt für jede Zeile auf.


Schau Dir vor allem an, ob Dein Eintrag für "Pfad,Domain" richtig ist.

Hab ich nochmal überprüft, aber der Pfad ist definitiv korrekt. :/

Gruß zurück!
bastla
Lösung bastla 22.01.2013, aktualisiert am 25.04.2014 um 09:53:15 Uhr
Goto Top
Hallo narthan!

Da ja der von "dsquery" gelieferte LDAP-Pfad bereits unter Anführungszeichen steht, sind die in der Zeile 3 zusätzlich Gesetzten leider etwas viel des Guten face-sad - versuch es mit ohne:
for /f "delims=" %%a in ('dsquery group "Pfad,Domain" -limit 400') do call :ProcessGroup %%a
Zur Sicherheit solltest Du noch Zeile 10 durch
set "Owner="  
for /f "tokens=1* delims=: " %%i in ('dsget group %1 -desc ^| findstr "Owner"') do set "Owner=%%j"  
if not defined Owner echo %1 - kein Owner & goto :eof
ersetzen.
... und wie gesagt: Batches testest Du am besten direkt aus einer CMD-Shell (und wenn's wo klemmt, mit "echo on" anstatt "echo off"); wenn Du dann noch vorweg in den Eigenschaften des CMD-Fensters (Register "Layout") die Höhe der "Fensterpuffergröße" auf den Maximalwert von 9999 gesetzt hast, kannst Du in aller Ruhe nach oben scrollen und Dir sowohl Befehle als auch Ausgaben der einzelnen Batch-Zeilen ansehen ...

Grüße
bastla
narthan
narthan 23.01.2013 aktualisiert um 08:40:53 Uhr
Goto Top
Guten Morgen bastla!

Zitat von @bastla:
Hallo narthan!

Da ja der von "dsquery" gelieferte LDAP-Pfad bereits unter Anführungszeichen steht, sind die in der Zeile 3
zusätzlich Gesetzten leider etwas viel des Guten face-sad - versuch es mit ohne:
for /f "delims=" %%a in ('dsquery group "Pfad,Domain" -limit
> 400') do call :ProcessGroup %%a
> 


Herzlichsten Dank, du warst mir eine sehr große Hilfe und es funktioniert tadellos. face-smile

Achja, die Zeile 10 musste ich auch durch deinen Code noch ersetzen, sonst waren noch dutzend andere Gruppen in den .txt Dateien, die gar nichts mit dem Owner zu tun hatten.

Bis zum nächsten Mal,
Grüße face-smile