是否可以以管理员身份自动运行批处理文件


48

我想知道当您双击该批处理文件时是否可以以管理员身份自动打开该批处理文件,因为这些命令需要以管理权限运行。

注意:我已经知道右键单击文件并单击Run As Administrator的解决方案,但这不是自动解决方案。



我能够
使它

2
与左击和右击相比,两次左击如何自动执行?
jiggunjer '16

Answers:


44

是的,您可以运行具有管理权限的批处理文件。不幸的是,您不能直接从自身的批处理文件中执行此操作。您首先需要创建该批处理文件的快捷方式,然后更改该快捷方式的属性才能执行此操作。

要创建快捷方式,有很多方法,但是最简单和最快的方法是使用上下文菜单中的“ 发送到”选项。

Right click batch file > Send to > Desktop (create shortcut)

当然,您可以将快捷方式发送到您想要的任何位置。要提升批处理文件以admin身份运行,请按照以下步骤操作:

  1. 右键单击刚创建的快捷方式(应该在桌面上或将其发送到任何地方)
  2. 在快捷方式选项卡下,单击高级...按钮。
  3. 选中以管理员身份运行复选框,然后在模式窗口和主属性窗口中按OK。
  4. 双击运行快捷方式,该批处理文件应以管理员身份运行。

1
您总是可以强制批处理文件调用快捷方式,并让快捷方式传递参数以知道不调用快捷方式。您将在if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOF下方插入类似内容@echo off,然后将其链接到program.bat a而不是just program.bat
2014年

2
Ifedi写道:“接受的答案(确实来自Tech1337)确实有效。但是我发现,在Windows 7中,每次单击快捷方式时,我都必须忍受UAC对话框。” <-尽管其他人说它在没有UAC的情况下仍然有效
barlop 2015年

对我来说,双击该快捷方式不会在当前目录中运行,尽管.bat确实如此。即使在快捷方式上填写了“开始于:”属性。因此,请确保您的.bat指定完整的文件路径。
罗伯·莫舍

29

正如Ben Gripka 在回答另一个问题时所说的那样:

REM --add the following to the top of your bat file--


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

是的,我找到了这个并且正在使用它。不管怎么说,多谢拉!
Antp 2014年

本质上就是我要找的东西。希望有一种无需使用VB就能做到这一点的方法吗?
法老王大厨2015年

@ChefPharaoh这将创建一个提升权限的控制台来运行批处理文件。您可以使用powershell脚本执行相同的操作。
jiggunjer '16

这是对我最好的答案。
kasperhj

4

公认的答案确实有效。但是我发现在Windows 7中,每次单击快捷方式时,我都必须忍受UAC对话框。这个恕我直言,大大降低了“自动”这个问题!

然后我发现在我自己的情况下,有.bat问题的文件将由Task Scheduler运行。在这种情况下,检查任务选项卡Run with highest privileges上的General选项可以很好地解决问题。.bat然后,该程序将以管理员身份运行而没有任何麻烦。

PS:我没意识到我无法在此答案上载图片,因为现在我身边有一个漂亮的小屏幕截图!可以吗


2
如果您将链接添加到图像,则有人会为您内联它们。
Ramhound 2014年

@Ramhound。添加链接到图像?该图像在我的桌面上,而不是在线位置。或者,肯定是我缺少了什么?
Ifedi Okonkwo 2014年

是; 您上传它们;您只是无法将屏幕快照插入您的答案中。
Ramhound 2014年

可能没有那个上传按钮,或者昨天我半瞎了!我敢肯定是后者。无论如何,我很好地完成了文件上传,但被告知我需要10人才能发布图像。谢谢,不过。
Ifedi Okonkwo 2014年

您仍然可以将链接放在答案中。
Ramhound 2014年

4

在Windows 7上

  1. 创建该批处理文件的快捷方式

  2. 右键单击快捷方式文件

  3. 单击高级按钮以查找以管理员身份运行的复选框

检查以下屏幕截图

屏幕截图


1
您的说法与接受的答案相同。
Antp'2

是的,我只想为每个匆忙的人创建一个带有屏幕截图的简单列表。
fedmich 2015年

3
如果有人着急,我会怀疑他们会滚动到底部来寻找答案。还是要感谢
Antp

3

您可以使用我的脚本Batch_Admin自动将管理员提升为可在任何类型的批处理自身脚本,BAT或.CMD中使用。此功能可确保在标准环境中使用标准工具在不同Windows系统中以相同方式进行工作。它使用几个标准的内置Windows命令。不要使用任何其他外部脚本。它可以用来以管理员身份调用任何程序,而不仅仅是脚本Batch。创建一个小的脚本即可,然后调用需要权限Administartor的程序。将此放置在任何搜索PATH文件夹中(来自%PATH%)。

要使用它,您只需在其父批脚本中插入以下行(完全相同)即可,该脚本将以管理员身份运行。最好在父脚本的顶部完成此操作,最好是先进行此操作,然后再通过CALL调用一些子脚本(请参见下面的详细说明)。

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

可以将其插入任何由CALL语法调用的子脚本中。在消息仍然显示时不具有管理员权限,例如。调用Batch_Admin之前的5秒钟,将变量“ ShowAdminInfo”设置为秒数

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

所以它是如何工作的:

•通过VBScript调用UAC.ShellExecute以获取用户权限

•批处理运行脚本,或者BAT或CMD

•脚本调用方的引号中可以包含长名称空间

•退回从命令行传递来的主脚本调用的所有参数,就好像没有传输调用并从头开始一样,还带有特殊字符,例如感叹号(!)和百分比(%),以及带括号()

•如果呼叫发生在主脚本所在的目录中,则保存主脚本位置

•如果我们在自己之前设置变量“ ShowAdminInfo”,则辅助显示一条消息,例如。持续5秒钟,这可能会阻止管理员立即提供附加信息以及做出明智决定的权利。必须设置的设置示例:SET ShowAdminInfo = 5默认情况下,由于未定义此变量,因此不会显示。

•该脚本还在系统搜索路径%PATH%中以及从网络资源中调用,例如:\ Computer \ share \ test.bat

•防止在脚本几乎同时调用多个Batch_Admin时编写必要的辅助文件时产生误解。它使用1到100之间的随机数

•但是,最好是在父脚本上使用它。过渡到管理员权限始终要求您在新窗口,新环境中完全重新运行脚本,而不必求助于先前在脚本中设置的变量,并且这些变量的值没有传递,然后以管理员身份调用。只是脚本将再次执行。

在完整的脚本Batch_Admin下面。有关此内容的更多信息,请访问我的网站。

将以下文本复制到记事本中,并将其另存为:Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***

我认为这与以上答案相似或相同:superuser.com/a/852877/375935
jiggunjer

1

或者,您可以创建第二个批处理文件,这可以让您以管理员身份运行任何内容,而仅输入一次管理员密码。密码保存在身份验证令牌中,并且需要一些真正的计算机知道如何破解。

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"

1
@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"  
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"  
    "%temp%\getadmin.vbs"  
    exit /B
:gotAdmin  
chkdsk

这也适用于 来源:https : //social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file


您能解释一下您的解决方案吗?
scai 2015年


0

您可以使用命令行实用程序elevate。(下载链接-https: //drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog

这不会引起UAC紧急情况吗?
Antp 2015年

这带来了……但是,总比没有好(看到“访问被拒绝” ..)
T.Todua 2015年

但是,不是真正的“自动”功能
吗?

0

这是一个以管理员身份运行bat的示例。这个对我有用。

它是这样的:

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
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause

欢迎来到超级用户!尽管这可以回答问题,但是如果您可以提供解释为什么会这样做会更好。
DavidPostill

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.