如何自动提升批处理文件,以便在需要时从UAC管理员权限请求?


209

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

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

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


2
查看我发布的内容-您不需要任何外部工具,该脚本会自动检查管理员权限,并在需要时自动将其自身提升。
马特

1
请考虑Matt的答案是否会被打勾?在我看来如此。
akauppi,2015年


请在我发布的批处理脚本的注释部分中查看新的Windows 10提示。
马特

4
来自cmd :@powershell Start-Process cmd -Verb runas。从Powershell下降@powershell。这将以提升的权限开始cmd。
BrunoLM

Answers:


20

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

我不确定您如何检测它是否已经以提升的身份运行...也许仅在出现“访问被拒绝”错误时才尝试以提升的权限进行重试?

或者,您可以简单地使用用于的命令,xcopy并且reg.exe始终与一起运行psexec -h,但是如果最终用户每次都需要输入密码(或者如果您在脚本中包括密码,则不安全),这对于最终用户会很烦...


10
感谢您的回复。不幸的是,我认为我无法在Windows Vista / 7工具之外使用任何其他工具,因为这将对我办公室以外的客户开放。我认为我不能合法发行PSExec。
PDixon724

2
是的,我认为您是对的,尽管PSExec现在是Microsoft的工具(因为他们收购了Sysinternals家伙!),EULA确实禁止分发:(
ewall

2
我认为我的选择非常有限。如果我知道如何在VB中进行编码,则可以使它成为带有管理员清单的exe,但是我什至不知道从哪里开始。我想我会在批处理开始时发出警告,如果他们正在运行Windows Vista / 7,请以管理员身份运行。谢谢大家
PDixon724

1
可以免费重新分发,易于集成和学习的另一个第三方工具是AutoIt此页面演示了脚本如何请求提升的特权。
ewall

4
psexec -h不起作用:“无法安装PSEXESVC服务:访问被拒绝。”。您需要已经具有管理员权限才能运行psexec。
尼古拉斯2014年

319

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

签出此代码(我受NIronwolf的代码启发,该代码发布在线程“ 批处理文件”中-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=%~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和Windows XP上对其进行了测试-一切正常。好处是,在起点之后,您可以放置​​任何需要系统管理员特权的东西,例如,如果您打算出于调试目的重新安装并重新运行Windows服务(假设mypackage.msi是服务安装程序包) :

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

如果没有此特权提升脚本,UAC将询问您三次管理员用户名和密码-现在仅在开始时询问您一次,并且仅在需要时询问您。


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

@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)必须在同一行。它在此处以多行显示,以提高可读性!


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

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

双引号将被以下内容删除(详细信息在此处):

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

然后,您可以使用来访问路径!batchPath!。它不包含任何双引号,因此可以"!batchPath!"在脚本的稍后部分安全地声明。

线

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

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


更新:

  • 为了避免.vbsWindows 10中注册扩展名,我在上面的脚本
    "%temp%\OEgetPrivileges.vbs"
    中用替换了该行
    "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
    ;还cd /d %~dp0由Stephen(单独回答)和TomášZato(评论)建议添加,以将脚本目录设置为默认目录。

  • 现在,该脚本支持传递给它的命令行参数。感谢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
    将1st参数更改为,set cmdInvoke=1然后检查是否已解决问题。它将添加cmd.exe到执行高程的脚本中。
    或者尝试将2nd参数更改为winSysFolder=Sysnative,这在64位系统上可能会有所帮助(但在大多数情况下不是必需的)。(ADBailey对此进行了报道)。仅从32位脚本主机启动64位应用程序时才需要“系统”(例如,Visual Studio生成过程或从另一个32位应用程序中调用脚本)。

  • 为了更清楚地说明参数的解释方式,我现在将其显示为P1=value1 P2=value2 ... P9=value9。如果您需要将诸如路径之类的参数括在双引号中(例如),此功能特别有用"C:\Program Files"

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

有用的链接:


9
好的答案,虽然让我有些惊讶,但在某些情况下,您必须做所有这些事情来做某些明显必要的事情。
编码器

50
实际上,Windows批处理语言中显然缺少诸如ELEVATE之类的命令。
马特

2
使用powershell似乎更容易一些,因为它似乎是已批准的脚本编写工具,可以处理更复杂的事情,但是到目前为止,我从来没有费心学习它:(
jcoder 2012年

1
powershell中的语法完全不同(动词-名词语法),但是它使您可以轻松地调用.NET程序集。但是要处理它(签名脚本等)要困难一些。
马特

2
@Matt您可以检查这个拒绝的答案背后是否有真相吗?
Artjom B.

41

正如jcoder和Matt提到的那样,PowerShell使它变得容易,甚至可以将其嵌入批处理脚本中,而无需创建新脚本。

我修改了Matt的脚本:

:: 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

3
没错,如果安装了PowerShell,则可以使用它运行具有高度的批处理文件(感谢您的代码段!)。是的,不需要标签。谢谢您的提示,值得+1 ... :-)
马特(Matt)

2
从cmd调用时,Powershell.exe没有-verb runas选项。如果您已经在PowerShell中,则它确实存在。
阿迪尔·欣迪斯坦

1
我真的很喜欢这种解决方案,对我来说效果很好。在Windows 8.1上,我确实需要:gotPrivileges标签才能起作用。
ShaunO

如果此批处理文件位于UNC路径上的远程位置,则会遇到问题。
Ryan Beesley

我在开始时添加了更改目录,简化了流程并进行了一些清理。工作目录无法通过改变WorkingDirectory参数Start-Process,因为安全原因runas的过程
ceztko

28

我使用的是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

1
好提示,斯蒂芬。因此,脚本应该cd %~dp0以保留其当前路径结尾(我假设这也适用于Win7,因此可以使用相同的命令,尽管仅Win8 +才需要)。为此+1!
马特

2
值得注意的是这是还需要运行Windows 7在我的系统
MEH-UK

1
pushd %~dp0改用...为什么?因为popd
JaroslavZáruba17年

27

我这样做:

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)。

这篇文章有很多回覆,我什至不知道是否能看到我的回覆。

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


4
cd%〜dp0在网络驱动器上不起作用,请改用推入的%〜dp0。
Stavm '16

1
我喜欢这个答案的简单性。最后是使用Jscript的理由!
乔·编码员

1
魔法!非常感谢你。
Daniele Orlando,

1
@Wolf我输入了一个巨大的答案,才意识到我误会了您...我现在明白了您的意思。我将对其进行编辑以包含/d。谢谢朋友:)(PS:也有钢琴家!)
Matheus Rocha

1
这很好用,但是将cd命令移到开始可能是一个好主意(这可以确保该路径也可用于提升的脚本-否则提升的脚本只能从system32运行)。您还应该将net命令重定向到nul以隐藏其输出:net session >nul 2>&1
Nulano

23

马特有一个不错的答案,但是它去除了传递给脚本的所有参数。这是我保留参数的修改。我还针对Windows 8中的工作目录问题合并了Stephen的修复程序。

@ECHO OFF
setlocal EnableDelayedExpansion

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...

1
这是一个有用的答案。但是ECHO UAC.ShellExecute....符合条件, "batchArgs!"不会扩展变量。使用"!batchArgs!"。我的编辑被拒绝,所以我发表了评论。
2015年

1
@fliedonion很好发现!我不确定为什么您的编辑被拒绝,因为它绝对是错字,并且您的修复工作正常。自己进行更改,并在Win 8.1上进行了测试。我们发现所有在那里我使用此代码脚本....
jxmallett

2
使用带引号的参数(例如test.bat "a thing"或)时,脚本损坏"test script.bat" arg1 arg2。现在都固定了。
jxmallett 2015年

我设法打破了它(由于我的错:由于管理员和普通用户没有相同的映射,所以从映射的网络驱动器运行脚本)。仍然:有没有办法查看输出?对我来说,我必须找到.vbs并将/ c更改为/ K,然后手动查看。
Andreas Reiff 2015年

21

如果不是,我使用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的答案中复制了“ net name”方法。他的答案记录得更好,并且包含错​​误消息等。这一优点是已安装PowerShell并在Windows 7及更高版本上可用。没有临时的VBScript(* .vbs)文件,您不必下载工具。

只要您的PowerShell执行权限没有被锁定,此方法就可以在没有任何配置或设置的情况下工作。


当提供一个用引号将引号括起来的空格分隔的参数列表时,该/c %~fnx0 %*'部分似乎将除第一部分之外的所有部分都保留了下来。例如,从test.bat "arg1 arg2 arg3"只有ARG1传递着
萨科酒店距离Mommaerts

看来,无论什么时候,开始处理删除所有双引号的参数列表..
萨科酒店距离Mommaerts

为我工作!我正在使用它netsh int set int %wifiname% Enable/Disable
Marslo

2
我和上面的Nicolas Mommaerts有同样的问题。我不明白为什么会这样(最好的修复方法),但是以下它应该起作用(请注意结尾处的所有引号): net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
地震

另一个问题(不便之处)是,脚本将暂停(等待用户输入) 服务器服务未运行(我出于某种原因将其禁用)。我通常通过尝试写入HOSTS文件位置来测试管理员权限,但是最好调用powershell命令-Verb runas,而不是依赖启用的 Windows服务或尝试写入文件。
script'n'code

15

对于某些程序,将超级机密__COMPAT_LAYER环境变量设置为RunAsInvoker 可以使用。请检查以下内容:

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

尽管这样,不会有UAC提示用户在没有管理员权限的情况下继续。


1
到Microsoft网站的链接不再有效,因此我将其更改为archive.org上的内容。如果任何人都可以在Microsoft网站上找到指向该内容的有效链接,则请以所有方式进行更新。
RockPaperLizard

1
仍然处于中等完整性,尚未提升,因此您不能在中编辑HKLM regedit。它只是跳过了UAC。
HackingAddict1337

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"
:--------------------------------------

2
我喜欢您脚本中的arg处理。但是请注意caclsWindows 7和更高版本的Windows 中已弃用该功能。
马特2015年

Fsutil肮脏甚至更好
Wolf

1
您知道该行pushd "%CD%"保存当前工作目录并更改为当前工作目录吗?

3

我写的gsudo一个sudo窗户:在提升当前控制台(无上下文切换到一个新的窗口),与凭证高速缓存(减少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演示


凉。谢谢。它在哪些Windows版本上起作用?
RockPaperLizard

测试套件运行在Server 2019上,我的本地开发箱是Windows 101909。对不起,我还没有测试过与其他旧OS的兼容性。
Gerardo Grignoli

谢谢杰拉多。如果有人在其他版本的Windows上尝试过,请发布结果。
RockPaperLizard

我刚刚在Windows 8.1上测试了gsudo v0.7并正常工作。在.Net Framework 4.6那儿安装并非易事。幸运地choco install dotnet4.6.2带来了一些难以获得的依赖关系。然后gsudo config Prompt "$p# "修复了ConHost显示错误提示的问题(转义字符为char而不是红色的尖角)。@RockPaperLizard
Gerardo Grignoli

非常感谢Gerardo。是否可以将其重新编译为与4.6之前的任何版本的.Net Framework兼容,还是取决于4.6特定的某些功能?
RockPaperLizard

2

尽管不适用于此问题,但由于它想为用户提供一些信息,因此当我想运行从任务计划程序提升的.bat文件时,google将我带到这里。

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

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


0

使用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"'"

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>


-3

以下解决方案是干净的,并且可以正常工作。

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

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

  3. 将文件Elevate.exe复制到Windows始终可以找到它的文件夹中(例如C:/ Windows)。或者,最好将其复制到计划保留bat文件的文件夹中。

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

 elevate net start service ...

2
该命令仅打开一个对话框窗口,询问用户是否允许执行此命令。因此,您不能在不需用户交互的情况下在批处理文件中使用此命令。
Radon8472

如果可以在没有用户交互的情况下提升水平,那将是一个巨大的安全漏洞,不是吗?每种病毒都将开始使用该方法进行自我升级,而无需用户批准。
Andrei Belogortseff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.