使用Java禁用Windows自动更新

时间:2014-03-06 07:58:36

标签: java swing process controlpanel

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自动更新进行diable的代码。一旦我在控制台中执行了“操作已成功完成”的响应,但它没有反映在控制面板中 有人可以帮忙解决这个问题。 感谢

2 个答案:

答案 0 :(得分: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运行它。

答案 1 :(得分: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"
});

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