【问题标题】:Access denied when trying to execute a .exe in %AppData%尝试在 %AppData% 中执行 .exe 时访问被拒绝
【发布时间】:2013-09-01 15:19:57
【问题描述】:

我正在尝试在我的 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,它帮助我解决了这个问题……我将很快授予赏金并接受答案。

【问题讨论】:

标签: java windows usb ioexception


【解决方案1】:

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

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

【讨论】:

  • +1 感谢您的回答。这不是我的问题(因为我已经设法解决它),但我可以使用这个位置作为临时文件的故障保险。这确实是下一个放置它的最佳位置吗?
  • 抱歉,请在发布我的答案后阅读您的解决方案。用户应该始终可以访问此folder。只有在您计划自己清理之后才可以 - 您的代码就是这样。不过,我可能会将其放入“隐藏”文件夹中(答案已更新)。
  • 感谢您的更新,这是有道理的。然后我将主目录设为故障安全临时目录。
【解决方案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"));

希望你觉得有用

【讨论】:

  • 感谢您的回答。我确实知道Desktop,但我从未真正考虑过为此使用它。不幸的是,它并没有解决任何问题,因为这个问题与 Windows 相关,而不是 Java。
  • 啊,好吧,我认为这可能会有所帮助,因为我按照您之前的方式尝试过,这也给了我错误“访问被拒绝”,但桌面对象帮助我解决了这个问题。如果你还没有尝试过,我会推荐它。没有什么可失去的,但你永远不知道:)
  • 我会尝试一下,但扭转我所做的所有权更改有点痛苦,而且我很确定我仍然会遇到同样的错误,因为问题不相关。另外,我不确定是否可以使用 Desktop 对象传递命令行参数。不过,我一定会在未来使用它
  • 我认为您不能使用 Dekstop 对象传递参数,不,我的错误,我不知道您需要 :)
  • 没关系,没关系。我没有明确说明我需要这样做,但可以通过我的代码推断出来:)
【解决方案3】:
  1. 我不是 JAVA 用户,但这不是 32 位与 64 位的问题吗?

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

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

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

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

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

【讨论】:

  • 感谢您的回答。我以为你已经用第一点击中了它,但似乎没有。似乎我无法在 Temp 目录中执行任何东西,包括已经存在的可执行文件,即使我右键单击并按“以管理员身份运行”,所以这更多是与操作系统相关的问题。但是+1以获得深入的答案! :)
【解决方案4】:

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

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

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 感谢您的回答,很抱歉回复缓慢。我正在运行 Windows 7,但是受到您的回答的启发,我尝试在另外两台 Windows 7 机器上运行 Temp 文件夹中的可执行文件(我认为我已经以相同的方式设置了),并且可执行文件在这些机器上运行良好.知道什么可能会拒绝我访问我的笔记本电脑吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多