2013-11-28 106 views
7

我試圖用Java創建一個啓動註冊表項,並且我得到了一個非常奇怪的結果。在某些操作系統如XP上,該命令完美無缺。但是,在Windows 7上,只有在運行編譯的jar或類時纔會創建密鑰,而不是從網頁上的小程序運行。另外在Windows 8上,該命令完全不起作用。我試過調試這個,看起來REG命令執行成功。如果我通過命令提示符手動運行該命令,它會創建密鑰,其輸出與從程序內部運行時相同。繼承人的代碼的一個例子:當從Java中的ProcessBuilder執行時,Windows REG命令不工作

public static int regadd(String key, String name, String val) throws IOException, InterruptedException { 
    ProcessBuilder pb = new ProcessBuilder(new String[]{"REG", "ADD", key, "/v", name, "/d", val, "/f"}); 
    pb.redirectOutput(new File(PathManager.getDirectory(), "log0.txt")); 

    int i = pb.start().waitFor(); 
    Logger.log("ADD: " + i); 

    return i; 
} 

在log0.txt它打印這樣的:

操作已成功完成。

此外,該程序打印

的「結果」

地址:0

所以在這一點上,我在什麼可能是問題的一個損失。我知道添加到註冊表中的其他冒險方式,但我想保持我的代碼與所有VM發行版兼容。有沒有辦法做到這一點或修復退出方法?

+0

兩件事情跳出來,1 *「而不是從一個網頁*小程序」小應用程序安全沙箱中運行,這意味着他們往往有非常有限的功能,當涉及到訪問客戶機,如跑步例如,進程,所以除非該applet被簽名並且具有適當的安全權限,否則這將失敗。 2- Windows 7+與XP有不同的安全模式。這可能是Windows安全管理員已經介入並停止了發生的行動,並且這樣做很安靜。這有一些很好的理由,但我已經沒有空間了。 – MadProgrammer

+0

你「可以」試運行的瀏覽器爲「管理員」,但我不知道這是否會令Java插件是如何運行的一個區別... – MadProgrammer

+2

[註冊表虛擬化(視窗) - MSDN - 微軟( http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884(v=vs.85).aspx) – Holger

回答

6

我假設你已經安裝了多個Java虛擬機(32位,64位,...),並且根據你如何執行代碼,使用不同的JavaVM並得到不同的結果。

例如,在一個小程序中,通常最終會在32位Java VM中(因爲Web瀏覽器是32位,因此VM也必須是32位)。

在這種情況下,我假設reg.exe的32位versuon被執行。最後寫入HKLM\Software的所有內容都被重定向到HKLM\SOFTWARE\Wow6432NodeHKCU\SoftwareHKCU\Software\Wow6432Node)。

在任何情況下,我強烈建議你只是爲了監測真正發生的事情。下載並啓動Sysinternals ProcessMonitor,並簡單地查看寫入註冊表的內容。然後,您可以確定是否創建了要添加的註冊表項,或者是否因爲任何虛擬化技術而找不到它們。

+0

我將如何去執行reg.exe的64位版本?或者有沒有其他方法可以添加到真實註冊表中? – Colby

+0

它不能被重定向到wow6432node,因爲這些鍵需要與現有的應用程序交互 – Colby

5

我開發的插件在註冊表中創建密鑰。

import javaQuery.core.Registry; 
import javaQuery.importClass.javaQueryBundle; 

public class Demo { 
    public static void main(String[] args) { 
     String response = javaQueryBundle.createRegistry().createKey(Registry.HKEY_CURRENT_USER, "\\jqreg", Registry.key_String_Value, "Software", "javaQueryAPI"); 
     System.out.println(response); 
    } 
} 

Download library file,如果您有任何問題,請告訴我。

1

要調試這個,你可以嘗試執行另一個程序say notepad.exe,來檢查它是否在客戶端執行。

然後,您可以嘗試使用「cmd.exe/C reg」而不是「reg」,它將起作用。

請讓我知道它是否有效。

+0

是的,其他程序工作。 reg.exe正在運行,這不是問題。這是註冊表的可視化.. – Colby

1

REG ADD文件:

http://technet.microsoft.com/en-us/library/cc742162.aspx

所以我們可以使用http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Runtime.exec(String command)執行命令和返回的過程。

Process proc = Runtime.getRuntime().exec("REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead"); 

現在我們有過程變量至極包含expesific方法: http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#getInputStream%28%29

Process.getInputStream(); 

讓我們繼續我們的代碼:

InputStream in = proc.getInputStream(); 
for (int i = 0; i < in.available(); i++) { 
    System.out.println("" + in.read()); 
} 

我想這可能是有點幫助。

+0

我已經得到了那麼多!原來的帖子顯示reg.exe的輸出是「操作成功完成」。 – Colby

相關問題