Ich muss es ein zweites Mal ausführen (manchmal 3-4 Mal), um die SID tatsächlich zu drucken
Ihre Stapeldatei verwendet keine setlocal oder delayedexpansion, daher funktioniert sie nur, wenn %user%
sie in der Umgebung definiert ist, die die Stapeldatei aufruft .
Aufgrund des Fehlens von setlocal
Variablen, die in der Batchdatei festgelegt sind, werden sie in die aufrufende Befehlsshell übertragen und können dann beim nächsten Aufruf der Batchdatei verwendet werden.
In der Stapeldatei (beim ersten Aufruf) kann% user% nicht in der Stapeldatei verwendet werden, da in einem Codeblock ( if
) darauf verwiesen wird :
Wenn eine Stapeldatei ausgeführt wird, analysiert der Befehlsprozessor (CMD.exe) vollständige Zeilen und vollständige zusammengesetzte Befehle . Variablen werden nur einmal durch ihre Werte ersetzt, BEVOR die Befehle der Zeile ausgeführt werden.
Wenn Sie die verzögerte Erweiterung aktivieren :
Die verzögerte Erweiterung bewirkt, dass Variablen in einer Batchdatei zur Ausführungszeit und nicht zur Analysezeit erweitert werden. Diese Option wird mit dem Befehl SETLOCAL EnableDelayedExpansion aktiviert.
Wenn Sie die Batchdatei zum ersten Mal aufrufen, %user%
ist sie zur Ausführungszeit nicht definiert, und der WMIC
Befehl schlägt mit dem in der Frage angegebenen Fehler fehl.
Das zweite Mal, wenn Sie die Batchdatei aufrufen, %user%
wird definiert (mit dem Wert aus der vorherigen Ausführung und Ihre Batchdatei scheint zu funktionieren.
Beachten Sie, dass Ihre Batch-Datei bei der zweiten Eingabe eines anderen Benutzernamens die falsche SID zurückgibt (dabei wird der Benutzername verwendet, der beim ersten Aufrufen eingegeben wurde).
Sie müssen die folgenden Änderungen vornehmen:
Fügen Sie setlocal enabledelayedexpansion
am Anfang der Batch-Datei hinzu.
Ersetzen %util%
durch!util!
Geänderte Batch-Datei:
@echo off
setlocal enabledelayedexpansion
if %errorLevel% == 0 (
SET Users="dir C:\Users\ /B"
for /F "tokens=2,*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /v ProfileImagePath /s ^| find "REG_EXPAND_SZ" ^| findstr /v /i "\\windows\\ \\system32\\"') do (
echo %%~nb
echo.
)
echo.
SET /p "util=Type the username"
echo !util!
for /f "delims= " %%a in ('"wmic path win32_useraccount where name='!util!' get sid"') do (
if not "%%a"=="SID" (
set _sid=%%a
goto :loop_end
)
)
) else (
for /f "delims= " %%a in ('"wmic path win32_useraccount where name='%USERNAME%' get sid"') do (
if not "%%a"=="SID" (
set _sid=%%a
goto :loop_end
)
)
)
:loop_end
echo %%_sid%%=%_sid%
endlocal
Beispiel Verwendung:
> test
DavidPostill
ntp
Administrator
Type the usernameDavidPostill
DavidPostill
%_sid%=S-1-5-21-1699878757-1063190524-3119395976-1000
Weitere Lektüre