很多时候,执行一些需要管理员权限的批处理文件时我们需要右击,然后选择 使用管理员权限运行 后, 批处理文件才能正确运行,如果我们忘记了提升权限而直接运行,这些批处理文件会因为没有权限而报错, 那么有没有办法让批处理文件自己检查权限,并且在没有权限时提示我们是否赋予权限呢
这个方法在 win10 下已经失效了,我推测的原因应该是 windows 内嵌的防毒机制认为, 使用管理员权限执行一个临时文件是危险行为,不用担心,这里还有一个替代方案
stackoverflow 上关于这个问题有一个很好的讨论,有好几个解决方案,总结下来,基本流程是这样:
比较了几个答案之后,我认为 这个答案 的做法最为简单干净,有以下几个理由
我参考其他答案对原本代码做了一些修改,最终的版本及注释如下:
@ECHO OFF
:: 第一行的作用是取消显示输出
:: 检查权限,不输出结果,也不输出错误
NET SESSION 1>NUL 2>NUL
:: 如果没有权限,跳至提升权限段
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
:: 跳至实际需要执行的批处理段
GOTO ADMINTASKS
:: 提升权限段
:ELEVATE
:: 记录当前路径
CD /d %~dp0
:: 使用 javascript 用管理员权限重新执行该批处理文件
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
:: 退出
EXIT
:: 实际需要执行的批处理段
:ADMINTASKS
:: 在下面加入需要管理员权限的定制内容
正常使用时我们可以去掉注释
@ECHO OFF
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
GOTO ADMINTASKS
:ELEVATE
CD /d %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
EXIT
:ADMINTASKS
我们在桌面上创建一个 test.cmd
内容如下
@ECHO OFF
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
GOTO ADMINTASKS
:ELEVATE
CD /d %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
EXIT
:ADMINTASKS
net user
pause
终于我们可以忘记右键选择管理员运行批处理文件了,只是要做一点小小的改造……