248

我希望我的批处理文件只运行提升。如果未提升,请为用户提供一个选项以将批处理重新启动为提升。

我正在编写一个批处理文件来设置系统变量,将两个文件复制到Program Files位置,然后启动驱动程序安装程序。如果 Windows 7/Windows Vista 用户(已启用UAC,即使他们是本地管理员)在没有右键单击并选择“以管理员身份运行”的情况下运行它,他们将获得“拒绝访问”复制这两个文件并写入系统变量.

如果用户实际上是管理员,我想使用命令自动重新启动批处理。否则,如果他们不是管理员,我想告诉他们他们需要管理员权限才能运行批处理文件。我正在使用xcopy复制文件并使用REG ADD来写入系统变量。我正在使用这些命令来处理可能的 Windows XP 机器。我在这个主题上发现了类似的问题,但没有涉及将批处理文件重新启动为提升的问题。

4

17 回答 17

348

有一种无需使用外部工具的简单方法 - 它在Windows 7、8、8.1、10 和 11上运行良好,并且也向后兼容(Windows XP 没有任何 UAC,因此不需要提升 -在这种情况下,脚本将继续执行)。

查看这段代码(我的灵感来自 NIronwolf 在线程Batch File - “Access Denied” On Windows 7?中发布的代码? ),但我已经改进了它 - 在我的版本中,没有创建和删除任何目录检查管理员权限):

::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
 @echo off
 CLS
 ECHO.
 ECHO =============================
 ECHO Running Admin shell
 ECHO =============================

:init
 setlocal DisableDelayedExpansion
 set cmdInvoke=1
 set winSysFolder=System32
 set "batchPath=%~dpnx0"
 rem this works also from cmd shell, other than %~0
 for %%k in (%0) do set batchName=%%~nk
 set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
 setlocal EnableDelayedExpansion

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

:getPrivileges
  if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
  ECHO.
  ECHO **************************************
  ECHO Invoking UAC for Privilege Escalation
  ECHO **************************************

  ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
  ECHO args = "ELEV " >> "%vbsGetPrivileges%"
  ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
  ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
  ECHO Next >> "%vbsGetPrivileges%"
  
  if '%cmdInvoke%'=='1' goto InvokeCmd 

  ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
  goto ExecElevation

:InvokeCmd
  ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
  ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"

:ExecElevation
 "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
 exit /B

:gotPrivileges
 setlocal & cd /d %~dp0
 if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)

 ::::::::::::::::::::::::::::
 ::START
 ::::::::::::::::::::::::::::
 REM Run shell as admin (example) - put here code as you like
 ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
 cmd /k

该脚本利用了NET FILE需要管理员权限的事实,errorlevel 1如果您没有它,则返回。提升是通过创建一个脚本来实现的,该脚本重新启动批处理文件以获得权限。这会导致 Windows 显示 UAC 对话框并要求您提供管理员帐户和密码。

我已经在 Windows 7、8、8.1、10、11 和 Windows XP 上对其进行了测试——它适用于所有人。优点是,在起点之后您可以放置​​任何需要系统管理员权限的内容,例如,如果您打算重新安装并重新运行 Windows 服务以进行调试(假设 mypackage.msi 是一个服务安装程序包) :

msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice

如果没有这个提权脚本,UAC 会向您询问 3 次管理员用户名和密码 - 现在您在开始时只被询问一次,并且仅在需要时询问您。


如果您的脚本只需要显示一条错误消息并在没有任何管理员权限而不是自动提升的情况下退出,则更简单:您可以通过在脚本开头添加以下内容来实现此目的:

@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
  ECHO "RUN AS ADMINISTRATOR"  to run this batch. Exiting... & ECHO. &
  PAUSE & EXIT /D)
REM ... proceed here with admin rights ...

这样,用户必须右键单击并选择“以管理员身份运行”。如果脚本检测到管理员权限,则该脚本将在REM语句之后继续执行,否则退出并出现错误。如果您不需要PAUSE,只需将其删除。 重要提示: NET FILE [...] EXIT /D)必须在同一行。它在这里以多行显示,以提高可读性!


在一些机器上,我遇到了问题,这些问题已经在上面的新版本中解决了。一个是由于不同的双引号处理,另一个问题是由于 UAC 在 Windows 7 机器上被禁用(设置为最低级别),因此脚本一次又一次地调用自己。

我现在通过删除路径中的引号并稍后重新添加它们来解决此问题,并且我添加了一个额外的参数,该参数在脚本以提升的权限重新启动时添加。

双引号被以下内容删除(详细信息在这里):

setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion

然后,您可以使用 访问路径!batchPath!。它不包含任何双引号,因此"!batchPath!"稍后在脚本中说是安全的。

线

if '%1'=='ELEV' (shift & goto gotPrivileges)

检查脚本是否已被VBScript脚本调用以提升权限,从而避免无休止的递归。它使用删除参数shift


更新:

  • 为了避免在Windows 10.vbs中注册扩展,我在上面的脚本中替换了该行;还按照 Stephen(单独的答案)和 Tomáš Zato(评论)的建议添加以将脚本目录设置为默认值。
    "%temp%\OEgetPrivileges.vbs"

    "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
    cd /d %~dp0

  • 现在脚本尊重传递给它的命令行参数。感谢 jxmallet、TanisDLJ 和 Peter Mortensen 的观察和启发。

  • 根据 Artjom B. 的提示,我对其进行了分析并替换SHIFTSHIFT /1,它保留了%0参数的文件名

  • 添加del "%temp%\OEgetPrivileges_%batchName%.vbs":gotPrivileges清理部分(如mlt建议的那样)。如果您并行运行不同的批次,添加%batchName%以避免影响。请注意,您需要使用for才能利用高级字符串函数,例如%%~nk,它仅提取文件名。

  • 优化脚本结构,改进(添加的变量vbsGetPrivileges现在随处引用,允许轻松更改文件的路径或名称,只有.vbs在需要提升批处理时才删除文件)

  • 在某些情况下,提升需要不同的调用语法。如果脚本不起作用,请检查以下参数:
    set cmdInvoke=0
    set winSysFolder=System32
    将第一个参数更改为set cmdInvoke=1并检查是否已经解决了问题。它将添加cmd.exe到执行提升的脚本中。
    或者尝试将第二个参数更改为winSysFolder=Sysnative,这在 64 位系统上可能会有所帮助(但在大多数情况下不是必需的)。(ADBailey 已经报道了这一点)。“Sysnative”仅在从 32 位脚本宿主启动 64 位应用程序时需要(例如,Visual Studio 构建过程,或从另一个 32 位应用程序调用脚本)。

  • 为了更清楚地解释参数的解释方式,我现在将其显示为P1=value1 P2=value2 ... P9=value9. 如果您需要用双引号将路径等参数括起来,这尤其有用,例如"C:\Program Files".

  • 如果您想调试 VBS 脚本,您可以将//X参数添加到 WScript.exe 作为第一个参数,如此处所建议(它针对 CScript.exe 进行了描述,但也适用于 WScript.exe)。

  • @MiguelAngelo 提供的错误修复:batchPath 现在可以在 cmd shell 上正确返回。这个小脚本test.cmd显示了不同之处(在 cmd.exe 中运行,然后在 Windows 资源管理器中双击运行):

    @echo off
    setlocal
    set a="%~0"
    set b="%~dpnx0"
    if %a% EQU %b% echo running shell execute
    if not %a% EQU %b% echo running cmd shell
    echo a="%~0", b="%~dpnx0" 
    pause
    

有用的链接:

于 2012-09-04T13:31:50.100 回答
56

正如 jcoder 和 Matt 所提到的,PowerShell 使它变得简单,它甚至可以嵌入到批处理脚本中,而无需创建新脚本。

我修改了马特的脚本:

:: Check privileges 
net file 1>NUL 2>NUL
if not '%errorlevel%' == '0' (
    powershell Start-Process -FilePath "%0" -ArgumentList "%cd%" -verb runas >NUL 2>&1
    exit /b
)

:: Change directory with passed argument. Processes started with
:: "runas" start with forced C:\Windows\System32 workdir
cd /d %1

:: Actual work
于 2014-07-09T23:22:02.427 回答
38

我这样做:

NET SESSION
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
(Do whatever you need to do here)
EXIT

这种方式很简单,只使用 Windows 默认命令。如果您需要重新分发批处理文件,那就太好了。

CD /d %~dp0将当前目录设置为文件的当前目录(如果还没有,则不管文件在哪个驱动器中,这要归功于该/d选项)。

%~nx0返回带有扩展名的当前文件名(如果您不包含扩展名并且文件夹中有同名的exe,它将调用该exe)。

这个帖子回复太多了,不知道能不能看到我的回复。

无论如何,我发现这种方式比其他答案中提出的其他解决方案更简单,我希望它对某人有所帮助。

于 2016-06-07T02:40:59.280 回答
30

我正在使用 Matt 的出色答案,但是在运行提升的脚本时,我发现我的 Windows 7 和 Windows 8 系统之间存在差异。

在 Windows 8 上提升脚本后,当前目录将设置为C:\Windows\system32. 幸运的是,通过将当前目录更改为当前脚本的路径,有一个简单的解决方法:

cd /d %~dp0

注意:用于cd /d确保驱动器号也已更改。

要对此进行测试,您可以将以下内容复制到脚本中。在任一版本上正常运行以查看相同的结果。以管理员身份运行并查看 Windows 8 中的差异:

@echo off
echo Current path is %cd%
echo Changing directory to the path of the current script
cd %~dp0
echo Current path is %cd%
pause
于 2013-08-03T22:35:00.167 回答
26

Matt 有一个很好的答案,但它去掉了传递给脚本的任何参数。这是我保留参数的修改。我还合并了 Stephen 对 Windows 8 中工作目录问题的修复。

@ECHO OFF
setlocal EnableDelayedExpansion

::net file to test privileges, 1>NUL redirects output, 2>NUL redirects errors
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto START ) else ( goto getPrivileges ) 

:getPrivileges
if '%1'=='ELEV' ( goto START )

set "batchPath=%~f0"
set "batchArgs=ELEV"

::Add quotes to the batch path, if needed
set "script=%0"
set script=%script:"=%
IF '%0'=='!script!' ( GOTO PathQuotesDone )
    set "batchPath=""%batchPath%"""
:PathQuotesDone

::Add quotes to the arguments, if needed.
:ArgLoop
IF '%1'=='' ( GOTO EndArgLoop ) else ( GOTO AddArg )
    :AddArg
    set "arg=%1"
    set arg=%arg:"=%
    IF '%1'=='!arg!' ( GOTO NoQuotes )
        set "batchArgs=%batchArgs% "%1""
        GOTO QuotesDone
        :NoQuotes
        set "batchArgs=%batchArgs% %1"
    :QuotesDone
    shift
    GOTO ArgLoop
:EndArgLoop

::Create and run the vb script to elevate the batch file
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "cmd", "/c ""!batchPath! !batchArgs!""", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs" 
exit /B

:START
::Remove the elevation tag and set the correct working directory
IF '%1'=='ELEV' ( shift /1 )
cd /d %~dp0

::Do your adminy thing here...
于 2015-02-12T00:43:35.767 回答
24

您可以使用psexec-h选项让脚本自行调用以运行提升。

我不确定您将如何检测它是否已经以提升的方式运行......也许只有在出现“拒绝访问”错误时才使用提升的权限重试?

或者,您可以简单地使用xcopyand的命令reg.exe来运行psexec -h,但如果最终用户每次都需要输入密码(或者如果您在脚本中包含密码则不安全),这对最终用户来说会很烦人...

于 2011-08-12T19:04:29.317 回答
24

如果不是,我使用 PowerShell 重新启动提升的脚本。将这些行放在脚本的最顶部。

net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~fnx0 %*'"
goto :eof
:run
:: TODO: Put code here that needs elevation

我从@Matt 的回答中复制了“网名”方法。他的答案记录得更好,并且有错误消息等。这样做的好处是 PowerShell 已在 Windows 7 及更高版本上安装并可用。没有临时 VBScript (*.vbs) 文件,您也不必下载工具。

只要您的 PowerShell 执行权限未锁定,此方法无需任何配置或设置即可工作。

于 2014-09-10T03:28:55.367 回答
15

对于某些将超级机密__COMPAT_LAYER环境变量设置为的程序RunAsInvoker 将起作用。检查此:

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

虽然这样不会有 UAC 提示用户将继续没有管理员权限。

于 2016-03-29T18:55:11.527 回答
9

我写gsudo一个sudofor windows:在当前控制台中提升(没有上下文切换到新窗口),具有凭据缓存(减少 UAC 弹出窗口),并且还提升了PowerShell 命令

如果需要,它允许提升需要管理员权限的命令或整个批处理。只需gsudo 在需要提升的任何内容之前添加即可。

使用 gsudo 提升自身的示例批处理文件:

编辑:新的一个班轮版本,适用于任何 Windows 语言并避免whoami 问题

net session >nul 2>nul & net session >nul 2>nul || gsudo "%~f0" && exit /b || exit /b
:: This will run as admin ::

替代品(原始版本):

@echo off
  rem Test if current context is already elevated:
  whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" 1> nul 2>nul && goto :isadministrator
  echo You are not admin. (yet)
  :: Use gsudo to launch this batch file elevated.
  gsudo "%~f0"
  goto end
:isadministrator
  echo You are admin.
  echo (Do admin stuff now).
:end

安装:

请参阅 gsudo 的实际操作: gsudo 演示

于 2020-01-03T21:18:53.280 回答
9

我最近需要一种用户友好的方法,我根据来自这里和其他地方的贡献者的宝贵见解提出了这个方法。只需将此行放在 .bat 脚本的顶部即可。欢迎反馈。

@pushd %~dp0 & fltmc | find "." && (powershell start '%~f0' ' %*' -verb runas 2>nul && exit /b)

解释:

  • @pushd %~dp0确保与此批处理文件相关的工作目录一致;支持 UNC 路径
  • fltmc如果运行未提升,则输出错误的本机 Windows 命令
  • | find "."使错误更漂亮,并且在提升时不会导致任何输出
  • && (如果我们因为没有被提升而成功出错,请执行此操作...
  • powershell start调用 PowerShell 并调用 Start-Process cmdlet(start是别名)
  • '%~f0'传入此 .bat 文件的完整路径和名称。单引号允许路径/文件名中有空格
  • ' %*'将任何和所有参数传递给这个 .bat 文件。时髦的引用和转义序列可能不起作用,但简单的引用字符串应该。如果不存在参数,则需要前导空格以防止破坏事物
  • -verb runas不要只是开始这个​​过程...... RunAs Administrator!
  • 2>nul如果取消/忽略 UAC 提示,则丢弃 PowerShell 难看的错误输出。
  • &&如果我们成功地用 PowerShell 调用了自己,那么......
    • 注意:如果我们没有获得提升(用户取消 UAC),则&& 允许.bat 在没有提升的情况下继续运行,这样任何需要它的命令都会失败,但其他命令会正常工作。如果您希望脚本简单地退出而不是运行未提升,请将其设置为单个&符号:&
  • exit /b)退出初始 .bat 处理,因为我们不再需要它;我们有一个新的提升进程当前正在运行我们的 .bat。如果 .bat 是从命令行启动的,添加 /b 允许 cmd.exe 保持打开状态...如果双击 .bat 则无效
于 2021-02-10T06:09:57.220 回答
6

如果您不关心参数,那么这里有一个紧凑的 UAC 提示脚本,它只有一行长。它不会传递参数,因为没有万无一失的方法可以处理毒字符的所有可能组合。

net sess>nul 2>&1||(echo(CreateObject("Shell.Application"^).ShellExecute"%~0",,,"RunAs",1:CreateObject("Scripting.FileSystemObject"^).DeleteFile(wsh.ScriptFullName^)>"%temp%\%~nx0.vbs"&start wscript.exe "%temp%\%~nx0.vbs"&exit)

将此行粘贴到@echo off批处理文件中的下方。

解释

net sess>nul 2>&1部分是检查高程的部分。net sess只是net session当脚本没有提升权限时返回错误代码的命令的简写。我从这个 SO answer得到了这个想法。这里的大多数答案都具有net file相同的功能。此命令在许多系统上快速且兼容。

然后由||操作员检查错误级别。如果检查成功,则它会创建并执行一个 WScript,该 WScript 会重新运行原始批处理文件,但在删除自身之前具有提升的权限。


备择方案

WScript 文件是快速可靠的最佳方法,尽管它使用临时文件。以下是一些其他变体及其缺点/优点。

电源外壳

net sess>nul 2>&1||(powershell saps '%0'-Verb RunAs&exit)

优点:

  • 很短。
  • 没有临时文件。

缺点:

  • 减缓。PowerShell 的启动速度可能很慢。
  • 当用户拒绝 UAC 提示时显示红色文本。可以将 PowerShell 命令包装在 atry{...}catch{}中以防止这种情况发生。

Mshta WSH 脚本

net sess>nul 2>&1||(start mshta.exe vbscript:code(close(Execute("CreateObject(""Shell.Application"").ShellExecute""%~0"",,,""RunAs"",1"^)^)^)&exit)

优点:

  • 快速地。
  • 没有临时文件。

缺点:

  • 不可靠的。由于 Windows Defender 将其作为潜在的木马拦截,某些 Windows 10 系统会阻止该脚本运行。
于 2020-07-01T01:44:46.103 回答
5

我将其粘贴在脚本的开头:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.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"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
于 2014-08-11T08:02:42.087 回答
4

虽然不直接适用于这个问题,但因为它想为用户提供一些信息,当我想运行从任务调度程序提升的 .bat 文件时,谷歌把我带到了这里。

最简单的方法是创建 .bat 文件的快捷方式,因为您可以Run as administrator直接从高级属性中设置快捷方式。

从任务计划程序运行快捷方式,运行提升的 .bat 文件。

于 2019-07-24T15:13:59.223 回答
4

使用 PowerShell。

如果 cmd 文件很长,我会使用第一个来要求提升,然后调用执行实际工作的那个。

如果脚本是一个简单的命令,那么所有内容都可能适合一个 cmd 文件。不要忘记在脚本文件中包含路径。

模板:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c " comands or another script.cmd go here "'"

示例 1:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\BIN\x.ps1"'"

示例 2:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "c:\bin\myScript.cmd"'"
于 2020-01-04T19:16:04.170 回答
3

当 CMD 脚本需要管理员权限并且您知道时,将此行添加到脚本的最顶部(紧跟在 any 之后@ECHO OFF):

NET FILE > NUL 2>&1 || POWERSHELL -ex Unrestricted -Command "Start-Process -Verb RunAs -FilePath '%ComSpec%' -ArgumentList '/c \"%~fnx0\" %*'" && EXIT /b

NET FILE检查现有管理员权限。如果没有,PowerShell 将在提升的shell 中重新启动当前脚本(及其参数),并关闭非提升的脚本。

于 2021-09-21T10:19:42.463 回答
0

尝试这个:

@echo off
CLS
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd 
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k

如果您需要有关该批处理文件的信息,请运行 HTML/JS/CSS 片段:

document.getElementsByTagName("data")[0].innerHTML="ElevateBatch, version 4, release<br>Required Commands:<ul><li>CLS</li><li>SETLOCAL</li><li>SET</li><li>FOR</li><li>NET</li><li>IF</li><li>ECHO</li><li>GOTO</li><li>EXIT</li><li>DEL</li></ul>It auto-elevates the system and if the user presses No, it just doesn't do anything.<br>This CANNOT be used to create an Elevated Explorer.";
data{font-family:arial;text-decoration:none}
<data></data>

于 2020-02-21T19:52:47.343 回答
-4

以下解决方案很干净并且效果很好。

  1. 从https://www.winability.com/download/Elevate.zip下载 Elevate zip 文件

  2. 在 zip 中,您应该找到两个文件:Elevate.exe 和 Elevate64.exe。(后者是本机 64 位编译,如果您需要,虽然常规 32 位版本 Elevate.exe 应该可以在 32 位和 64 位版本的 Windows 上正常工作)

  3. 将文件 Elevate.exe 复制到 Windows 始终可以找到它的文件夹中(例如 C:/Windows)。或者你最好可以复制到你打算保存你的 bat 文件的同一个文件夹中。

  4. 要在批处理文件中使用它,只需在要以管理员身份执行的命令前面加上 elevate 命令,如下所示:

 elevate net start service ...
于 2018-09-24T17:29:12.427 回答