2013-11-28 70 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

相关问题