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%

例の 2 つの SETLOCAL と 1 つの 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

最終的には、昇格されていないバッチ ファイルを使用してユーザー名を保存し、その後、ユーザー名を読み取って使用する新しい昇格されたバッチ ファイルを生成しました。動作します。

関連情報