尝试在%AppData%中执行.exe时拒绝访问

时间:2013-09-01 15:19:57

标签: java windows usb ioexception

我正在尝试在我的Java应用程序中使用RemoveDrive.exe found here。我在我的JAR中有它,并且我使用以下代码将其解压缩到临时文件,但是当我尝试运行它时,我得到一个IOException,其中显示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甚至不会要求许可。

编辑:看到赏金快要结束了,请看my SuperUser question这帮我解决了这个问题......我会奖励赏金并尽快接受答复

5 个答案:

答案 0 :(得分:4)

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

File rdExe = new File(System.getProperty("user.home") + "/.yourProgramName/rmvd.exe");
rdExe.getParentFile().mkdirs();

答案 1 :(得分:2)

  1. 我不是JAVA用户,但不是32比64问题吗?

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

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

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

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

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

答案 2 :(得分: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"));

希望你觉得它很有用

答案 3 :(得分:1)

看到它只是在这里被触及,我会说这个问题与Windows中的权限有关,而且与Java无关。

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

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

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

答案 4 :(得分:0)

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