Иногда в 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
В итоге я сохранил имя пользователя с помощью непривилегированного пакетного файла, который затем породил новый привилегированный пакетный файл, который считывал имя пользователя и использовал его. Работает.