【发布时间】:2010-11-26 00:45:24
【问题描述】:
Java 中有没有一种方法可以要求系统控制管理员功能。
当然不用做:右键单击 exe -> 以管理员身份运行。
我想要的是来自 UAC 的框架,就像在 Windows Vista 或 Windows 7 中一样。
或者我在从 jar 中制作 exe 时需要做一些设置吗?
【问题讨论】:
标签: java windows admin uac exe
Java 中有没有一种方法可以要求系统控制管理员功能。
当然不用做:右键单击 exe -> 以管理员身份运行。
我想要的是来自 UAC 的框架,就像在 Windows Vista 或 Windows 7 中一样。
或者我在从 jar 中制作 exe 时需要做一些设置吗?
【问题讨论】:
标签: java windows admin uac exe
您必须创建一个清单文件,指定您的应用程序需要管理员权限。您可以将清单包含在您的 exe 中或将其保存为单独的文件 (yourapp.exe.manifest)
【讨论】:
最简单的方法是使用包装器来启动您的 JVM,然后提升包装器。我使用带有 UAC 插件的简单 NSIS 安装程序脚本来执行此操作:
; Java Launcher
;--------------
; You want to change the below lines
Name "my program"
Caption "my program Launcher"
Icon "iconfile.ico"
OutFile "java launcher.exe"
; param below can be user, admin
RequestExecutionLevel admin
!include UAC.nsh
SilentInstall silent
AutoCloseWindow true
ShowInstDetails show
Section ""
; command to execute
StrCpy $0 'javaw -jar myjarfile'
SetOutPath $EXEDIR
Exec $0
SectionEnd
【讨论】:
如果您打算以系统管理员权限启动 javaw.exe,ZippyV 的答案很好,如果纯 Java 代码被 UAC 阻止(例如尝试将文件写入特权目录),那么是你需要做的。
但是,如果您尝试在外部启动某些东西,但只是通过提升,您可以捆绑一个提升命令的 exe。 Here is one.
【讨论】:
您可以使用 Windows 程序来提升您的权限。该程序将显示 UAC 提示,然后您将拥有管理员权限。
http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/
然后你可以运行这样的命令:
Runtime.getRuntime().exec("Elevate.exe yourcommand");
【讨论】:
如果您可以从 Windows CMD 批处理文件运行您需要运行的任何内容.. 您可以从您的 java 应用程序中创建一个批处理文件(甚至在运行中),它可以执行您想要的操作并启动它。 我让它工作,所以我的 java 程序启动它,它会向用户弹出正常的 windows UAC 提示,然后如果他们选择是,则运行命令。
String[] commands = {"cmd.exe", "/C" "mybatchfile.bat"};
ProcessBuilder pb = new ProcessBuilder(commands);
..
pb.start();
这是一个处理在 Windows 批处理文件中请求 UAC 访问的线程: How to request Administrator access inside a batch file
注意: ProcessBuilder 处理起来可能有点棘手,使用 StreamGobbler 为我处理输出工作: Handle Input using StreamGobbler
【讨论】:
我将解释如何获得提升的 java 应用程序
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process <program.exe> -verb RunAs");
}
}
program.exe 只是调用 notepad.exe 的例子
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process notepad.exe -verb RunAs");
}
}
比你有提升的程序。 我建议你 - 你需要转换为像 Launch4j 或 Parcle 这样的二进制包装器 比你可以点击 - 如果你创建自定义安装程序(由 Java Swing 或 Awt 制作)
我希望你有好的解决方案:) - 如果你使用 Linux 或 Mac OS X,那么你需要使用 Parcle 二进制包装器或其他包装器,如果你知道的话......
// 编辑 Kaptkaos 的好主意 比你写的简单:
import java.io.IOException;
public class RunAsAdminExample {
public static void main(String[] args) throws IOException {
Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process -FilePath java.exe -Argument '-jar runasadmin.jar' -verb RunAs");
}
}
不要忘记使用'' 和"" if -jar <filename>.jar from -Argument of Start-Process。注意不要忘记 - 如果你使用工作目录和 jar 文件必须在工作目录示例中
你可以看到带有参数的提升的 java :)
最好的问候!
【讨论】:
为此,我在 Windows 上使用命令行。在开始菜单中,在文本框中键入 cmd,当程序 cmd.exe 出现时,右键单击它并选择以管理员身份运行。现在当你执行 java -jar 它将以管理员权限运行。
【讨论】: