在 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

我最終使用未提升的批次文件保存用戶名,然後生成一個新的提升的批次文件,該文件讀取用戶名並使用它。作品。

相關內容