W10 배치 파일에서 승격된 실행 시 현재 %username%을 어떻게 유지합니까?

W10 배치 파일에서 승격된 실행 시 현재 %username%을 어떻게 유지합니까?

때때로 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% 값을 쓰는 방법을 배우거나 다른 무식한 추측을 시도하기 전에(푸시/팝핑은 존재하지 않는 것 같습니다) 여기 누군가가 저에게 올바른 방향을 알려줄 수 있기를 바랍니다. .


@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

결국에는 승격되지 않은 배치 파일을 사용하여 사용자 이름을 저장한 다음 사용자 이름을 읽고 사용하는 새로운 승격된 배치 파일을 생성했습니다. 공장.

관련 정보