2013-09-01 116 views
7

我正嘗試在我的Java應用程序中使用RemoveDrive.exe,found here。我把它放在我的JAR中,然後使用下面的代碼將它解壓到一個臨時文件中,但是當我嘗試運行它時,我得到一個IOException,它說CreateProcess error=5, Access is denied。該程序通常不需要管理員權限。關於什麼可能導致這個問題的任何想法?嘗試執行%ApplicationData中的.exe時訪問被拒絕%

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

更新:如果我啓用內置的Administrator帳戶(net user administrator /active:yes),一切工作正常,從那裏。但是,如果我在標準帳戶中右鍵單擊並以管理員身份運行,我仍然會得到該錯誤,UAC甚至不會請求許可。

編輯:看到好像賞金也接近尾聲,請參閱my SuperUser question這幫助我解決這個問題......我會頒發的獎金,並很快接受一個答案。

+0

也許檢查http://stackoverflow.com/questions/6674431/possible-causes-of-java-io-ioexception-createprocess-error-5 – demongolem

+0

@demongolem我知道這個問題的信息。它不幫我解決我的問題,雖然 – Andy

回答

1

看到,因爲雖然它只有在這裏談到了,我會說,這個問題在Windows相關權限,並與Java無關。

正如我在原始問題中鏈接到的超級用戶問題所述,我發現我的平常帳戶由於某些未知原因而沒有該文件夾的所有權 - 因此無法執行任何操作;這不僅僅是我在Java中創建的臨時文件。

即使我是管理員,爲了取得文件夾的所有權,我必須啓用內置管理員帳戶並授予我自己的所有權。自從我這樣做以來,它們都按預期工作。

感謝大家的努力,我將獎勵給予最詳細的答案,讓我走上正軌。

2
  1. 我不是JAVA用戶,但不是它32與64位的問題?

    在64位Windows錯誤代碼5通常意味着可執行文件不是64位兼容。有時甚至當可執行文件只需要訪問一些不再存在的(舊的win)系統目錄時,情況就是如此。爲了證明這一點,嘗試在命令行中使用可執行文件。如果你能設法讓它在那裏工作,那麼它就是不同的問題。如果沒有找到可執行的操作系統。

  2. 另一種可能性是文件必須在某個驅動器上物理存在。

    你寫道,你有它作爲臨時的。不支持這對於JAVA意味着什麼。如果它只是將它複製到某個文件並在使用後刪除而不是它的OK,但是如果它只在內存中,那麼可執行程序需要訪問自身時可能會出現問題。爲了證明這一點,只需將文件複製到某個已知位置,然後從那裏運行它(在JAVA)。如果它比你需要做一些事情(複印件之前和執行物理磁盤介質或什麼之後,從JAVA刪除可執行文件)

  3. 另一種可能性是,錯誤代碼5來自JAVA環境的不從OS

    在這種情況下,我還沒有線索它意味着什麼(不JAVA用戶)

+0

感謝您的答案。我以爲你用第一點擊中了它,但似乎沒有。看來我無法執行Temp目錄中的任何內容,包括已經存在的可執行文件,即使我右鍵單擊並按「以管理員身份運行」,所以它更像是與操作系統相關的問題。然而+1爲深入的答案! :) – Andy

0

什麼無線網絡的版本ndows你在跑步嗎?微軟明顯收緊了Windows 7中執行程序的限制。我的猜測是,操作系統不會允許您在啓動程序時分發未經過身份驗證的東西。我試着在Windows 2000或XP上運行它,看看你是否有同樣的問題。

+0

感謝您的回答,並對慢回覆感到抱歉。我正在運行Windows 7,但是受到你的回答的啓發,我嘗試從另外兩臺Windows 7計算機上的Temp文件夾運行可執行文件(我認爲我已經以相同方式設置了該文件夾),並且可執行文件在這些計算機上運行良好。任何想法可能會拒絕我在我的筆記本電腦上訪問? – Andy

4

這可能不是您的情況中的問題,但某些防病毒程序將阻止運行臨時文件夾中的可執行文件或腳本。而不是創建一個臨時文件,嘗試把它在用戶目錄:

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

+1謝謝你的回答。在我的情況下,這不是問題(正如我設法解決的那樣),但我可以將此位置用作臨時文件的失敗保險箱。這真的會成爲下一個最好的地方嗎? – Andy

+0

對不起,在發佈我的答案後閱讀您的解決方案。用戶應該始終可以訪問此[文件夾](http://en.wikipedia.org/wiki/Home_directory)。如果你打算自己清理一下 - 你的代碼是什麼,那就好了。我可能會把它放到一個'隱藏'文件夾中(答案更新)。 – Lunchbox

+0

感謝您的更新,這是有道理的。然後,我將主目錄作爲安全防護臨時目錄。 – Andy

2

只是擡起頭對另一種方式來運行的文件,你有沒有想過使用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")); 

希望你覺得它有用

+0

感謝您的回答。我知道「桌面」,但我從未考慮過使用它。不幸的是,它不會解決任何問題,因爲這個問題與Windows相關,而不是Java。 – Andy

+0

啊好吧,我認爲這可能會有所幫助,因爲我嘗試了你以前的方式,也給了我'錯誤的訪問被拒絕',但桌面對象幫助我繞過它。如果你還沒有嘗試過,身份證推薦它..沒有什麼可失去,但你永遠不知道:) –

+0

我會嘗試它,但它扭轉了我所做的所有權變更是一種痛苦,我很確定由於問題不相關,我仍然會得到同樣的錯誤。另外,我不確定我是否可以使用桌面對象傳遞命令行參數。雖然 – Andy

相關問題