有时在 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% 也是管理员用户的用户名。
谢谢你。
我最终使用未提升的批处理文件保存了用户名,然后生成了一个新的提升的批处理文件,该文件读取用户名并使用它。作品。