![在 W10 批处理文件中,如何在提升运行时保留当前的 %username%?](https://linux22.com/image/1628346/%E5%9C%A8%20W10%20%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E6%8F%90%E5%8D%87%E8%BF%90%E8%A1%8C%E6%97%B6%E4%BF%9D%E7%95%99%E5%BD%93%E5%89%8D%E7%9A%84%20%E2%80%8B%E2%80%8B%25username%25%EF%BC%9F.png)
有时在 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
我最终使用未提升权限的批处理文件保存了用户名,然后生成了一个新的提升权限的批处理文件,该文件读取并使用了用户名。成功了。