我正在尝试使用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分发兼容。有没有办法完成这个或修复现有的方法?
答案 0 :(得分:6)
我假设您安装了多个Java VM(32位,64位,...),并且根据您执行代码的方式,使用不同的JavaVM,结果不同。
例如,从applet中你通常最终会进入32位Java VM(因为Web浏览器是32位,因此VM也必须是32位)。
在这种情况下,我假设也执行了reg.exe的32位versuon。最后写入HKLM\Software
的所有内容都会重定向到HKLM\SOFTWARE\Wow6432Node
(HKCU\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());
}
我想这可能会有所帮助。