从Java中的ProcessBuilder执行时,Windows REG命令不起作用

时间:2013-11-28 18:23:39

标签: java windows registry processbuilder

我正在尝试使用Java来创建一个启动注册表项,我得到了一个非常奇怪的结果。在某些操作系统(如XP)上,命令可以完美运行。但是,在Windows 7上,它只会在运行已编译的jar或类时创建密钥,而不是从网页上的applet运行。此外,在Windows 8上,该命令根本不起作用。我已经尝试过调试它,似乎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中打印出:

  

操作成功完成。

此外,程序的“结果”打印

  

ADD:0

所以在这一点上,我不知道会出现什么问题。我知道添加到注册表的其他有趣的方法,但我想保持我的代码与所有VM分发兼容。有没有办法完成这个或修复现有的方法?

4 个答案:

答案 0 :(得分:6)

我假设您安装了多个Java VM(32位,64位,...),并且根据您执行代码的方式,使用不同的JavaVM,结果不同。

例如,从applet中你通常最终会进入32位Java VM(因为Web浏览器是32位,因此VM也必须是32位)。

在这种情况下,我假设也执行了reg.exe的32位versuon。最后写入HKLM\Software的所有内容都会重定向到HKLM\SOFTWARE\Wow6432NodeHKCU\Software - > HKCU\Software\Wow6432Node相同)。

无论如何,我强烈建议您只是为了监控实际情况。下载并启动Sysinternals ProcessMonitor,然后只需查找写入注册表的内容。然后,您可以确定是否创建了要添加的注册表项,或者是否由于任何虚拟化技术而无法找到它们。

答案 1 :(得分: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,如果您有任何问题请告诉我。

答案 2 :(得分:1)

要对此进行调试,您可以尝试执行另一个程序,例如notepad.exe,以检查它是否在客户端执行。

然后您可以尝试使用“cmd.exe / C reg”而不是“reg”,它会起作用。

如果有效,请告诉我。

答案 3 :(得分:1)

Reg添加文档:

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

现在我们有一个包含一个经验方法的Process变量: 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());
}

我想这可能会有所帮助。