Wie behalte ich in einer W10-Batchdatei den aktuellen %username% bei, wenn sie mit erhöhten Rechten ausgeführt wird?

Wie behalte ich in einer W10-Batchdatei den aktuellen %username% bei, wenn sie mit erhöhten Rechten ausgeführt wird?

Manchmal möchte ich in Windows 10 einem Standardbenutzer vorübergehend Administratorrechte erteilen, beispielsweise wenn ich als dieser Benutzer angemeldet bin und arbeiten möchte, ohne wiederholt das Kennwort eines Administratorbenutzers eingeben zu müssen.

Früher habe ich die Batchdatei mit dem Namen des Standardbenutzers fest codiert. Heute kam mir in einem pandemiebedingten Aussetzer die Idee, %username% zu verwenden:

@echo
net localgroup administrators %username% /add
echo %username% set to Administrator
echo See next report to verify
echo.
net user %username%
pause

Wenn ich diese Batchdatei „als Administrator“ ausführe, enthält die Variable %username% den Benutzernamen des Administrators anstelle des aktuellen Benutzers.

Ich blieb meinem Wahn treu und dachte, ich könnte %username% in einer Variablen speichern, eine oft zitierte Routine zur Selbsterhöhung ausführen und dann die Arbeit erledigen.

@echo off
set un=%username%

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

net localgroup administrators %un% /add
echo %un% set to Administrator
echo See next report to verify
echo.
net user %un%
pause

Gleiches Ergebnis wie vorher. Ich hätte daran denken sollen, dass Batchdateien nicht zeilenweise ausgeführt werden.

Bevor ich mich noch tiefer in die Materie vertiefe und lerne, wie man den Wert %username% in eine Datei schreibt oder andere unfundierte Vermutungen anstellt (Pushing/Popping scheint nicht zu existieren), hoffe ich, dass mir hier jemand den richtigen Weg weisen kann.


@DavidPostill schlug vor, dass ich setlocal und endlocal probiere. Das Beispiel bei ss64.com lautet:

@Echo off
SETLOCAL
::Standard commission
Set _Commission=20
Echo Standard commission %_Commission%

::Premium commission
SETLOCAL
Set _Commission=30
Echo Premium commission %_Commission%

::back to Standard commission
ENDLOCAL
Echo %_Commission%

Indem ich die Platzierung der beiden SETLOCALs und des einen ENDLOCAL im Beispiel emuliere, sieht mein Skript nun wie folgt aus:

:: REM --add the following to the top of your bat file--
@echo off
SETLOCAL
set un=%username%
echo At this point the variable un should contain the standard username
echo.
echo Currrent user name: %un%
echo.
pause
SETLOCAL

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

echo Elevation complete. 
echo.
echo After elevation the current username is %un%
echo.
echo Press Enter to see if ENDLOCAL restores the original un value
pause
ENDLOCAL
echo Current user name: %un%
:: net user %un%
echo.
pause

Nach dem Ausführen der Batchdatei ist dies das erste angezeigte Befehlsfenster. Bisher enthält die Variable %un% den Benutzernamen des Standardbenutzers.

erstes Befehlsfenster

Nachdem ich die Eingabetaste gedrückt habe, werde ich aufgefordert, das Kennwort eines Administratorbenutzers einzugeben, was ich tue.

Nun erscheint das folgende Befehlsfenster, das den Code, der den Benutzernamen des Standardbenutzers angezeigt hat, teilweise wiederholt und dann den Rest ausführt. Auch nach ENDLOCAL ist die Variable %un% der Benutzername des Administratorbenutzers.

Bildbeschreibung hier eingeben

Danke schön.

Antwort1

Ich habe den Benutzernamen schließlich mithilfe einer Batchdatei ohne erhöhte Rechte gespeichert, die dann eine neue Batchdatei mit erhöhten Rechten erstellt hat, die den Benutzernamen eingelesen und verwendet hat. Funktioniert.

verwandte Informationen