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

44

如何在另一个具有管理员权限的批处理文件中运行批处理文件?

我已经尝试了RUNAS命令,但它需要管理员密码。

我正在寻找一种替代方法来通过右键单击并以管理员身份运行批处理文件。我想要从另一个批处理文件自动化它。


user93353 给出了答案,没有其他的方法。出于安全原因,另一个选项是给予您的用户在您要查找的资源上执行或写入的权限。如果可以的话,请提供更多关于您想要实现的细节。 - codea
@Endoro - 这不是重复问题 - 他正在询问如何以非交互方式执行操作 - 另一个答案是交互式的。 - user93353
谢谢大家的回复。我使用了Windows的UAC控制来禁用身份验证,以便可以从批处理文件中运行批处理文件。 - Vinay KV
这个回答解决了你的问题吗?如何编写一个BAT文件以始终以管理员模式运行? - Kaibo
9个回答

41

将每一行命令放在cmd中,或者把它们全部放在批处理文件中:


@echo off

if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)

"Put your command here"

对我来说运行得很好。


注意:虽然它可以工作,但是当运行批处理文件时,您的命令工作目录将会是 C:\WINDOWS\system32。通常情况下(没有提升权限),您的批处理文件工作目录应该是文件所在的文件夹。 - anion

26

在Windows 7上:

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

  2. 右键单击该快捷方式文件,选择属性

  3. 点击高级按钮找到一个用于以管理员身份运行的复选框

请查看下面的截图

屏幕截图


2
答案不正确。 OP要求从另一个批处理文件中以管理员身份运行批处理文件的方法,这种方式行不通。 - user3856347
@prodigy,你尝试过并确认它不起作用了吗? - fedmich
2
我可能应该明确说明一下,我之前在XP上尝试过这个方法,但它没有起作用。我最近没有再尝试过,所以我可能是错的,或者当时我做错了什么。 - user3856347

15
你可以使用PowerShella.bat以管理员身份运行。
set mydir=%~dp0

Powershell -Command "& { Start-Process \"%mydir%b.bat\" -verb RunAs}"

这将提示用户确认对话框。用户选择,然后b.bat将作为管理员运行。


12

使用

runas /savecred /profile /user:Administrator whateveryouwanttorun.cmd

它只会在第一次要求输入密码。除非更改密码等情况发生,否则不会再次要求输入密码。


1
这将允许用户使用管理员权限运行任意命令,因此您可以将其添加到本地管理员组中。 - Ansgar Wiechers
2
@AnsgarWiechers - 用他自己的话说,“我正在寻找一种替代方法,可以通过右键单击批处理文件并以管理员身份运行它。我想从另一个批处理文件中自动化它。”- 如果他能右键单击并以管理员身份运行它,则已经知道管理员密码 - 这就像Linux上的sudo。另一件事是,如果没有管理员密码,这不能使用。 - user93353
真实,但不相关。sudo可以限制特定命令,而runas /savecred则不能。如果您删除密码提示,则有效地消除了管理员和普通用户之间的障碍。更好的方法可能是创建一个计划任务。 - Ansgar Wiechers
@AnsgarWiechers - 在这种情况下,用户拥有root/admin密码。在Linux中,如果他拥有root密码,他可以修改sudoers文件以删除对sudo的任何限制。 - user93353
据我所知,runas.exe不会引发提升提示,这似乎是OP所指的。 - Bill_Stewart

3
如果您想调用Windows UAC提示(将整个屏幕变黑并询问是否授予管理员权限给以下任务),则使用RUNAS不是最顺畅的方法,因为:
  1. 即使以管理员身份登录,您也不会收到UAC授权提示
  2. RUNAS预期您拥有管理员密码,即使您的用户设置为本地管理员,在这种情况下,前者的密码也不是一个合理的安全实践,特别是在工作环境中。
相反,请尝试复制并粘贴以下代码,以确保批处理文件以管理员权限运行:
@echo off

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

if '%errorlevel%' NEQ '0' (
    echo Requesting Admin access...
    goto goUAC )
    else goto goADMIN

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

:goADMIN
    pushd "%CD%"
    CD /D "%~dp0"

rem --- FROM HERE PASTE YOUR ADMIN-ENABLED BATCH SCRIPT ---
echo Stopping some Microsoft Service...
net stop sqlserveragent
rem --- END OF BATCH ----

这个解决方案可以在启用用户账户控制的Windows 7、8.1和10系统中100%工作。


抱歉,那个愤怒的家伙给我的答案投了反对票。他显然没有尝试过,公平地说,我回答了这个帖子的问题。这种无知的负面情绪会让贡献者不愿意浪费时间在那些没有证据就投反对票的人身上。 - alejandrob
我认为你的问题在于,当已经有更短、更简单的解决方案发布时,你写了太多的代码。 - MD XF
1
else goto goADMIN 应该被简单地替换为 goto goADMIN。 - devzero

3
CMD本身没有以管理员身份运行文件的功能,但是PowerShell有这个功能,并且可以通过CMD执行某个命令来执行该PowerShell函数。在命令提示符中编写指定文件的命令以管理员身份运行该文件。
powershell -command start-process -file yourfilename -verb runas

希望这有所帮助!

2

在这里无法使用Runas.exe。您可以使用VBScript调用“以管理员身份运行”Shell动词。提升工具包包含一个批处理文件,允许您调用提升的命令:

elevatecmd.exe

http://blogs.technet.com/b/elevationpowertoys/


这将引发提升提示,但无法绕过它。 - Bill_Stewart

1

-1
这是一个我在批处理文件中使用的技巧,如果有人想尝试的话可以用这个方法。当你运行批处理文件时,它会给你管理员提示符。
@echo off
cd \ && cd windows/system32 && command which needs admin credentials
pause

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