如何创建一个批处理文件以管理员身份运行cmd

56

我需要运行一个批处理文件,其中需要注册一个DLL。由于批处理文件未以“管理员”身份启动命令提示符,因此DLL的注册失败。

是否有办法通过批处理文件以管理员身份启动命令提示符?

环境: Win7/Vista


1
http://technet.microsoft.com/en-us/library/bb490994 - Marc B
@EdGreaves,那个链接不是指向这个问题吗? - achAmháin
参见:https://dev59.com/TWw15IYBdhLWcg3wIYO_#13811519 - Ed Greaves
这个问题含义不明确:是要以管理员用户身份运行,还是要以管理员权限运行? - undrline - Reinstate Monica
13个回答

59

这个脚本很有效!只需将其粘贴到批处理文件的顶部即可。如果您想查看脚本输出,请在批处理文件底部添加“pause”命令。

这个脚本现在稍作修改,以支持命令行参数。

@echo off
:: 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"
::--------------------------------------

::ENTER YOUR CODE BELOW:

这段代码可以启用Windows更新服务,但无法禁用Windows更新服务。sc stop wuauserv&sc config wuauserv start = disabled - proseosoc
1
注意:如果从不同驱动器的子目录运行此代码,它偶尔可能无法正常工作。请参见我在此处的问题:https://superuser.com/questions/1192426/batch-file-only-runs-properly-from-c-drive/1192427#1192427 - Blaine
1
哇塞 - 这个完美地运行了!我是那个时代的人,一切都是批处理文件和DOS编程,知道大多数技巧,但没想到这是可能的!我非常印象深刻!谢谢分享! - Scott
在代码的最后一行之前,使用参数调用脚本:%*被设置,但在最后一行之后为空。 - Joe
在最后一行之前,使用参数 %* 调用脚本,但在代码执行完后为空。 - undefined
这个简单动作的模板太过庞大了! - undefined

16

你可能需要先使用另一个批处理文件,以管理员权限启动第二个文件。

在第一种情况下:

runas /noprofile /user:mymachine\administrator yourbatchfile.bat

进一步阅读后,您必须能够在提示符处输入密码。由于安全原因,您不能将密码作为管道传递。

您可以尝试使用psexec来获得更好的运气。


我会尝试实现你的解决方案。 - JChan
2
我尝试了上述命令,但它要求管理员密码,而我不知道。 - JChan
@JChan 看起来你无法自动填充密码,这个功能已被禁用,请查看我的更新答案。 - Bali C

10

按下 Ctrl+Shift 并双击快捷方式可作为管理员运行。

从开始菜单同样适用。


7

这是基于@DarkXphenomenon的答案,但遗憾的是它存在一些问题。

你需要将你的代码放在这个包装器中:

if _%1_==_payload_  goto :payload

:getadmin
    echo %~nx0: elevating self
    set vbs=%temp%\getadmin.vbs
    echo Set UAC = CreateObject^("Shell.Application"^)                >> "%vbs%"
    echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
goto :eof

:payload
    echo %~nx0: running payload with parameters:
    echo %*
    echo ---------------------------------------------------
    cd /d %2
    shift
    shift
    rem put your code here
    rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof

这将使批处理文件以提升的用户身份运行。它为特权代码添加了两个参数:
  • 单词payload,表示这是有效载荷调用,即已经提升。否则,它只会一遍又一遍地打开新进程。

  • 目录路径,其中调用主脚本。由于Windows始终在"%windir%\system32"中启动提升的cmd.exe,所以没有简单的方法知道原始路径是什么(并且保留不触及代码就能复制脚本的能力)。

注意:不幸的是,由于某种原因,shift对于%*无效,因此如果需要传递实际参数,则必须采用我在示例中使用的丑陋符号表示法(%1 %2 %3 %4 %5 %6 %7 %8 %9),这也带来了最多9个参数的限制。


7
为了防止脚本在位于非系统驱动器(如c:)且带有空格的目录中失败,请执行以下操作:

Batch_Script_Run_As_Admin.cmd

@echo off
if _%1_==_payload_  goto :payload

:getadmin
    echo %~nx0: elevating self
    set vbs=%temp%\getadmin.vbs
    echo Set UAC = CreateObject^("Shell.Application"^)                >> "%vbs%"
    echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
goto :eof

:payload

::ENTER YOUR CODE BELOW::   





::END OF YOUR CODE::

echo.
echo...Script Complete....
echo.

pause

这段代码似乎可以工作,但我总是需要确认。有没有办法在没有用户交互的情况下自动确认?干杯! - vlatko606
我正在从VBA调用批处理,但由于某种原因,当我添加这个代码时,它会认为执行已经完成并继续执行。我该如何等待执行完成? - Daniel Hernandez

6

您可以使用指向批处理文件的快捷方式。只需进入快捷方式的属性,选择高级选项,然后选择“以管理员身份运行”。

然后将批处理文件隐藏,运行快捷方式。

这样,您甚至可以为快捷方式设置自己的图标。


1
我的“以管理员身份运行”复选框被禁用了。我该怎么解决? - Nam G VU
嗯,不太确定。很有趣。 - jojois74
@NamGVU https://superuser.com/questions/880290/run-as-administrator-greyed-out-on-shortcut - ntrch
@NamGVU 你可以从这里下载已经创建好的便携式(在Windows XP中生成)快捷方式集:https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/ToolAdaptors/lnk/ 或者自己生成:https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/ToolAdaptors/vbs/ - Andry

5

在Windows 7到10中,当从任何地方(包括浏览器)启动应用程序或文件以及从任何地方访问文件时,使用参数可以为我解决问题。将(YOUR BATCH SCRIPT HERE anchor)替换为您的代码。这个解决方案可能会有所帮助 :)

@echo off

call :isAdmin

if %errorlevel% == 0 (
    goto :run
) else (
    echo Requesting administrative privileges...
    goto :UACPrompt
)

exit /b

:isAdmin
    fsutil dirty query %systemdrive% >nul
exit /b

:run
  <YOUR BATCH SCRIPT HERE>
exit /b

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"

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

2
也许是这样的:
if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)

1

正如user2549366之前建议的那样,“您可以使用链接到批处理文件的快捷方式。”但是在属性->兼容性选项卡中,可能已禁用以管理员身份运行。

因此,您只需右键单击“file.bat-快捷方式”,然后转到->属性->快捷方式选项卡->高级,然后您可以单击以管理员身份运行。之后,您可以执行该快捷方式。


1
您可以使用以下代码通过批处理文件以管理员身份运行CMD。
@echo off
powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/k cd /d %~dp0'"
exit 

这段代码使用PowerShell以管理员权限启动新的命令提示符进程。-Verb RunAs 参数告诉PowerShell以管理员身份运行该进程,/k cd /d %~dp0 参数将目录更改为批处理文件所在的位置。但是,我将其用于Windows 10。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接