核心思想
无论哪种方法,本质都是一样的:启动一个新的、具有管理员权限的进程,然后让这个新进程去执行你的 CMD 命令。

推荐 - 通过 runas 命令(最通用)
这是最灵活、最标准的方法,不依赖于特定操作系统(只要支持 runas,如 Windows XP/7/10/11),它通过 runas 命令来启动一个新的、提升权限的 CMD 窗口。
关键点:
runas /user:Administrator cmd会提示你输入管理员密码。- 为了在 Java 中自动化,我们可以使用
/savecred选项,这个选项会缓存之前输入的凭据,下次执行时就不需要再输入密码了(前提是你之前成功以管理员身份运行过一次并保存了凭据)。 - 为了在后台静默执行,并且获取命令的输出,我们需要重定向输入、输出和错误流。
Java 代码示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class RunAsAdminExample {
public static void main(String[] args) {
// 你想要执行的 CMD 命令
String command = "echo Hello from Admin! && ipconfig /all";
// 使用 runas 命令
// /user:Administrator: 指定管理员用户名
// /savecred: 使用缓存的凭据(无需手动输入密码)
// /netonly: 如果需要远程执行,需要此选项,本地执行可以不加。
// cmd /c: 启动 cmd.exe,执行完命令后关闭
// "你的命令": 要执行的命令,用引号括起来
String[] runasCommand = {
"cmd.exe",
"/c",
"runas",
"/user:Administrator",
"/savecred",
"cmd /c \"" + command + "\""
};
try {
// ProcessBuilder 是启动外部进程的推荐方式
ProcessBuilder pb = new ProcessBuilder(runasCommand);
// 合并错误流和标准输出流,这样错误信息也能被读取到
pb.redirectErrorStream(true);
System.out.println("尝试以管理员身份执行命令: " + command);
// 启动进程
Process process = pb.start();
// 读取命令的输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
System.out.println("\n--- 命令输出 ---");
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println("--- 输出结束 ---\n");
// 等待进程执行完毕
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("命令执行成功!");
} else {
System.out.println("命令执行失败,退出码: " + exitCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
如何使用:
- 首次运行: 当你第一次运行这个 Java 程序时,系统会弹出一个 UAC (用户账户控制) 窗口,要求你输入
Administrator的密码,输入并勾选“记住我的凭据”后,命令会执行。 - 后续运行: 因为使用了
/savecred,之后再运行程序时,它会直接使用缓存的凭据,不会再弹出密码输入框。
推荐 - 通过 PowerShell(现代 Windows 风格)
在 Windows 7 及更高版本中,PowerShell 是更强大的命令行工具,使用 PowerShell 的 Start-Process cmdlet 可以更优雅地处理权限问题。

关键点:
-Verb RunAs是核心参数,它会自动触发 UAC 提示,请求管理员权限。-FilePath指定要执行的程序(如cmd.exe)。-ArgumentList指定传递给程序的参数。-NoNewWindow让命令在当前窗口执行,便于捕获输出。
Java 代码示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class PowerShellAdminExample {
public static void main(String[] args) {
// 你想要执行的 CMD 命令
String command = "echo Hello from Admin via PowerShell! && net user";
// 使用 PowerShell 来启动一个需要管理员权限的进程
// powershell.exe: 启动 PowerShell
// -Command: 执行一个命令字符串
// Start-Process: PowerShell 的 cmdlet,用于启动新进程
// -FilePath: 要启动的程序
// -Verb RunAs: 请求管理员权限(关键!)
// -ArgumentList: 传递给 cmd.exe 的参数
// -NoNewWindow: 不创建新窗口
// -Wait: 等待进程完成
String[] powershellCommand = {
"powershell.exe",
"-Command",
"Start-Process -FilePath 'cmd.exe' -ArgumentList '/c \"" + command + "\"' -Verb RunAs -NoNewWindow -Wait"
};
try {
ProcessBuilder pb = new ProcessBuilder(powershellCommand);
pb.redirectErrorStream(true);
System.out.println("尝试通过 PowerShell 以管理员身份执行命令: " + command);
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
System.out.println("\n--- 命令输出 ---");
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println("--- 输出结束 ---\n");
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("命令执行成功!");
} else {
System.out.println("命令执行失败,退出码: " + exitCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
不推荐 - 修改 JAR/Wing 的清单文件(仅适用于桌面应用)
如果你的 Java 程序是一个可执行的 JAR 文件或带有 GUI 的程序(例如用 Swing/JavaFX 编写的 .exe 文件),你可以修改它的清单文件,使其请求管理员权限。
适用场景: 最终用户直接运行的桌面应用程序。
缺点:

- 每次启动程序时都会弹出 UAC 提示,用户体验不佳。
- 对于纯后台服务或工具类程序不适用。
- 修改过程稍微复杂。
步骤:
- 创建一个清单文件
admin.manifest如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> - 对于 JAR 文件:
- 你需要使用
jar.exe或其他工具将清单文件打包到 JAR 中。 - 更简单的方式是使用第三方工具(如 Launch4j)将 JAR 打包成
.exe文件,并在打包时指定此清单文件。
- 你需要使用
- 对于 .exe 文件(使用 Launch4j):
- 在 Launch4j 的配置文件中,指定
manifest属性指向你的admin.manifest文件。 - 重新打包生成
.exe文件。
- 在 Launch4j 的配置文件中,指定
这样,当用户双击运行这个 .exe 文件时,系统会自动弹出 UAC 提示,用户授权后,程序就会以管理员身份启动,之后执行的任何 CMD 命令都将拥有管理员权限。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
runas |
通用性好,不依赖特定 OS,灵活 | 首次需要手动输入密码并保存凭据 | 绝大多数场景,特别是服务器脚本或后台服务。 |
PowerShell |
现代、强大,语法清晰,是 Windows 推荐方式 | 需要 PowerShell 环境(Win7+) | 现代 Windows 环境,尤其是与 PowerShell 生态结合紧密的应用。 |
| 清单文件 | 程序自身即拥有权限,调用时无需额外步骤 | 每次启动都弹 UAC,用户体验差;仅适用于桌面应用 | 最终用户直接运行的桌面 GUI 应用,需要持续管理员权限的情况。 |
首选建议:
- 对于大多数开发和自动化场景,方法一 (
runas) 是最可靠和通用的选择。 - 如果你的应用环境是较新的 Windows 系统(Win7+),并且你熟悉 PowerShell,方法二 (
PowerShell) 是一个非常优雅的替代方案。
