【问题标题】:Java: run as administratorJava:以管理员身份运行
【发布时间】:2010-11-26 00:45:24
【问题描述】:

Java 中有没有一种方法可以要求系统控制管理员功能。 当然不用做:右键单击 exe -> 以管理员身份运行。
我想要的是来自 UAC 的框架,就像在 Windows Vista 或 Windows 7 中一样。

或者我在从 jar 中制作 exe 时需要做一些设置吗?

【问题讨论】:

    标签: java windows admin uac exe


    【解决方案1】:

    您必须创建一个清单文件,指定您的应用程序需要管理员权限。您可以将清单包含在您的 exe 中或将其保存为单独的文件 (yourapp.exe.manifest)

    http://msdn.microsoft.com/en-us/library/bb756929.aspx

    【讨论】:

    • 问题当然是“可执行”将是JVM,而不是您自己的代码。由于清单适用于 JVM,因此它适用于该 JVM 运行的任何内容。
    • 如果你有一个启动 java 的包装 exe 怎么办?子进程(jvm)会继承管理员权限吗?
    • @Cal - 是的 - 一旦一个进程被提升,它创建的所有进程都将被提升。 UAC 提升从字面上改变了应用程序正在运行的用户,它是一条单向街道 - 您可以提升,但不能回落。
    【解决方案2】:

    最简单的方法是使用包装器来启动您的 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
    

    【讨论】:

      【解决方案3】:

      如果您打算以系统管理员权限启动 javaw.exe,ZippyV 的答案很好,如果纯 Java 代码被 UAC 阻止(例如尝试将文件写入特权目录),那么是你需要做的。

      但是,如果您尝试在外部启动某些东西,但只是通过提升,您可以捆绑一个提升命令的 exe。 Here is one.

      【讨论】:

      • 谢谢!您通常不希望用户应用程序以管理员身份运行(仅某些特权操作),因此在大多数情况下这可能是更合适的解决方案。我也喜欢 Elevate.exe 有一个 -wait 选项,因此您可以阻止直到提升的命令完成。
      • 如果我正确阅读了您的链接,还必须修改注册表,这可能并不总是一种选择。
      【解决方案4】:

      您可以使用 Windows 程序来提升您的权限。该程序将显示 UAC 提示,然后您将拥有管理员权限。

      http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/

      然后你可以运行这样的命令:

      Runtime.getRuntime().exec("Elevate.exe yourcommand");
      

      【讨论】:

        【解决方案5】:

        如果您可以从 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

        【讨论】:

          【解决方案6】:

          我将解释如何获得提升的 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 &lt;filename&gt;.jar from -Argument of Start-Process。注意不要忘记 - 如果你使用工作目录和 jar 文件必须在工作目录示例中

          • .\myjar.jar
          • java .\RunAsAdminExample.class

          你可以看到带有参数的提升的 java :)

          最好的问候!

          【讨论】:

            【解决方案7】:

            为此,我在 Windows 上使用命令行。在开始菜单中,在文本框中键入 cmd,当程序 cmd.exe 出现时,右键单击它并选择以管理员身份运行。现在当你执行 java -jar 它将以管理员权限运行。

            【讨论】:

            • 作者特别提到“当然不用做:右键exe->以管理员身份运行”,那么这个答案有什么意义呢?
            猜你喜欢
            • 1970-01-01
            • 2012-11-22
            • 2016-09-20
            • 2012-05-28
            • 2011-03-24
            • 2021-08-10
            • 1970-01-01
            • 2022-01-08
            • 2015-01-22
            相关资源
            最近更新 更多