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
GELÖST

CMD-Batch, Stringzerlegung, String in Token teilen und letztes Token bei unbekannter Anzahl von Token finden

Frage Entwicklung Batch & Shell

Mitglied: Viewfinder

Viewfinder (Level 1) - Jetzt verbinden

15.12.2012, aktualisiert 03:46 Uhr, 3435 Aufrufe, 6 Kommentare

Guten Morgen allseits,
ich hänge irgendwie fest und wäre für ein paar Ideen dankbar. Sorry vorweg. Es wird vermutlich keine Live-Diskusion. Ich sitze hier auf einer EDGE-Leitung in UTC+7. Gut das ich kein Administrator bin.
Meine Frage basiert auf der extrem komfortablen Ausgabe von "icacls.exe". Ich möchte den Inhalt der Ausgabe nach logischen Token trennen. Die Verarbeitung des Strings ist mir im Original nicht eindeutig genug.

Ziel

Zerlegung der Ausgabe "icacls "Objekt"" in Tokens mit logisch zusammen hängendem Inhalt. Das letzte Token bildet die Rechte zum Objekt ab und wird in Folge "[GroupLast]" genannt. Es soll leicht erkennbar und moeglichst performant getrennt werden. Grundlage ist die Ausgabe von "icacls.exe". Loesung muss auf CMD.exe basieren.

Stringbeispiele

F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]
USER:[GroupLast]

Logisch abgeschlossene Komponenten

1. USER: existiert immer (als Voraussetzung)
2. [Group1]; kann existieren
3. [Group2] ... [Group*]; kann existieren
4. [GroupLast]; existiert immer (als Voraussetzung)

Anmerkung

- Ueberfluessiges MS-Gelaber wird gefiltert
- Die Pfadausgabe wird eleminiert durch Variablenmanipulation
- Variablenersetzung mit "][" fuehrt nicht zum Ziel
- Ausgabe von *:*"[GroupLast]" erfolgt immer und an letzter Stelle
- Anzahl von [Group*] variiert
- Inhalt von [Group*] ist variabel
- Inhalt von [GroupLast] ist variabel
- "tokens=*" liefert Reststring (Rest nach Leerzeichenorgie)
- "delims=:" liefert originale Tokens
- "[GroupLast]" soll separiert werden
Es geht ausschliesslich um das Separieren von "[GroupLast]" zur Weiterverarbeitung.
Die Rechte sollen von der Rechteverteilung getrennt werden.

Loesungsansatz

01.
@echo off 
02.
setlocal 
03.
pushd %~dp0 
04.
setlocal enabledelayedexpansion 
05.
 
06.
set "object=F:\Public\Projects\WWW\testbasis\script-local\exembles" 
07.
 
08.
FOR /F "tokens=* useback" %%B in (`icacls "%object%"^|findstr /R /C:":(.*.)"`) DO ( 
09.
	set B=%%B 
10.
	set B=!B:%object% =! 
11.
	set B=!B:^(=[! 
12.
	set B=!B:^)=]! 
13.
	echo Ausgabe: !B! 
14.
	echo          Gruetze ist jetzt Pudding mit Nuessen und Rosinen. 
15.
	echo Wunsch:  Nuesse links und Rosinen rechts raus. 
16.
	For /F "tokens=1-2 delims=:" %%C in ('echo !B!') DO ( 
17.
		echo Pudding            %%C 
18.
		echo                    Nuesse und Rosinen %%D 
19.
		echo                    WIE weiter oder anderst^? 
20.
		)) 
21.
 
22.
setlocal disabledelayedexpansion 
23.
popd 
24.
endlocal 
25.
goto :eof
Hoffentlich habe ich alle Prämissen genannt und es kostet nicht zu viele Nerven.
Mit freundlichen Grüßen Viewfinder
Mitglied: Viewfinder
15.12.2012 um 09:36 Uhr
Geübt in Selbsunterhaltung mal der erste Ansatz. Ich hoffe das diejenigen, welche jetzt im Schlaf der Gerechten von Geschenkverpackung träumen, bei Erwachen mit frischen Elan doch noch über eine Lösung mittels Token nachdenken.

Erste unbefriedigende Lösung

- verhafte Nüsse und Rosinen in Variable
- verschenke Nüsse, behalte Rosinen

Eine Lösung über Tokens wäre etwas algemein gültiger, leichter lesbar und vermutlich performanter. Sie ist dann auch auf andere Beispiele einsetzbar.
Lebkuchen für alle, sogar mit Zuckerguß.

01.
@echo off 
02.
setlocal 
03.
pushd %~dp0 
04.
setlocal enabledelayedexpansion 
05.
 
06.
set "object=F:\Public\Projects\WWW\testbasis\script-local\exembles" 
07.
 
08.
for /F "tokens=* useback" %%B in (`icacls "%object%"^|findstr /R /C:":(.*.)"`) do ( 
09.
	set B=%%B 
10.
	set B=!B:%object% =! 
11.
	set B=!B:^(=[! 
12.
	set B=!B:^)=]! 
13.
	echo Ausgabe: !B! 
14.
	echo          Gruetze ist jetzt Pudding mit Nuessen und Rosinen. 
15.
	echo          Nuesse links und Rosinen rechts raus. 
16.
	For /F "tokens=1-2 delims=:" %%C in ('echo !B!') do ( 
17.
		echo Pudding            %%C 
18.
		echo                    Nuesse und Rosinen %%D 
19.
		echo                    WIE weiter oder anderst^? 
20.
		echo. 
21.
		echo Klaeglicher Versuch: 
22.
		echo -------------------- 
23.
		set "RightsObject=%%D" 
24.
		set "RightsObject=!RightsObject:[OI]=!" 
25.
		set "RightsObject=!RightsObject:[CI]=!" 
26.
		set "RightsObject=!RightsObject:[IO]=!" 
27.
		set "RightsObject=!RightsObject:[NP]=!" 
28.
		set "RightsObject=!RightsObject:[I]=!" 
29.
		echo Nicht wirklich Updatefest und irgendwie unbefriedigend, 
30.
		echo Praesente Rechte zum Objekt sind: !RightsObject! 
31.
		)) 
32.
 
33.
setlocal disabledelayedexpansion 
34.
popd 
35.
endlocal 
36.
goto :eof
Bitte warten ..
Mitglied: bastla
15.12.2012, aktualisiert um 13:10 Uhr
Hallo Viewfinder!

Soferne ich das richtig intrepretiere, soll doch aus der von "icacls" erzeugten User-/Gruppenliste - Beispiel am Prompt:
C:\Users\Admin>icacls C:\Windows 
C:\Windows NT SERVICE\TrustedInstaller:(F) 
           NT SERVICE\TrustedInstaller:(CI)(IO)(F) 
           NT-AUTORITÄT\SYSTEM:(M) 
           NT-AUTORITÄT\SYSTEM:(OI)(CI)(IO)(F) 
           VORDEFINIERT\Administratoren:(M) 
           VORDEFINIERT\Administratoren:(OI)(CI)(IO)(F) 
           VORDEFINIERT\Benutzer:(RX) 
           VORDEFINIERT\Benutzer:(OI)(CI)(IO)(GR,GE) 
           ERSTELLER-BESITZER:(OI)(CI)(IO)(F) 
 
1 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler auf 
getreten. 
 
C:\Users\Admin>
der User/die Gruppe aus der letzten Zeile ermittelt werden:
for /F "delims=: " %%B in ('icacls "%object%"^|findstr /R /C:":(.*.)"') do set "GroupLast=%%B"
Wenn ich wirklich aus dem String
F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]
nur "GroupLast" erhalten wollte, würde ich das so versuchen (unter der Voraussetzung, dass "GroupLast" keine Leerzeichen enthält):
01.
set "Zeile=F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]" 
02.
set "Zeile=%Zeile:USER:=%" 
03.
for %%i in (%Zeile:[= %) do for /f "delims=]" %%B in ("%i") do set "GroupLast=%%B"
Grüße
bastla
Bitte warten ..
Mitglied: Viewfinder
16.12.2012 um 03:28 Uhr
Hallo bastla,
danke das Du Dir Zeit genommen hast und fuer den Gedanken Deiner Forschleife. Variablenersetzung im Befehlssatz ist mir neu. Wie ich an Deiner Antwort sehen kann, habe ich einen Fehler in der Beschreibung gemacht. Zu viele "!" eben. Eventuell gibt es auch keine Lösung. Ich versuche mich mal in einer kürzeren und präziseren Weise.
- Schwerpunkt "letzte Gruppe von Inhalten als Token"
- Diese Inhalte bilden die Rechte ab
- Als Beispiel und aktuelles Problem dient die "Ausgabe icacls"

Schauen wir uns die Ausgabe an. Man kann nicht behaupten, das es ein Produkt einer Weihnachtsfeier ist. Und wo wir schon dabei sind, bietet NT-AUTORITÄT\SYSTEM: gleich den nächsten Anlass zur Freude.
So nun im zweiten Anlauf konkret und nicht allgemein. Der nicht benötigten Müll ist bereits entsorgt.

Was bleibt, ist Folgendes:
01.
USER:[I][OI][CI][NP][IO][DENY][lange,Liste,mit,Permissions]
Das "DENY" ist mir bei der Marketing gerechten Ausgabe durchgeruscht. Sorry! Die gewünschte Lösung wäre jetzt etwas in der folgenden Art.
01.
USER:[I]:[OI][CI][NP][IO]:[DENY][lange,Liste,mit,Permissions]
Token 1 - Username, Handling kein Problem da Delimiter existiert
Token 2 - keine eigenen Rechte, Handling kein Problem ist eindeutig
Token 3 - Vererbungslogig, Handling aufwendig aber kein Problem da für die Kombinationen eigene Filter notwendig sind
Token 4 - Auflistung der Rechte, letztes Token

Problemstellung
Ea kann sein, das ich eine Schneise schlagen will, wo es keinen Wald gibt. Die bisher gefundenen Lösungen basieren auf dem Löschen der Inhalte von Token 1-3. Diese Token sind einduetig, solange wie der Username nicht mit einer Pfadangabe identisch ist oder aus einer Datei ausgelesen (Problematik Umlaute-Sonderzeichen) werden muss.
Es bleibt das letzte Token. Das "DENY" beschreibt das eigentliche Problem. Mit nur einer Standalone-Maschine kann ich nicht jeden Problemfall rekonstruieren. Die Trennung in logische Token, sollte mich von diesem Problem befreien.

Doch mit der von den Rechten gesonderten Ausgabe des "DENY" hat sich die Sache für icacls erledigt. Delinquent hat zu früh geschrien. Es sind jetzt zwei letzte Token.

Ich werde jetzt mal mit Deinem Vorschlag in dieser Richtung weiter basteln und sehen was übersichtlicher und oder performanter ist.
01.
for %%i in (!VAR:[= !) do for /f "delims=]" %%B in ("%%i") do set "GroupLast=%%B"
Eventuell läßt sich die Ersetzung mit einem Rutsch erledigen. Morgen ist Holiday und danach sollte die Lösung fertig sein. Dann gibs hier die Auflösung und einen Gelöst-Haken.

Mit freundlichen Grüßen
Viewfinder
Bitte warten ..
Mitglied: Viewfinder
16.12.2012, aktualisiert um 07:04 Uhr
fertisch
Der Rohentwurf steht und morgen ist frei.

@bastla
Danke für die Hilfe. Es hat mir viel suchen erspart.
Die Lösung der Variablenersetzung in "For" ist komfortabler und übersichtlicher. Performance-Einbußen konnte ich im Hunderstel-Sekunden-Bereich nicht ermitteln. Doch wenn ich der Schleife auch nur ein echo mit der neuen Variable hinzufüge, bricht die Geschichte um 30% ein.


So noch schnell die Gesamtlösung und dann Mittach:
01.
:ENVIRONMENT 
02.
@echo off 
03.
setlocal 
04.
pushd %~dp0 
05.
setlocal enabledelayedexpansion 
06.
 
07.
	 
08.
:ROUTINE 
09.
call :INHERITANCE_NODES 
10.
 
11.
	 
12.
:EXIT 
13.
setlocal disabledelayedexpansion 
14.
popd 
15.
endlocal 
16.
goto :eof 
17.
 
18.
 
19.
:INHERITANCE_NODES 
20.
setlocal 
21.
cls 
22.
echo. 
23.
echo   =================================================================== 
24.
echo   =              Find Inheritance Parent directory                  = 
25.
echo   =================================================================== 
26.
echo. 
27.
echo   Dieses Tool dient der Analyse von vergebenen Berechtigungen unter 
28.
echo   EINEM Erbknoten. Der naechst hoehere Erbknoten wird ermittelt und 
29.
echo   seine Struktur ab dem Verzeichnis der Abfrage ausgewiesen. Voraus- 
30.
echo   setzung ist eine entsprechende Berechtigung. 
31.
echo. 
32.
echo   Einsatz: 
33.
echo   Ermittlung des Verzeichnisses, welches als "Parent Directory" im 
34.
echo   Sinn von "icacls /save" verstanden werden kann. Dieses Tool ist 
35.
echo   Bestandteil eines etwas komplexeren Projektes. 
36.
echo. 
37.
echo   Begriffe: 
38.
echo   Eine Protokollierung ist noch nicht eingearbeitet. Doch die 
39.
echo   vorliegende Ausgabe beinhaltet bereits wesentliche Informationen. 
40.
echo   Zuornungen beziehen sich auf das Berechtigungsystem. 
41.
echo   Benutzer:         Weist den User zur jeweiligen Berechtigung aus 
42.
echo   Quelle Vererbung: Verzeichnis dem die jeweiligen Berechtigungen 
43.
echo                     zugeordnet sind 
44.
echo   Permission:       Gruppierung von Berechtigungen 
45.
echo   Object:           Das betrachtete Objekt selbst. Hier immer Verzeichnis 
46.
echo   Directories:      Alle dem "Object" untergeordneten Verzeichnisse 
47.
echo   Files:            Alle dem "Object" untergeordneten Dateien 
48.
echo   Sub Directories:  Dem "Object" direkt untergeordnete Verzeichnisse 
49.
echo   Sub Files:        Dem "Object" direkt untergeordnete Dateien 
50.
echo   --------------------------------------------------------------------- 
51.
echo   Bitte Verzeichnis zu dem der Erbknoten ermittelt werden soll eingeben 
52.
echo. 
53.
set /p "FilePath=" 
54.
set "ParentDir=%FilePath%" 
55.
echo   Pruefverzeichnis: %FilePath% 
56.
echo. 
57.
	:FindParent 
58.
set "Parent=0" 
59.
FOR /F "tokens=* useback" %%A in (`icacls "%ParentDir%"^|findstr /R /C:":(.*.)"`) DO ( 
60.
	set A=%%A 
61.
	set A=!A:%ParentDir% =! 
62.
	set A=!A:^(=[! 
63.
	set A=!A:^)=]! 
64.
	For /f "tokens=2 delims=:" %%1 in ('echo !A!^|findstr /L /C:"[I]["') DO ( 
65.
		set "Parent=1" 
66.
67.
	set "Objects=" 
68.
	IF "!Parent!" EQU "0" ( 
69.
		For /F "tokens=1-2 delims=:" %%B in ('echo !A!') do ( 
70.
			for /f %%1 in ('echo %%C^|findstr /V /L /C:"[IO]["') do ( 
71.
				set "Objects=Object;" 
72.
73.
			for /f %%2 in ('echo %%C^|findstr /L /C:"[CI]["') do ( 
74.
				for /f %%a in ('echo %%C^|findstr /L /C:"[NP]["') do ( 
75.
					set "Objects=!Objects!Sub Directories;" 
76.
77.
				for /f %%a in ('echo %%C^|findstr /V /L /C:"[NP]["') do ( 
78.
					set "Objects=!Objects!Directories;" 
79.
80.
81.
			for /f %%3 in ('echo %%C^|findstr /L /C:"[OI]["') do ( 
82.
				for /f %%a in ('echo %%C^|findstr /L /C:"[NP]["') do ( 
83.
					set "Objects=!Objects!Sub Files;" 
84.
85.
				for /f %%a in ('echo %%C^|findstr /V /L /C:"[NP]["') do ( 
86.
					set "Objects=!Objects!Files;" 
87.
88.
89.
			set "Permissions=%%C" 
90.
			for %%4 in ([OI] [CI] [IO] [NP] [I]) do set "Permissions=!Permissions:%%4=!" 
91.
			echo   Benutzer:         %%B 
92.
			echo   Quelle Vererbung: %ParentDir% 
93.
			echo   Permission:       !Permissions! 
94.
			echo                     Recht gilt fuer: !Objects! 
95.
			echo. 
96.
97.
98.
99.
if "%Parent%" EQU "1" ( 
100.
	for /F "tokens=* useback" %%I in (`echo %ParentDir%`) do ( 
101.
		set "ParentDir=%%~dpI" 
102.
		set "ParentDir=!ParentDir:~0,-1!"  
103.
104.
	goto :FindParent 
105.
106.
echo   Erbknoten:     %ParentDir% 
107.
endlocal 
108.
goto :eof
Dank an alle die sich bemüht haben
Bitte warten ..
Mitglied: pieh-ejdsch
16.12.2012, aktualisiert 21.12.2012
moin Viewfinder,

den ElternOrnder bekommst Du leichter so:
01.
for %%i in ("%ParentDir%\..") do if "%%~fi" neq "%ParentDir%" (set "ParentDir=%%~fi" &goto :FindParent) else goto :EndeimGelaende
Gruß Phil
Bitte warten ..
Mitglied: Viewfinder
18.12.2012 um 06:39 Uhr
@pieh-ejdsch
Danke Phil, leider funktionieren meine Computer nicht so gut wie das Forum hier. Die "CD.."- Variante ist bei mir weder unter Windows7 noch unter XP3 anwendbar. Die Variable kommt als Text zurück. Egal in welcher For- Variante. Ich schau mich mal um, ob es hier schon etwas in Richtung Wunderwelt CMD gibt. Wenn nicht mache ich zu diesem Thema einen Beitrag auf. Ewventuell läßt sich das Problem ja klären.

Mit freundlichen Grüßen
Viewfinder
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
CMD-Batch hilfe: Dateiname zu txt (2)

Frage von Syscore64 zum Thema Batch & Shell ...

Windows Installation
CMD-Batch Programmstart Befehle (1)

Frage von timsen96 zum Thema Windows Installation ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Windows Tools
Suche Batch Scheduler (.bat .cmd .exe) (8)

Frage von hf1965 zum Thema Windows Tools ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...