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

我试图在我的Java应用程序中使用RemoveDrive.exe。 我在我的JAR中,并使用下面的代码解压缩到一个临时文件,但是当我尝试运行它时,我得到一个IOException ,它说CreateProcess error=5, Access is denied 。 虽然程序通常不需要pipe理员权限。 任何想法可能会导致这个问题?

  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(); 

更新:如果我启用内置的pipe理员帐户( net user administrator /active:yes ),一切工作正常。 但是,如果我在标准帐户中右键单击并以pipe理员身份运行,我仍然得到错误,UAC甚至不要求权限。

编辑:看到好像赏金差不多完成,请看我的超级用户问题 ,这帮助我解决了这个问题…我将奖励赏金,并尽快接受答案。

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

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

只是另一种方式来运行文件,你有没有想过使用Java桌面对象? : 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")); 

希望你觉得它有用

  1. 我不是JAVA用户,但不是32位与64位的问题?

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

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

    你写到你是暂时的。 不支持对于JAVA意味着什么。 如果只是将它复制到某个文件,并在使用后删除它的确定,但如果它只在内存中的某处比可能会有问题,如果可执行文件需要访问本身。 为了证明这只是将文件复制到一些已知的位置,然后从那里运行(在JAVA中 )。 如果它的工作比你需要做一些事情(复制和删除执行前后的可执行文件到物理磁盘介质或其他)

  3. 另一种可能性是错误代码5来自JAVA环境,而不是来自OS

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

看起来好像只是在这里触及的,我会说这个问题与Windows的权限有关,与Java没有任何关系。

正如我在原来的问题中所链接的超级用户问题所述,我发现我的平常帐户由于一些未知的原因而没有该文件夹的所有权 – 所以什么也不能执行; 这不仅仅是我在Java中创建的临时文件。

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

感谢所有的努力,我将奖赏最详细的答案,并把我放在正确的轨道上。

你正在运行什么版本的Windows? 微软显然收紧了围绕在Windows 7中执行程序的限制。我的猜测是,操作系统将不允许你在程序启动的时候分发那些未经过身份验证的东西。 我会试着在Windows 2000或XP上运行它,看看你是否有相同的问题。