1
try {
    final String REG_ADD_CMD ="cmd /c reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\"+
                              "Microsoft\\Windows\\CurrentVersion\\WindowsUpdate"+
                              "\\Auto Update\" /v AUOptions /t REG_DWORD /d 1 /f";
    Process objProcess;
    //objProcess cmd /c = Runtime.getRuntime().exec(new String[] 
    //{"REG ADD \"", " HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows
    //\\CurrentVersion\\WindowsUpdate\\Auto Update"," /v AUOptions /t REG_DWORD /d 1 /f"});

    objProcess = Runtime.getRuntime().exec(REG_ADD_CMD);
    System.out.println("REG_ADD_CMD:::"+REG_ADD_CMD);
    BufferedReader reader=new BufferedReader(new InputStreamReader(objProcess.getInputStream()));
    String line=reader.readLine();
    System.out.println("Windows auto update::::"+line);
    final int exitStatus = objProcess.waitFor();
    int exitVal = objProcess.exitValue();
    System.out.println("exitStatus::::"+exitStatus);
    System.out.println("exitVal::::"+exitVal);
    //System.out.println("Processed finished with status: " + exitVal);

    if(exitStatus != 0){
        System.err.println("Error while installing application!!");
    }
        //objProcess = Runtime.getRuntime().exec("reg add "HKEY_LOCAL_MACHINE\SOFTWARE\"+
//                          "Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v AUOptions /t REG_DWORD /d 1 /f");
}
    catch (InterruptedException ex) {
        ex.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这是我在 Windows 7 中禁用 Windows 自动更新的代码。一旦我执行,我的控制台中就会收到“操作成功完成”的响应,但它没有反映在控制面板中,对此有什么帮助。谢谢

4

2 回答 2

2

我认为你走错路了。事实上,windows 在注册表中存储了大量的配置信息。然而,这并不意味着存储此信息并在启动时读取它的组件对注册表值执行轮询以查看其他人是否更改了该值。

这就是你的情况。有一个组件负责自动更新。它在系统启动时启动并从注册表中读取其配置。然后您更改注册表值,但该组件对此一无所知。

要正确执行此操作,您应该找到执行此操作的 API 并调用它。幸运的是,有人已经实现了执行此任务的命令行实用程序:http: //www.intelliadmin.com/index.php/2012/10/manage-automatic-updates-from-the-command-line/

看看这篇文章。从 java 运行该实用程序,希望它对您有用。我确信还有其他解决方案可以做类似的事情。例如看看 WMI。如果您发现 WMI API 可以做到这一点,您可以编写 JScript 或 VBScript,然后使用cscript解释器从 java 运行它。

于 2014-03-06T08:11:53.357 回答
0

你最好使用 ProcessBuilder,或者至少使用Runtime.exec一个String[]而不是单个字符串,因为单字符串 exec 几乎肯定不会按照你想要的方式拆分单词。

Process objProcess = Runtime.getRuntime().exec(new String[] {
   "cmd", "/c", "reg", "add",
   "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update",
    "/v", "AUOptions", "/t", "REG_DWORD",
    "/d", "1", "/f"
});

您不需要在包含空格的参数周围添加额外的引号。

于 2014-03-06T08:10:36.107 回答