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

PDi*_*724 197 windows uac batch-file elevated-privileges windows-10

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

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

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

Mat*_*att 309

有一种简单的方法,无需使用外部工具 - 它可以在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
Run Code Online (Sandbox Code Playgroud)

该脚本利用了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
Run Code Online (Sandbox Code Playgroud)

如果没有此权限提升脚本,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 ...
Run Code Online (Sandbox Code Playgroud)

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


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

我现在通过剥离路径中的引号并稍后重新添加它来修复此问题,并且我添加了一个额外的参数,当脚本以提升的权限重新启动时添加该参数.

双引号将被删除(详情请见此处):

setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)

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

这条线

if '%1'=='ELEV' (shift & goto gotPrivileges)
Run Code Online (Sandbox Code Playgroud)

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


更新:

  • 为了避免必须注册.vbs在扩展的Windows 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
    将第一个参数更改为set cmdInvoke=1并检查是否已解决该问题.它将添加cmd.exe到执行提升的脚本中.
    或者尝试将第二个参数更改为winSysFolder=Sysnative,这可能对64位系统有帮助(但在大多数情况下不需要).(ADBailey已报道此事).只有从32位脚本主机启动64位应用程序时才需要"Sysnative"(例如,Visual Studio构建过程或来自其他32位应用程序的脚本调用).

  • 为了更清楚地说明如何解释参数,我现在正在显示它P1=value1 P2=value2 ... P9=value9.如果您需要在双引号中包含路径等参数,这尤其有用"C:\Program Files".

有用的链接:

  • 实际上,Windows批处理语言中明显缺少诸如ELEVATE之类的命令. (49认同)
  • 很好的答案,虽然我略微惊讶于你必须做所有这些做一些在某些情况下显然是必要的事情. (9认同)
  • 使用powershell可能更容易,因为它似乎是已批准的脚本编写工具,可用于处理更复杂的事情,但到目前为止,我从不费心地学习它:( (2认同)
  • 您可能需要在自己的代码之前添加 [`cd %~dp0`](http://serverfault.com/a/255294/157477)。否则,您会发现您的工作目录类似于“C:\Windows\System32”。想象一下您的脚本意外地改变了*那里*的某些内容...... (2认同)
  • @Matt你可以检查你的答案后面[这个被拒绝的编辑](http://stackoverflow.com/review/suggested-edits/9968170)背后是否有一些真相? (2认同)

小智 33

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

我修改了Matt的脚本:

:checkPrivileges 
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges 
) else ( powershell "saps -filepath %0 -verb runas" >nul 2>&1)
exit /b 
Run Code Online (Sandbox Code Playgroud)

:getPrivileges标签没有必要.

  • 您是对的,如果安装了PowerShell,您可以使用它来运行带有提升的批处理文件(感谢您的代码片段!).是的,不需要标签.谢谢你的提示,值得+1 ...... :-) (3认同)
  • 从cmd调用时,Powershell.exe没有-verb runas选项.如果您已经在PowerShell中,它确实存在. (2认同)

Ste*_*her 27

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

在Windows 8上提升脚本后,当前目录将设置为C:\Windows\system32.幸运的是,通过将当前目录更改为当前脚本的路径,可以轻松解决此问题:

cd /d %~dp0
Run Code Online (Sandbox Code Playgroud)

注意:用于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
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,在运行Windows 7的系统上也需要这样做. (2认同)

Mat*_*cha 25

我是这样做的:

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
Run Code Online (Sandbox Code Playgroud)

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

CD /d %~dp0将当前目录设置为文件的当前目录(如果尚未存在,则无论文件所在的驱动器如何,都可以使用该/d选项).

%~nx0 返回带扩展名的当前文件名(如果你不包含扩展名,并且文件夹上有一个同名的exe,它将调用exe).

这篇文章有很多回复我甚至不知道我的回复是否会被看到.

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

  • cd%~dp0无法在网络驱动器上运行,请改用pushd%~dp0. (4认同)
  • 我喜欢这个答案的简单性。终于有了使用 Jscript 的理由! (2认同)
  • @Wolf 我输入了一个巨大的答案才意识到我误解了你......我现在明白你的意思了。我将编辑它以包含`/d`。谢谢朋友 :) (PS:这里也是钢琴家!) (2认同)
  • 有趣,但 Windows Defender 将其检测为木马并在启动时将其隔离... (2认同)

jxm*_*ett 22

马特有一个很好的答案,但它剥夺了传递给脚本的任何参数.这是我的修改,保持参数.我还整合了Stephen对Windows 8中工作目录问题的修复.

@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...
Run Code Online (Sandbox Code Playgroud)

  • 这是一个有用的答案。然而,在`ECHO UAC.ShellExecute....` 行中,`"batchArgs!"` 不会扩展变量。使用`"!batchArgs!"`。我的编辑被拒绝了,所以我发表了评论。 (2认同)
  • 当使用带引号的参数时,脚本就会破坏,比如`test.bat'就是"`或``test script.bat"arg1 arg2`.全部修复了. (2认同)

ewa*_*all 20

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

我不确定你是如何检测它是否已经提升或不提升......只有在存在拒绝访问错误的情况下才可以重新尝试使用提升的权限?

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

  • 谢谢你的回复.不幸的是,我不认为我可以使用Windows Vista/7工具以外的任何东西,因为这将是我办公室以外的客户.我认为我不能合法地分发PSExec. (10认同)
  • `psexec -h`不起作用:'无法安装PSEXESVC服务:访问被拒绝.'.您需要具有管理员权限才能运行psexec. (4认同)
  • 是的,我认为你是对的 - 尽管PSExec现在是微软的工具(因为他们买了Sysinternals的人!)EULA确实禁止发行:( (2认同)
  • 我认为我的选择非常有限.如果我知道如何在VB中编码,我可以使用管理员清单将其设为exe,但我甚至不知道从哪里开始.我想我会在批处理开始时警告如果他们运行的是Windows Vista/7,则以管理员身份运行.谢谢大家. (2认同)

Rya*_*ose 19

如果不是,我使用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
Run Code Online (Sandbox Code Playgroud)

我从@Matt的回答中复制了"网名"方法.他的答案记录得更好,并有错误信息等.这个有一个优点,PowerShell已经安装并可在Windows 7及更高版本上使用.没有临时的VBScript(*.vbs)文件,您也不必下载工具.

只要未锁定PowerShell执行权限,此方法就可以在没有任何配置或设置的情况下运行.

  • 我和上面的Nicolas Mommaerts有同样的问题。我不明白为什么它可以工作(最好的修复方法),但是下面的工作可以做到这一点(注意最后所有的引号):`net file 1> nul 2> nul && goto:run || powershell -ex不受限制-命令“开始进程-Verb RunAs -FilePath'%comspec%'-ArgumentList'/ c“”%〜fnx0“”“”“” (2认同)

npo*_*aka 13

对于某些程序,设置超级秘密__COMPAT_LAYER环境变量RunAsInvoker 将起作用.检查:

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe
Run Code Online (Sandbox Code Playgroud)

虽然这样没有UAC提示用户将在没有管理员权限的情况下继续.

  • 它仍然处于**中等完整性**而不是**高级**,因此您无法在“regedit”中编辑 HKLM。它只是跳过了 uac。 (4认同)

Mic*_*ter 8

当 CMD 脚本需要管理员权限并且您知道这一点时,请将此行添加到脚本的最顶部(紧接在任何 后面@ECHO OFF):

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

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


Ger*_*oli 7

我写的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 ::
Run Code Online (Sandbox Code Playgroud)

替代(原始版本):

@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
Run Code Online (Sandbox Code Playgroud)

安装:

参见 gsudo 操作: gsudo 演示


Pyp*_*hly 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)
Run Code Online (Sandbox Code Playgroud)

将此行粘贴@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)
Run Code Online (Sandbox Code Playgroud)

优点:

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

缺点:

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

Mshta WSH 脚本

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

优点:

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

缺点:

  • 不可靠的。一些 Windows 10 系统会阻止脚本运行,因为 Windows Defender 将其拦截为潜在的木马程序。


小智 6

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

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

释义:

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

  • 我建议将 `... && exit /b)` 更改为 `... && popd && exit /b)`。这样运行脚本后当前目录保持不变。 (2认同)

Tan*_*DLJ 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"
:--------------------------------------
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你脚本中的arg处理.但请注意**在Windows 7和更新的Windows版本中不推荐使用`cacls`. (2认同)

归档时间:

查看次数:

262820 次

最近记录:

6 年,1 月 前