-
Notifications
You must be signed in to change notification settings - Fork 0
/
OwnerOf.cmd
135 lines (130 loc) · 6.2 KB
/
OwnerOf.cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<!-- : CMD-Script : Show Ownership of a FileObject
:: Demo-Script: Show Owner
::───────────────────────────────────────────────────────────{ CodePage: 850 }──
:: on other codePage you don't see a line: ···german Verison···
::
:: Don't use DIR /Q since the ownership info may be clipped
:: and also localisation and custom-format makes hard to got back right token.
::
:: This is the german Version · Script by Mäx 2022
::
:: Wieder einmal ist es nicht möglich, einen Standart-CMD-Befehl im Script zu
:: benutzen, das kennen wir bereits von TIME und DATE wo wir besser auf WMIC
:: zurückgreifen. Auch bei der Option /Q vom DIR-Befehl werden wir dazu ge-
:: zwungen ein wenig mehr Aufwand betreiben zu müssen.
::
::─────────────────{ set Debug to see whats happens }───────────────────────────
@echo off %debug%
::─────────────────{ set Error, cause SETLOCAL did not, but reset }─────────────
verify Error 2>nul
setLocal enableExtensions enableDelayedExpansion
if errorLevel 1 goTo NoExt
::──────────────────────────{ Parameter to the Script should be a FileObject }──
set "P="
set "P=%~f1"
if not defined P goTo:ShowUsage
if not exist "%P%" goTo:ShowUsage
call:StartCheck %P%
echo;
timeout -1
exit /b 0
::───────────{ Purose of the Script and Usage of }──────────────────────────────
:ShowUsage
mode 73
for /L %%a in (1,1,15) do echo;
echo; ─────────────────────────────────────────────────────────────────────
echo; Don't use DIR /Q since the ownership info may be clipped.
echo;
echo; Usage: %~n0 ^<FileObject^>
echo; · german Version:
echo; ─────────────────────────────────────────────────────────────────────
echo; Der Befehl DIR /Q generiert eine voll lokalisierte Ausgabe,
echo; welche nur durch die System-Einstellung eingestellt werden kann.
echo; Sich aber vorallem nicht einfach von der Kommandozeile bestimmt
echo; werden kann, um eine brauchbar formatierte Ausgabe für ein Skript
echo; zu erhalten.
echo;
echo; Batch-Skript Programmier kenne es bereits von DATE und TIME
echo; wo ebenfalls WMIC bemüht werden muss, um eine stehts brauchbare
echo; Zeitmarke für Logbuch-Dateien generieren zu können, welche un-
echo; abhängig von der Lokaliserung auf jedem Windows-System laufen
echo; soll.
echo;
echo; Dieses Demo-Skript zeigt wie WMIC genutzt werden kann,
echo; um nun auch den DIR /Q Befehl zu ersetzen.
echo;
echo; Das Skript erwartet als Start-Parameter ein Ordner oder Datei.
echo; Benutze Drag ^& Drop wenn Du das Skript nicht aus der CMD-Ein-
echo; gabeaufforderung aufrufst.
echo;
echo;
::──────────────────────────────────────────────────────────────────────────────
:: Spezial-Zeichen generien:
:: BS = Backspace = Lösche Zeichen links
:: CR = Carrier Return = Wagenrücklauf (ohne Zeilensprung)
prompt $H$S
call set T="Tokens=1,3"
for /F %T% %%a in ('for /F %%b in ^('copy /z "%~f0" nul'^) do %%b 2^>nul') do (
set "BS=%%a"
set "CR=%%b"
)
prompt
::────────────{ You may enter a File Object now }───────────────────────────────
:FragObjekt
set "P="
set /P "P=.%BS% Datei-Object: "
if not defined P goTo:EoF
if not exist "%P%" (
echo;
echo; Ist das Laufwerk vielleicht nicht bereit?
echo; Zum abbrechen bitte nichts eingeben,
echo; also nur die Eingabe-Taste drücken!
echo;
goTo:FragObjekt
)
call:StartCheck %P%
echo;
timeout -1
exit /b 0
::──────────────────{ Main-Programm }───────────────────────────────────────────
:StartCheck
set "FSO="
call set "FSO=%~f1"
call set "FOA=%~a1"
echo; %FOA% | find /i "-" >NUL && set "Obj= Datei"
echo; %FOA% | find /i "D" >NUL && set "Obj=Ordner"
Title %Obj%-Besitzer von "%~nx1" ist ...
echo;
echo; %Obj%: %~nx1
::───{ This is only needful to come in a shorter line for FOR /F & WMIC }───────
set "wmicPath=Win32_LogicalFileSecuritySetting"
set "a_RR=/resultRole:Owner"
set "a_AC=/assocClass:Win32_logicalFileOwner"
set "a_RC=/resultClass:Win32_SID"
set "Assoc=assoc !a_RR! !a_AC! !a_RC!"
set "WMI=wmic path %wmicPath% where Path^="%FSO:\=\\%" %Assoc%"
set FP="skip=2 tokens=*"
for /F %FP% %%a in ('%WMI%') do call:Splice "%%a"
goTo:EoF
::──────────────────{ Splice WMIC Output }──────────────────────────────────────
:Splice
call set "Shredd=%~1"
call set Shredded="%Shredd: =·%"
for /F "delims=· tokens=12,10,13" %%a in (%Shredded%) do (
echo; Owner: %%b\%%a
echo; SID: %%c
)
goTo:EoF
::────────{ No CMD-Ext.Error Message in a PopUpWindow }─────────────────────────
:NoExt
echo:
set "cmd=mode 52,8&color 4e&echo:"
set "cmd=%cmd%&echo: Sorry this Script don't support your System,"
set "cmd=%cmd%&echo: cause your System don't support Cmd-Extensions!"
set "cmd=%cmd%&echo:"
set "cmd=%cmd%&echo: Fehler: System-Befehlserweiterung nicht möglich."
set "cmd=%cmd%&echo:"
set "cmd=%cmd%&Pause >nul"
start "Can't run", "cmd /C %cmd%"
pause
exit /b 1