winfried-hh
Goto Top

AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten

Hallo in die Runde!

Ich habe eine Ergänzungsfrage zu einem alten Thread von mir.

Ausgangslage ist die Batchdatei, die damals herausgekommen ist:

Chcp 1252
for /d %%a in ("D:\Schuelerdaten\*") do icacls "%%~a" /T /C /grant "%%~nxa":(OI)(CI)F  

Hingrund: In dem Ordner Schuelerdaten befinden sich die einzelnen Schülerordner. Bei diesen sollten die Berechtigungen neu gesetzt werden. Damals war es einfach, der Anmeldename des Schülers entsprach dem Ordnernamen.

Am anderen Standort ist die Lage schwieriger. Der Ordnername entspricht dem Anzeigename des Benutzers, nicht mehr dem eigentlichen Objekt- oder Anmeldenamen. Kann ich die Batchdatei oben so erweitern, dass bei jedem gefundenen Ordner das AD abgefragt wird? Ich gebe den Ordnernamen (%%~nxa, der ja zugleich Anzeigename des Benutzer ist) in die Abfrage hinein und bekomme den eigentlichen Benutzernamen heraus, den ich für die ICACLS-Funktion brauche?

Schöne Grüße von der Elbe!
Winfried

Content-Key: 361446

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

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: 135185
Lösung 135185 17.01.2018 aktualisiert um 15:35:44 Uhr
Goto Top
@echo off &setlocal enabledelayedexpansion
chcp 1252
for /d %%a in ("D:\Schuelerdaten\*") do (  
    for /f "tokens=2 delims=: " %%b in ('dsquery user -Name "%%~nxa" ^| dsget user -sid -L ^| findstr "sid:" 2^>nul') do icacls "%%~a" /T /C /grant *%%b:^(OI^)^(CI^)F  
)
Gruß Sepp
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 13:02:27 Uhr
Goto Top
Das funktioniert leider nicht. Zur Fehlersuche habe ich die Batch etwas abgewandelt:

@echo off &setlocal enabledelayedexpansion
chcp 1252
for /d %%a in ("D:\Schuelerdaten\*") do (  
    echo %%~nxa
    for /f "tokens=2 delims=: " %%b in ('dsquery user -Name "%%~nxa" ^| dsget user -samid -L ^| findstr samid:') do set "username=%%b"  
    if "%username%" NEQ "" (  
        echo %username%
    ) else (
      echo Benutzer für "%%~nxa" nicht im AD gefunden.  
    )
)
pause

Dabei bekomme ich für jedes Verzeichnis folgenden Fehler:

dsgetfehler
(Name geändert)
Mitglied: 135185
135185 17.01.2018 aktualisiert um 13:31:12 Uhr
Goto Top
Wenn du es selber abänderst ohne zu wissen was du damit anstellst kein Wunder, du hast es falsch angepasst und die Ausrufezeichen falsch durch Prozentzeichen ersetzt das kann niemals gehen wegen delayed expansion!! Also nochmal richtig kopieren.

Wurde hier getestet und funktioniert.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 13:31:10 Uhr
Goto Top
Zitat von @135185:

Wenn du es selber abänderst ohne zu wissen was du damit anstellst kein wunder, du hast es falsch angepasst und die Ausrufezeichen durch Prozentzeichen ersetzt!! Also nochmal richtig kopieren.

Wurde hier getestet und funktioniert.

In der ursprünglichen Form von Dir bekomme ich die Meldung
"(CI" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Mitglied: 135185
135185 17.01.2018 um 13:32:18 Uhr
Goto Top
Kopier es einfach nochmal.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 aktualisiert um 13:38:31 Uhr
Goto Top
Zitat von @135185:

Kopier es einfach nochmal.

Jetzt auch in Deiner Originalfassung (hast Du was geändert?):

Verzeichnisdienstobjekt nicht gefunden

bzw. Benutzer für "Oliver Hansen" nicht im AD gefunden.
Mitglied: 135185
135185 17.01.2018 aktualisiert um 13:41:39 Uhr
Goto Top
Hast du die Domäne im ICACLS Befehl eingetragen ?
Mitglied: 135185
135185 17.01.2018 aktualisiert um 13:47:51 Uhr
Goto Top
Habs mal oben auf Verwendung von SIDs angepasst dann brauchst du keine Domäne eintragen.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 13:49:35 Uhr
Goto Top
Zitat von @135185:

Hast du die Domäne im ICACLS Befehl eingetragen ?

Das Suchen des Benutzers im AD ist ja schon das Problem. Ich experimentiere gerade ein wenig direkt im CMD-Fenster:


dsquery user -Name "Oliver Hansen" ^| dsget user -samid -L ^| findstr samid: ergibt den Fehler "dsget" ist ein unbekannter Parameter

Wenn ich die ^ weglasse:
dsquery user -Name "Oliver Hansen" | dsget user -samid -L | findstr samid: liefert das richtiger Ergebnis zurück
Mitglied: 135185
135185 17.01.2018 aktualisiert um 13:57:46 Uhr
Goto Top
Die ^ müssen bei einer FOR-Schleife wegen des Pipe-Symbols rein! Bei einer Ausführung in einer reinen CMD natürlich nicht!

Welches OS verwendest du?

Guckst du ...
screenshot

Ich würde ja das ganze sowieso in Powershell machen wenn man schon einen Windows Server vewendet, da hantiert man ja nicht mit solchen 80er Krücken rum ...
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 14:10:04 Uhr
Goto Top
Zitat von @135185:

Habs mal oben auf Verwendung von SIDs angepasst dann brauchst du keine Domäne eintragen.

Das gibt nun wieder einen anderen Fehler:
Fehler bei dsget:"Zielobjekt für diesen Befehl" fehlt.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 14:15:11 Uhr
Goto Top
Zitat von @135185:

Welches OS verwendest du?

Windows 7 professional x64


Ich würde ja das ganze sowieso in Powershell machen wenn man schon einen Windows Server vewendet, da hantiert man ja nicht mit solchen 80er Krücken rum ...

Damit kenne ich mich nicht mal in Grundzügen aus, daher könnte ich da nur fertigen Code abschreiben.
Mitglied: 135185
135185 17.01.2018 aktualisiert um 14:22:59 Uhr
Goto Top
Dann ist mir alles klar ...mach das am Server die Befehle sind dort vorgesehen.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 aktualisiert um 14:56:21 Uhr
Goto Top
Zitat von @135185:

Dann ist mir alles klar ...mach das am Server die Befehle sind dort vorgesehen.

Ich stelle gerade fest, dass es ohne den Schalter chcp 1252 geht.

Probleme habe ich aber bei Verzeichnissen, zu denen kein Benutzer gefunden wird. Dort tritt nicht etwa die ELSE-Aktion in Kraft, sondern der ICACLS-Befehl wird ausgeführt, allerdings mit dem Benutzer aus der vorherigen Runde.
Mitglied: 135185
135185 17.01.2018 aktualisiert um 15:57:31 Uhr
Goto Top
Ist ergänzt.

Bezgl chcp da hast du wohl beim Speichern des Scripts ein Kodierungsproblem der Datei.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 aktualisiert um 16:02:28 Uhr
Goto Top
Zitat von @135185:

Ist ergänzt.

So in etwa hatte ich es mir in der Zwischenzeit auch gebastelt, allerdings noch mit Protokollierung der nicht bearbeiteten Verzeichnisse:

@echo off &setlocal enabledelayedexpansion
rem chcp 1252
date /T > D:\ICACL-Protokoll.txt
for /d %%a in ("d:\schuelerdaten\*") do (  
    if "!flag!" EQU "1" echo "!dir!" >> D:\ICACL-Protokoll.txt  
    set "dir=%%a"   
    set "flag=1"   
    for /f "tokens=2 delims=: " %%b in ('dsquery user -Name "%%~nxa" ^| dsget user -sid -L ^| findstr sid:') do (  
	set "sid=%%b"  
	icacls "%%~a" /T /C /grant *!sid!:^(OI^)^(CI^)F   
        set "flag=0"   
	)  
)
if "!flag!" EQU "1" echo "!dir!" >> D:\ICACL-Protokoll.txt  

Was ich mich nur frage ist, warum es mit der Codepage-Anweisung nicht geht, ohne aber schon, aber Umlaute trotzdem richtig behandelt werden.
Mitglied: 135185
135185 17.01.2018 aktualisiert um 16:02:56 Uhr
Goto Top
Vermutlich verwendet dein dsget/dsquery auf deinem Windows 7 eine andere Codepage und deswegen kommt es damit nicht klar. Hier auf einem SRV2012R2 kein Problem.
Mitglied: Winfried-HH
Winfried-HH 17.01.2018 um 16:03:11 Uhr
Goto Top
Zitat von @135185:

Vermutlich ist dein dsget/dsquery auf deinem Windows 7 gegen eine andere Codepage kompiliert und deswegen kommt es damit nicht klar. Hier auf einem SRV2012R2 kein Problem.

Ich hatte es jetzt direkt auf dem Server ausgeführt, ist allerdings "nur" ein 2008R2
Mitglied: 135185
135185 17.01.2018 aktualisiert um 16:04:36 Uhr
Goto Top
Naja. noch ein Grund endlich zur Powershell zu switchen, wir leben in 2018 nicht 1980.