En un archivo por lotes W10, ¿cómo conservo el %nombre de usuario% actual cuando lo ejecuto en modo elevado?

En un archivo por lotes W10, ¿cómo conservo el %nombre de usuario% actual cuando lo ejecuto en modo elevado?

A veces, en Windows 10 quiero otorgar temporalmente privilegios de administrador a un usuario estándar, como cuando inicio sesión como ese usuario y quiero trabajar sin tener que ingresar repetidamente la contraseña de un usuario administrador.

En el pasado, codificaba el archivo por lotes con el nombre de usuario estándar. Hoy, en un lapso inducido por la pandemia, me vino a la mente la idea de usar %username%:

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

Cuando ejecuto ese archivo por lotes "como administrador", la variable %nombre de usuario% contiene el nombre de usuario del administrador en lugar del usuario actual.

Continuando con mi pensamiento delirante, pensé que podía guardar %nombre de usuario% en una variable, ejecutar una rutina de autoelevación ampliamente citada y luego hacer el trabajo.

@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

Mismo resultado que antes. Debería haber recordado que los archivos por lotes no se ejecutan línea por línea.

Antes de profundizar en la maleza y aprender cómo escribir el valor de% nombre de usuario% en un archivo o probar otras conjeturas no fundamentadas (empujar/hacer estallar no parece existir), espero que alguien aquí pueda indicarme la dirección correcta. .


@DavidPostill me sugirió que probara setlocal y endlocal. El ejemplo en ss64.com es:

@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%

Emulando la ubicación de los dos SETLOCAL y el ENDLOCAL en el ejemplo, mi script ahora se convierte en:

:: 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

Después de ejecutar el archivo por lotes, esta es la ventana de comando inicial que aparece. Hasta ahora, la variable %un% tiene el nombre de usuario del usuario estándar.

ventana de comando inicial

Después de presionar Enter, se me solicita que ingrese la contraseña de un usuario administrador, lo cual hago.

Ahora aparece la siguiente ventana de comando, repitiendo parcialmente el código que mostraba el nombre de usuario del usuario estándar y luego ejecutando el resto. Incluso después de ENDLOCAL, la variable %un% es el nombre de usuario del usuario administrador.

ingrese la descripción de la imagen aquí

Gracias.

Respuesta1

Terminé guardando el nombre de usuario usando un archivo por lotes no elevado que luego generó un nuevo archivo por lotes elevado que leyó el nombre de usuario y lo usó. Obras.

información relacionada