7

我正在尝试在我的 Java 应用程序中使用在此处找到的 RemoveDrive.exe。我在我的 JAR 中有它,我正在使用以下代码将它提取到一个临时文件中,但是当我尝试运行它时,我得到了一个IOExceptionwhich 说CreateProcess error=5, Access is denied. 该程序通常不需要管理员权限。关于可能导致问题的任何想法?

            File RDexe = File.createTempFile("rmvd", ".exe");

            InputStream exesrc = (InputStream) GraphicUI.class.getResource("RemoveDrive.exe").openStream();
            FileOutputStream out = new FileOutputStream(RDexe);

            byte[] temp = new byte[1024];
            int rc;

            while((rc = exesrc.read(temp)) > 0)
                out.write(temp, 0, rc);

            exesrc.close();
            out.close();

            RDexe.deleteOnExit();

            // run executable
            Runtime runtime = Runtime.getRuntime();
            System.out.println(RDexe.getPath() + " " + "F:\\" + " -b -s");
            Process proc = runtime.exec(RDexe.getPath() + " " + "F:\\" + " -b");
            InputStream is = proc.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

            String line; boolean ejected = false;
            while((line = reader.readLine()) != null)
                if(line.equalsIgnoreCase("failed")) ejected = false;
                else if(line.equalsIgnoreCase("success")) ejected = true;

            reader.close();
            is.close();

更新:如果我启用内置管理员帐户 ( net user administrator /active:yes),一切正常。但是,如果我在标准帐户中右键单击并以管理员身份运行,我仍然会收到错误消息,并且 UAC 甚至都不会请求许可。

编辑:好像赏金快结束了,请参阅我的超级用户问题,它帮助我解决了这个问题......我将很快获得赏金并接受答案。

4

5 回答 5

4

在您的情况下,这可能不是问题,但某些防病毒程序会阻止运行临时文件夹中的可执行文件或脚本。不要创建临时文件,而是尝试将其放在用户目录中:

File rdExe = new File(System.getProperty("user.home") + "/.yourProgramName/rmvd.exe");
rdExe.getParentFile().mkdirs();
于 2013-09-11T21:43:23.397 回答
2
  1. 我不是 JAVA 用户,但不是 32 位和 64 位的问题吗?

    在 64 位 Windows 上,错误代码5通常意味着可执行文件不是64位兼容的。有时,即使可执行文件只需要访问一些不再存在的(较旧的 win)系统目录,也会出现这种情况。为了证明这一点,请尝试在命令行中使用您的可执行文件。如果你能设法让它在那里工作,那就是另一个问题。如果找不到您的操作系统的可执行文件。

  2. 另一种可能性是文件必须物理存在于某个驱动器上。

    您写道,您将其视为临时的。不支持对JAVA意味着什么。如果它仅将其复制到某个文件并在使用后删除,则可以,但如果它仅在内存中某处,那么如果可执行文件需要访问自身,则可能会出现问题。为了证明这一点,只需将文件复制到某个已知位置,然后从那里(在JAVA中)运行它。如果它有效,那么您将需要对其做一些事情(在执行到物理磁盘介质或其他任何东西之前和之后从JAVA复制和删除可执行文件)

  3. 另一种可能性是错误代码5来自 JAVA 环境而不是来自操作系统

    在那种情况下,我不知道这意味着什么(不是JAVA用户)

于 2013-09-06T07:13:12.463 回答
2

只是提醒另一种运行文件的方式,您是否考虑过使用 java Desktop 对象?:http ://docs.oracle.com/javase/6/docs/api/java/awt/Desktop.html

当需要通过我的 java 程序运行程序时,我发现它很有用。像这样的东西可以为你工作:

Desktop.getDesktop().open(new File("enter path and name of the file"));

希望你觉得它有用

于 2013-09-12T16:51:36.793 回答
1

好像这里只涉及到它,我会说这个问题与 Windows 中的权限有关,与 Java 无关。

正如我在原始问题中链接到的超级用户问题中所述,我发现我的常用帐户由于某种未知原因没有该文件夹的所有权 - 因此无法执行任何操作;它不仅仅是我用 Java 创建的临时文件。

即使我是管理员,为了获得文件夹的所有权,我必须启用内置管理员帐户并授予自己所有权。自从我这样做以来,一切都按预期工作。

感谢所有人的努力,我将奖励最详细的答案并让我走上正确的轨道。

于 2013-09-12T18:38:17.763 回答
0

您运行的是哪个版本的 Windows?微软显着收紧了在 Windows 7 中执行程序的限制。我的猜测是,操作系统不允许你分叉在程序启动时未经身份验证的东西。我会尝试在 Windows 2000 或 XP 上运行它,看看您是否有同样的问题。

于 2013-09-07T04:05:24.280 回答