WMIC-Fehler: Keine Instanzen verfügbar nach der ersten Ausführung meines Batch-Skripts

1390
user745333

Ich verwende cmd.exe als Administrator und führe dieses Skript aus. Wenn ich es zum ersten Mal ausführen, bekomme ich immer Instances Availableein zweites Mal (manchmal 3-4 mal), um die SID tatsächlich auszudrucken ... warum?

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"  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% 
2

1 Antwort auf die Frage

0
DavidPostill

Ich muss es ein zweites Mal ausführen (manchmal 3-4 Mal), um die SID tatsächlich auszudrucken

Ihre Batchdatei verwendet keine setlocal oder delayedexpansion. Sie funktioniert also nur, wenn %user%sie in der Umgebung definiert ist, in der die Batchdatei aufgerufen wird .

Aufgrund des Fehlens von setlocalVariablen, die in der Stapeldatei enthalten sind, werden diese in die aufrufende Befehls-Shell durchgesickert und sind dann beim nächsten Aufruf der Stapeldatei verwendbar.

Innerhalb der Batchdatei (beim ersten Aufruf) ist% user% in der Batchdatei nicht verwendbar, da in einem Codeblock ( if) darauf verwiesen wird :

Wenn eine Batchdatei ausgeführt wird, analysiert der Befehlsprozessor (CMD.exe) vollständige Zeilen und führt zusammengesetzte Befehle aus . Variablen werden nur einmal durch ihre Werte ersetzt, BEVOR die Befehle der Zeile ausgeführt werden.

Wenn Sie delayedexpansion aktivieren :

Bei einer verzögerten Erweiterung werden Variablen in einer Batchdatei nicht zur Analysezeit, sondern zur Ausführungszeit erweitert. 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 WMICBefehl schlägt mit dem in der Frage angegebenen Fehler fehl.

Beim zweiten Aufruf der Batchdatei %user%wird definiert (mit dem Wert aus der vorherigen Ausführung und Ihre Batchdatei scheint zu funktionieren.)

Wenn Sie beim zweiten Aufruf Ihrer Batch-Datei einen anderen Benutzernamen eingeben, wird die falsche SID zurückgegeben (der Benutzername wird beim ersten Aufruf verwendet).

Sie müssen die folgenden Änderungen vornehmen:

  1. Fügen Sie setlocal enabledelayedexpansionam Anfang der Batchdatei.

  2. Ersetzen %util%durch!util!

Geänderte Batchdatei:

@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 

Verwendungsbeispiel:

> test DavidPostill  ntp  Administrator   Type the usernameDavidPostill DavidPostill %_sid%=S-1-5-21-1699878757-1063190524-3119395976-1000 

Lesen Sie weiter