【发布时间】:2022-02-10 20:17:18
【问题描述】:
我的 BAT 文件中有这一行:
"Example1Server.exe"
我想在管理员模式下执行此操作。如何修改bat代码以管理员身份运行?
这是正确的吗?我需要加上引号吗?
runas /user:Administrator invis.vbs Example1Server.exe
【问题讨论】:
标签: windows batch-file
我的 BAT 文件中有这一行:
"Example1Server.exe"
我想在管理员模式下执行此操作。如何修改bat代码以管理员身份运行?
这是正确的吗?我需要加上引号吗?
runas /user:Administrator invis.vbs Example1Server.exe
【问题讨论】:
标签: windows batch-file
另一个答案要求您输入管理员帐户密码。此外,在管理员组中的帐户下运行与以管理员身份运行不同,请参阅:UAC on Wikipedia
Windows 7 说明
要以管理员身份运行,请为批处理文件创建快捷方式。
然后你可以设置快捷方式以管理员身份运行:
现在,当您双击快捷方式时,它会提示您确认 UAC,然后 以管理员身份运行(正如我上面所说,这与在管理员组中的帐户下运行不同)
查看下面的截图
注意: 当您以管理员身份运行时,当前目录(路径)将与 bat 文件不同。在很多情况下,这可能会导致一些问题,因为 bat 文件引用了它旁边的相关文件。例如,在我的 Windows 7 中,当前目录将是 SYSTEM32 而不是 bat 文件位置! To workaround it,你应该使用
cd "%~dp0"
或更好
pushd "%~dp0"
确保 cur dir 与 bat 文件所在的路径相同。
【讨论】:
您使用runas 以特定用户身份启动程序:
runas /user:Administrator Example1Server.exe
【讨论】:
Example1Server.exe) 不需要放在引号中,但在其他一些情况下(例如名称中的空格:Example1 Server.exe)你会需要它们的确。不过,您可以使用引号,即使它们不是必需的。
runas /User:abc "csript myscript.vbs" 或 runas /User:abc "cmd /c start ..."。
只需将其添加到 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 上测试。
【讨论】:
exit 添加到批处理文件的末尾,否则我将被留在提示符下。这可能是因为 .vbs 启动了第二个命令提示符。
如果您可以使用第三方实用程序,here is an elevate command line utility。
源代码和二进制文件可在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
【讨论】:
elevate.exe 摇滚!
你可以使用nircmd.exe的elevate命令
NirCmd 命令参考 - 提升
elevate [Program] {Command-Line Parameters}
仅适用于 Windows Vista/7/2008:以管理员权限运行程序。当 [Program] 包含一个或多个空格字符时,您必须将其放在引号中。
例子:
elevate notepad.exe
elevate notepad.exe C:\Windows\System32\Drivers\etc\HOSTS
elevate "c:\program files\my software\abc.exe"
PS:我在 win 10 上使用它,它可以工作
【讨论】:
go get github.com/mattn/sudo
然后
sudo Example1Server.exe
【讨论】:
使用此工具将您的批处理文件转换为 .exe:http://www.battoexeconverter.com/ 然后您可以以管理员身份运行它
【讨论】:
我的实验表明 runas 命令必须包含管理员用户的域(至少在我组织的环境设置中是这样):
runas /user:AdminDomain\AdminUserName ExampleScript.bat
如果您还不知道管理员用户的域,请以管理员用户身份运行命令提示符实例,然后输入以下命令:
echo %userdomain%
Kerrek SB 和 Ed Greaves 提供的答案将在管理员用户下执行目标文件,但如果文件是命令脚本 (. bat 文件)或 VB 脚本(.vbs 文件)尝试在普通登录用户的环境中操作(例如更改注册表项),您可能无法获得预期的结果,因为脚本实际运行的环境将是管理员用户,而不是普通登录用户!例如,如果文件是在注册表的 HKEY_CURRENT_USER 配置单元上运行的脚本,则受影响的“当前用户”将是管理员用户,而不是正常登录用户。
【讨论】:
当您使用/savecred 参数时,它会询问一次密码,然后再也不询问。即使你把它放到另一个程序上,它也不会要求输入密码。您的问题示例:
runas /user:Administrator /savecred Example1Server.exe
【讨论】:
我发现可以使用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> 在终端执行命令并关闭【讨论】:
我在 Windows 11 上测试了 @Sire's answer,它就像一个魅力。值得一提的是,使用cmd /k - 正如@Sire 所使用的那样 - 将在Administrator 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 )
【讨论】:
在快捷方式属性中使用目标批处理文件的完整物理驱动器\路径。
如果您像我一开始尝试那样使用 subst 驱动器,这在 Windows 10 中不起作用...
【讨论】: