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

时间:2012-07-17 14:44:15

标签: batch-file

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

是否可以通过批处理文件以管理员启动“命令提示符”。

环境:Win7 / Vista

12 个答案:

答案 0 :(得分:29)

这个脚本可以解决问题!只需将其粘贴到bat文件的顶部即可。如果要查看脚本的输出,请在批处理文件的底部添加“暂停”命令。

现在对此脚本进行了轻微编辑,以支持命令行参数。

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

答案 1 :(得分:7)

您可能必须首先使用另一个批处理文件来启动具有管理员权限的第二个批处理文件。

第一次使用

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

进一步阅读后,您必须能够在提示符下输入密码。由于出于安全考虑,此功能已被锁定,因此您无法管道密码。

psexec可能会更幸运。

答案 2 :(得分:7)

(这是基于@DarkXphenomenon's answer,不幸的是有一些问题。)

您需要将代码包含在此包装器中:

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个参数

答案 3 :(得分:4)

这适用于我在Windows 7到10中的参数,也可以从任何地方(包括浏览器)启动应用程序或文件,也可以从任何地方访问文件,用您的代码替换(您的批量脚本在这里锚点),此解决方案可以帮助:)

     @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`

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:3)

Ctrl + Shift 并双击快捷方式以作为提升的流程运行。

也可以从开始菜单开始工作。

答案 6 :(得分:3)

当脚本文件驻留在非系统驱动器(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

答案 7 :(得分:1)

也许是这样的:

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
)

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

这是一个基本相同文件的更简单版本。

@echo off
break off
title C:\Windows\system32\cmd.exe
cls

:cmd
set /p cmd=C:\Enter Command:

%cmd%
echo.
goto cmd

答案 10 :(得分:-2)

这可能是一个解决方案,我做了类似的事情,但这个似乎不起作用 例如,如果必要的功能需要管理员权限,它应该要求您以管理员身份重新启动它。

@echo off
mkdir C:\Users\cmdfolder

if echo=="Access is denied." (goto :1A) else (goto :A4)

:A1
cls 
color 0d
echo restart this program as administator

:A4
pause

答案 11 :(得分:-3)

使用记事本或您选择的任何文本编辑器制作文本。打开记事本,写下这个简短的命令&#34; cmd.exe&#34;没有引用并将其保存为cmd.bat。

单击cmd.bat并选择&#34;以管理员身份运行&#34;。