Mit LDIFDE Informationen aus LDAP auslesen und mit Batch weiterverarbeiten
Es wird versucht, die AD-Daten mit LDIFDE auszulesen, in eine temporäre Datei zu schreiben und diese dann so auszulesen, dass die gewünschten Werte in einer Batchdatei als Variablen weiterverarbeitet werden können. Dabei sollen Umlaute und Sonderzeichen unterstützt werden. Die erzeugten Variablen werden anschließend in eine HTML und eine TXT-Datei geschrieben, welche dem Outlook als Signatur untergeschoben werden kann.
Tags: LDAP, LDIFDE, Unicode, Active Directory, AD, Batch, Outlook, Signatur, Umlaute, Findstr, type
Die Batch liegt auf einem zentralen Share und wird dort auch augerufen, also per UNC-Pfad.
Wer die LDIF-Ausgaben kennt, weiß, dass ich hier erst einmal Leerzeichen entfenen muss. Mit Hilfe des Threads hier (leerzeichen am anfang und ende einer batch Variablen entfernen (trim in php)) konnte ich dem aber abhelfen. Das habe ich nun bereits:
Die Informationen in der LDIF sehen alle so aus (User ist ein Testuser, Restdaten habe ich abgeändert, um es zu anonymisieren ;) ):
Mit Absicht habe ich den Namen und die Firma mit etwas mehr Sonderzeichen und Umlauten versehen, als das wohl wirklich der Fall ist.
Nun meine Fragen:
- Sobald ein "&" in den Firmennamen kommt, kann ich das nicht weiterverarbeiten, wie löse ich das am einfachsten (so, dass auch Umlaute kein Problem sind). Der Fehler tritt wohl bei der Loopverarbeitung ab ":loop1" auf, vermutlich im Zusammenhang mit den Anführungszeichen.
- die beiden Loops sind zwar ziemlich nett, aber ich möchte nicht für jede Variable einen neuen Doppelloop anlegen und umbenennen. Geht das auch so, dass ich alle Variablen zunächst auslese und anschließend der Reihe nach durch diese Loop-Leerzeichenprüfung schicke?
Falls es relevant ist, die zu findenden Inhalte in der TXT sind folgende:
telephoneNumber:
facsimileTelephoneNumber:
company:
streetAddress:
wWWHomePage:
mail:
postalCode:
info:
Danke euch
Tags: LDAP, LDIFDE, Unicode, Active Directory, AD, Batch, Outlook, Signatur, Umlaute, Findstr, type
Die Batch liegt auf einem zentralen Share und wird dort auch augerufen, also per UNC-Pfad.
Wer die LDIF-Ausgaben kennt, weiß, dass ich hier erst einmal Leerzeichen entfenen muss. Mit Hilfe des Threads hier (leerzeichen am anfang und ende einer batch Variablen entfernen (trim in php)) konnte ich dem aber abhelfen. Das habe ich nun bereits:
@echo off
set dc=dc1.domain.intern
set programpath=\\dc1\deploy$\AutoSignature
if exist "%userprofile%\%username%.txt" del "%userprofile%\%username%.txt"
"%programpath%\ldifde.exe" -f "%userprofile%\%username%.txt" -s %dc% -r "(userPrincipalName=%username%@%userdnsdomain%)"
if not exist "%userprofile%\%username%.txt" goto NOTXT
For /F "tokens=2 delims=:" %%a in ('find "company: " "%userprofile%\%username%.txt"') Do @Set Firma=%%a
if "%Firma%"=="" GOTO NOENTRY
set var1="%Firma%"
:loop1
if "%var1:~0,1%"==" " set "var1=%var1:~1%" & goto :loop1
:loop2
if "%var1:~-1%"==" " set "var1=%var1:~0,-1%" & goto :loop2
echo %var1%
pause
EXIT
:NOTXT
echo Es ist keine Textdatei vorhanden
pause
exit
:NOENTRY
echo Ein Eintrag fehlt
pause
exit
Die Informationen in der LDIF sehen alle so aus (User ist ein Testuser, Restdaten habe ich abgeändert, um es zu anonymisieren ;) ):
dn: CN=Bloßner\, Jürgen,OU=Benutzer,OU=FIRMA,DC=Domain,DC=intern
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
c: DE
l: Nürnberg
st: Bayern
postalCode: 90419
telephoneNumber: +49(0)911-999-88
facsimileTelephoneNumber: +49(0)911-999-30
givenName:: SsO8cmdlbg==
1pbnRlcm4=
instanceType: 4
whenCreated: 20120413135039.0Z
whenChanged: 20120413135710.0Z
uSNCreated: 2821005
memberOf: CN=Mitarbeiter,OU=Gruppen,OU=FIRMA,DC=Domain,DC=intern
uSNChanged: 2821131
co: Deutschland
company: Blubber & Rüsselsheimer GmbH & Co. KG
.... (geht noch weiter)
Mit Absicht habe ich den Namen und die Firma mit etwas mehr Sonderzeichen und Umlauten versehen, als das wohl wirklich der Fall ist.
Nun meine Fragen:
- Sobald ein "&" in den Firmennamen kommt, kann ich das nicht weiterverarbeiten, wie löse ich das am einfachsten (so, dass auch Umlaute kein Problem sind). Der Fehler tritt wohl bei der Loopverarbeitung ab ":loop1" auf, vermutlich im Zusammenhang mit den Anführungszeichen.
- die beiden Loops sind zwar ziemlich nett, aber ich möchte nicht für jede Variable einen neuen Doppelloop anlegen und umbenennen. Geht das auch so, dass ich alle Variablen zunächst auslese und anschließend der Reihe nach durch diese Loop-Leerzeichenprüfung schicke?
Falls es relevant ist, die zu findenden Inhalte in der TXT sind folgende:
telephoneNumber:
facsimileTelephoneNumber:
company:
streetAddress:
wWWHomePage:
mail:
postalCode:
info:
Danke euch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 183506
Url: https://administrator.de/contentid/183506
Ausgedruckt am: 05.11.2024 um 08:11 Uhr
22 Kommentare
Neuester Kommentar
moin,
klitschkokleiner Gegenfragenkatalog...
ich weiß das ein 1biteinzeiler gegen ein 32zeiler bescheiden aussieht, aber warum nicht trotzdem und genau deshalb?
klitschkokleiner Gegenfragenkatalog...
Mit Absicht habe ich den Namen und die Firma mit etwas mehr Sonderzeichen und Umlauten versehen, als das wohl wirklich der Fall ist.
Du weißt schon, das man üblicherweise einen fetten Bogen um Sonderzeichen in der AD macht und willst das trotzdem bauen?Falls es relevant ist, die zu findenden Inhalte in der TXT sind folgende:
telephoneNumber:
facsimileTelephoneNumber:
company:
streetAddress:
wWWHomePage:
mail:
postalCode:
info:
dsquery user -limit 0|dsget user -tel -fax -office -bla -blub -anything ?
Salve,
ich fang mal von hinten an..
Gruß
ich fang mal von hinten an..
PS: Vielen Dank, dass ihr euch zu dieser unchristlichen Feierabendzeit noch zu einer Antwort durchringen konntet, weiß ich zu schätzen
Sag ich mal so - schau mal, was in diesem Administrator.de genannten Forum in den letzten Tagen, Wochen und Monaten so an hochgradigen Fragen hier liegen gelassen wurde, da ist "sowas" eher Anspruchsvoll.- Dann welche Daten fehlen dir denn beim DSget /?
- und vielleicht auch wozu?
- mit dsget /dsquery holst du pro user eine Zeile raus, die genau die daten hat, die du willst und mit kleinen Tricks kannst du jeden &%*,?ß wert in einer so erzeugten Spalte verwerten.
- Last but not least..Ich mach ja manche Sachen auch über den User, aber verbiegen von Daten in der Ad, mach ich lieber selber (damit spiele ich auch %username% an)
Gruß
Hallo snakerl!
Mein Hinweis auf CSVDE bezog sich eigentlich darauf, dass die Zerlegung einer Zeile aus einer CSV-Datei einfacher ist, als die zig Zeilen einer LDIFDE-Ausgabe abzugrasen ...
Hinsichtlich des "&" würde es schon mal helfen, so lange wie möglich (und so früh wie möglich - siehe Zeile 9 Deines ersten Ansatzes) die Variablenwerte unter Anführungszeichen zu verwenden - daher also
Die Ausgabe selbst kannst Du dann mit
"entschärfen" ...
Auch immer ein Thema hinsichtlich der Sonderzeichenbehandlung: Vorweg Codepage auf 1252 setzen:
Wenn Du übrigens die Zeile 9 etwas variierst, hast Du zumindest das Leerzeichen vorneweg gleich mal vom Hals:
Grüße
bastla
Mein Hinweis auf CSVDE bezog sich eigentlich darauf, dass die Zerlegung einer Zeile aus einer CSV-Datei einfacher ist, als die zig Zeilen einer LDIFDE-Ausgabe abzugrasen ...
Hinsichtlich des "&" würde es schon mal helfen, so lange wie möglich (und so früh wie möglich - siehe Zeile 9 Deines ersten Ansatzes) die Variablenwerte unter Anführungszeichen zu verwenden - daher also
For /F "tokens=2 delims=:" %%a in ('find "company: " "%userprofile%\%username%.txt"') Do Set "Firma=%%a"
if "%Firma%"=="" GOTO NOENTRY
set "var1=%Firma%"
setlocal enabledelayedexpansion
echo !var1!
endlocal
Auch immer ein Thema hinsichtlich der Sonderzeichenbehandlung: Vorweg Codepage auf 1252 setzen:
chcp 1252 >nul
For /F "tokens=1* delims=: " %%a in ('find "company: " "%userprofile%\%username%.txt"') Do Set "Firma=%%b"
bastla
Hallo snakerl!
Schön, wenn's hilft ...
Hinsichtlich der "problemlosen" Ausgabe von Batch-Sonderzeichen wie "&" verlasse ich mich ganz auf da), und was das Vermeiden des führenden Leerzeichens angeht, wird dieses einfach als Delimiter definiert - da jede Eigenschaft am Anfang der Zeile ja ohne Leerzeichen angegeben ist, wird in der Schleife daraus "
Grüße
bastla
Schön, wenn's hilft ...
Hinsichtlich der "problemlosen" Ausgabe von Batch-Sonderzeichen wie "&" verlasse ich mich ganz auf da), und was das Vermeiden des führenden Leerzeichens angeht, wird dieses einfach als Delimiter definiert - da jede Eigenschaft am Anfang der Zeile ja ohne Leerzeichen angegeben ist, wird in der Schleife daraus "
%%a
" und wegen der Token-Angabe "1*
" wird danach nicht mehr getrennt, sodass alles nach dem ersten Doppelpunkt bzw Leerzeichen (aufeinanderfolgende Delimiter werden in "for
"-Schleifen nur als ein einziges Trennzeichen interpretiert) als "%%b
" zur Verfügung steht ...Grüße
bastla
Hallo snakerl!
Wäre VBS für Dich eine Option?
Grüße
bastla
Die Inhalte stehen auch immer an anderen Stellen, wenn z. B. Inhalte nicht gefüllt sind im AD (z. B. "Fax"), dann wird dieser Punkt nicht in der CSV/LDIF Ausgabe angegen (facsimileTelephoneNumber).
Das wäre das kleinere Problem (der Feldinhalt ergibt sich ja aus der Feldliste in Zeile 1), aber die "unsaubere" Ausgabe (es werden nur Felder, welche zumindest ein Komma enthalten, unter Anführungszeichen ausgegeben, nicht aber solche mit enthaltenen Leerzeichen) hatte ich nicht bedacht - das macht die Zerlegung (per "for %%i
" oder per "call
" mit "shift
" im Unterprogramm) dann doch sehr unhandlich ... Wäre VBS für Dich eine Option?
Grüße
bastla
Hallo snakerl!
Zu "
Grüße
bastla
Wenn Interesse besteht, ich würde das Teil gerne wieder veröffentlichen, vielleicht hilft es ja jemanden
Wäre ein schöner Abschluss des Threads (dessen Titel Du dann vielleicht noch etwas ergänzen könntest, damit Dein Script leichter gefunden werden kann) ...Zu "
findstr
": Eine automatische Konvertierung von Unicode (wie zB durch "type
") fehlt da tatsächlich - aber ohne weitere TEMP-Datei sollte sich das trotzdem machen lassen:type altedatei.txt|findstr
bastla
Hallo snakerl!
Ein wenig vermisse ich in Deinem Script das Auslesen des AD ...
Nur so am Rande:
<code">:MAKEDIR
If exist %SIGPATH% goto SAVE_SIG
If exist %APPDATA%\Microsoft mkdir %SIGPATH% && goto SAVE_SIG
mkdir %APPDATA%\Microsoft
mkdir %SIGPATH%
REM ==========================================
REM Fertige Backup der alten Signatur(en) an
REM ==========================================
:SAVE_SIG
If not exist %SIG_BACKUP% mkdir %SIG_BACKUP%
XCOPY /I /T /Y /E %SIGPATH%\* %SIG_BACKUP%\%datum%_%zeit%
XCOPY /I /Y /E %SIGPATH%\* %SIG_BACKUP%\%datum%_%zeit%
RD /Q /S %SIGPATH%
REM ==========================================
REM Erstelle den Ordner "Signatures" und setze
REM den Zeichensatz um, zur korrekten Handhabung
REM der Umlaute
REM ==========================================
:GENERATE
If not exist %SIGPATH% mkdir %SIGPATH%
ließe sich reduzieren auf
Sowohl "
Grüße
bastla
Ein wenig vermisse ich in Deinem Script das Auslesen des AD ...
Nur so am Rande:
<code">:MAKEDIR
If exist %SIGPATH% goto SAVE_SIG
If exist %APPDATA%\Microsoft mkdir %SIGPATH% && goto SAVE_SIG
mkdir %APPDATA%\Microsoft
mkdir %SIGPATH%
REM ==========================================
REM Fertige Backup der alten Signatur(en) an
REM ==========================================
:SAVE_SIG
If not exist %SIG_BACKUP% mkdir %SIG_BACKUP%
XCOPY /I /T /Y /E %SIGPATH%\* %SIG_BACKUP%\%datum%_%zeit%
XCOPY /I /Y /E %SIGPATH%\* %SIG_BACKUP%\%datum%_%zeit%
RD /Q /S %SIGPATH%
REM ==========================================
REM Erstelle den Ordner "Signatures" und setze
REM den Zeichensatz um, zur korrekten Handhabung
REM der Umlaute
REM ==========================================
:GENERATE
If not exist %SIGPATH% mkdir %SIGPATH%
ließe sich reduzieren auf
:MAKEDIR
REM ==========================================
REM Fertige Backup der alten Signatur(en) an
REM ==========================================
If exist %SIGPATH% xcopy /ey %SIGPATH%\* %SIG_BACKUP%\%datum%_%zeit%\
RD /Q /S %SIGPATH%
md %SIGPATH%
md
" als auch "xcopy
" erstellen bei Bedarf die gesamte Pfadstruktur ...Grüße
bastla
Hallo snakerl!
Eigentlich warte ich ja noch auf die Endfassung ...
... aber
ließe sich zB auch so schreiben:
- auch, weil es entweder
oder
heißen sollte ...
Grüße
bastla
Eigentlich warte ich ja noch auf die Endfassung ...
... aber
REM ==========================================
REM Schleife zum Beenden der Outlook.exe
REM ==========================================
:STOP_OUTLOOK
echo.
TaskList /FI "IMAGENAME eq OUTLOOK.EXE" 2>NUL | Find "OUTLOOK.EXE" >NUL
IF ERRORLEVEL == 1 (
GOTO START
) ELSE (
GOTO Loop
)
:Loop
echo.
echo.
echo.
echo Der Prozess "OUTLOOK.EXE" ist noch nicht beendet.
echo Bitte beenden Sie Outlook, bevor Sie fortfahren!
echo.
pause
goto STOP_OUTLOOK
REM ==========================================
REM Schleife zum Beenden der Outlook.exe
REM ==========================================
:STOP_OUTLOOK
echo.
TaskList /FI "IMAGENAME eq OUTLOOK.EXE" 2>NUL | Find "OUTLOOK.EXE" >NUL || GOTO START
echo.
echo.
echo.
echo Der Prozess "OUTLOOK.EXE" ist noch nicht beendet.
echo Bitte beenden Sie Outlook, bevor Sie fortfahren!
echo.
pause
goto STOP_OUTLOOK
IF ERRORLEVEL 1
if %ERRORLEVEL%==1
Grüße
bastla