如何编写 BAT 文件以始终以管理员模式运行?

问题描述 投票:0回答:12

我的 BAT 文件中有这一行:

"Example1Server.exe"

我想在管理员模式下执行此操作。如何修改bat代码以管理员身份运行?

这是正确的吗?我需要加引号吗?

runas /user:Administrator invis.vbs Example1Server.exe
windows batch-file
12个回答
414
投票

另一个答案要求您输入管理员帐户密码。此外,在管理员组中的帐户下运行与以管理员身份运行不同,请参阅:维基百科上的UAC

Windows 7 说明

为了以管理员身份运行,请创建批处理文件的快捷方式。

  1. 右键单击批处理文件,然后单击复制
  2. 导航到您想要快捷方式的位置
  3. 右键单击目录背景
  4. 选择粘贴快捷方式

然后您可以设置快捷方式以管理员身份运行:

  1. 右键单击快捷方式
  2. 选择属性
  3. 在快捷方式选项卡中,单击高级
  4. 选择“以管理员身份运行”复选框
  5. 点击确定,确定

现在,当您双击快捷方式时,它会提示您进行UAC确认,然后以管理员身份运行(正如我上面所说,这与在管理员组中的帐户下运行不同)

查看下面的截图

Screenshot

注: 当您以管理员身份运行时,当前目录(路径)将与bat文件不同。在很多情况下,bat 文件引用其旁边的相关文件时,这可能会导致一些问题。例如,在我的 Windows 7 中,当前目录将是 SYSTEM32,而不是 bat 文件位置! 要解决此问题,您应该使用

cd "%~dp0"

或更好

pushd "%~dp0"

确保当前目录与bat文件所在的路径相同。


82
投票

您使用

runas
以特定用户身份启动程序:

runas /user:Administrator Example1Server.exe

82
投票

只需将其添加到 *.bat 文件的顶部即可:

set "params=%*"
cd /d "%~dp0" && ( if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" ) && fsutil dirty query %systemdrive% 1>nul 2>nul || (  echo Set UAC = CreateObject^("Shell.Application"^) : UAC.ShellExecute "cmd.exe", "/k cd ""%~sdp0"" && ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" && "%temp%\getadmin.vbs" && exit /B )

它将提升为管理员并保留在正确的目录中。在 Windows 10 上测试。


15
投票

如果您可以使用第三方实用程序,这里有一个

elevate
命令行实用程序

源代码和二进制文件可在 GitHub 上获得。

这是使用说明:

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

10
投票

您可以使用nircmd.exeelevate命令

NirCmd 命令参考 - 提升

elevate [Program] {Command-Line Parameters}

仅适用于Windows Vista/7/2008:以管理员权限运行程序。当[程序]包含一个或多个空格字符时,必须将其放在引号中。

示例:

elevate notepad.exe 
elevate notepad.exe C:\Windows\System32\Drivers\etc\HOSTS 
elevate "c:\program files\my software\abc.exe"

PS:我在win 10上使用它并且它有效


6
投票
  1. 我的实验表明 runas 命令必须包含管理员用户的域(至少在我组织的环境设置中是这样):

    runas /user:AdminDomain\AdminUserName ExampleScript.bat
    

    如果您尚不知道管理员用户的域,请以管理员用户身份运行命令提示符实例,然后输入以下命令:

    echo %userdomain%
    
  2. Kerrek SBEd Greaves提供的答案将在管理员用户下执行目标文件,但是,如果该文件是命令脚本(.bat文件)或VB脚本(.vbs文件),则尝试如果在普通登录用户的环境下进行操作(比如修改注册表项),可能会得不到想要的结果,因为脚本实际运行的环境是admin用户的环境,而不是普通登录用户的环境!例如,如果该文件是在注册表的 HKEY_CURRENT_USER 配置单元上运行的脚本,则受影响的“当前用户”将是管理员用户,而不是普通登录用户。


5
投票
go get github.com/mattn/sudo

然后

sudo Example1Server.exe

5
投票

当您使用

/savecred
参数时,它会要求输入密码一次,然后就不再要求输入密码。即使您将其放入另一个程序,它也不会要求输入密码。您的问题示例:

runas /user:Administrator /savecred Example1Server.exe


4
投票

使用此工具将批处理文件转换为.exe:http://www.battoexeconverter.com/然后你可以以管理员身份运行它


4
投票

我在 Windows 11 上测试了 @Sire 的答案,它的效果非常好。值得一提的是,使用

cmd /k
- 正如@Sire 所使用的那样 - 将使管理员 CMD 在运行完成后保持打开状态。使用
cmd /c
将会在批处理文件结束时关闭窗口。

set "params=%*"
cd /d "%~dp0" && ( if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" ) && fsutil dirty query %systemdrive% 1>nul 2>nul || (  echo Set UAC = CreateObject^("Shell.Application"^) : UAC.ShellExecute "cmd.exe", "/c cd ""%~sdp0"" && %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" && "%temp%\getadmin.vbs" && exit /B )

1
投票

我发现可以使用

powershell
。 powershell 将显示默认的 Windows UAC 对话框。

powershell Start -File Example1Server.exe -Verb RunAs

以管理员权限执行BAT文件,BAT文件的内容如下:

@echo off
if "%1"=="runas" (
  cd %~dp0
  echo Hello from admin mode
  pause
) else (
  powershell Start -File "cmd '/K %~f0 runas'" -Verb RunAs
)

地点:

  • %1
    第一个输入参数分配给 BAT 文件。
  • %~f0
    扩展为执行的 BAT 文件的完整路径
  • %~dp0
    扩展到执行 BAT 文件的完整目录路径
  • cmd -C <commands>
    在终端中执行命令并关闭

0
投票

在快捷方式属性中使用目标批处理文件的完整物理驱动器\路径。

如果您像我一开始尝试的那样使用替代驱动器,这在 Windows 10 中不起作用...

© www.soinside.com 2019 - 2024. All rights reserved.