Как сохранить текущее %имя пользователя% в пакетном файле W10 при запуске с повышенными привилегиями?

Как сохранить текущее %имя пользователя% в пакетном файле W10 при запуске с повышенными привилегиями?

Иногда в Windows 10 мне нужно временно предоставить права администратора стандартному пользователю, например, когда я вошел в систему как этот пользователь и хочу работать, не вводя пароль администратора каждый раз.

Раньше я бы жестко закодировал пакетный файл с именем стандартного пользователя. Сегодня, в пандемическом провале, мне пришла в голову идея использовать %username%:

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

Когда я запускаю этот пакетный файл «как администратор», переменная %username% содержит имя пользователя-администратора вместо имени текущего пользователя.

Продолжая свои бредовые размышления, я решил, что могу сохранить %username% в переменной, запустить широко цитируемую процедуру самоповышения прав, а затем выполнить работу.

@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

Тот же результат, что и раньше. Мне следовало помнить, что пакетные файлы не выполняются построчно.

Прежде чем я углублюсь в дебри и научусь записывать значение %username% в файл или попробую другие необоснованные догадки (похоже, что push/popping не существует), я надеюсь, что кто-нибудь здесь сможет указать мне правильное направление.


@DavidPostill предложил мне попробовать setlocal и endlocal. Пример на ss64.com:

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

Эмулируя размещение двух SETLOCAL и одного ENDLOCAL в примере, мой скрипт теперь будет выглядеть следующим образом:

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

После запуска пакетного файла появляется начальное командное окно. Пока что переменная %un% содержит имя стандартного пользователя.

начальное командное окно

После нажатия Enter мне предлагается ввести пароль администратора, что я и делаю.

Теперь появляется следующее командное окно, частично повторяющее код, который отображал имя пользователя стандартного пользователя, а затем выполняющее остальную часть. Даже после ENDLOCAL переменная %un% является именем пользователя администратора.

введите описание изображения здесь

Спасибо.

решение1

В итоге я сохранил имя пользователя с помощью непривилегированного пакетного файла, который затем породил новый привилегированный пакетный файл, который считывал имя пользователя и использовал его. Работает.

Связанный контент