如何使用C#可靠地检查Windows更新是否已启用?

3

我尝试检查Windows Update是否已启用。在Windows 7 x64 Ultimate上,我添加了对c:\ windows \ system32 \ wuapi.dll的引用,并编写了以下代码:

using WUApiLib;
public Boolean IsWindowsUpdateEnabled()
{
    var updates = new AutomaticUpdatesClass();
    return updates.ServiceEnabled;
}

代码无法构建。我遇到了以下错误:

Error 1 类型“WUApiLib.AutomaticUpdatesClass”没有定义构造函数。
Error 2 互操作类型“WUApiLib.AutomaticUpdatesClass”无法嵌入。请使用适用的接口。
Error 3 “WUApiLib.AutomaticUpdatesClass”不包含“ServiceEnabled”的定义,也没有扩展方法“ServiceEnabled”接受一个类型为“WUApiLib.AutomaticUpdatesClass”的第一个参数可以找到(是否缺少使用指令或程序集引用?)


你尝试使用位于C:\Windows\SysWOW64的wuapi.dll了吗? - SuperOli
2
@SuperOli:如果他在32位上,他将自动重定向到那里。 - Daniel
请查看WUA当前版本的确定 - user7116
当我通过VS 2010添加引用时,在COM选项卡下看到以下路径:c:\windows\SysWowo64\wuapi.dll。但它仍然出现相同的错误。我也尝试手动添加引用,浏览到c:\windows\system32\wuapi.dll,但结果是一样的。我有Wuapi.dll的V2版本,但我认为这不应该是问题。我已经看到人们对Windows XP Sp2上发现的dll的V1做了同样的事情,但我只针对Windows 2008或更高版本的操作系统。 - Steve Johnson
2个回答

4

在您的Visual Studio项目参考列表中,找到WUApiLib引用并将其“嵌入互操作类型”更改为“False”。


+1 赞同这个想法。我会尝试您的解决方案并在此发布结果。谢谢。 - Steve Johnson
谢谢。你的解决方案有效。如果你能再回答我一个问题,那就太好了。
  1. 为什么将“嵌入”设置为False会使它工作? 感谢您的回答,如果您能写几行来回答我的初学者问题,我将不胜感激。谢谢。
- Steve Johnson

3
也许您可以查询注册表来查看?
public string Read(string KeyName)
{
    // Opening the registry key
    RegistryKey rk = baseRegistryKey ;
    // Open a subKey as read-only
    RegistryKey sk1 = rk.OpenSubKey(subKey);
    // If the RegistrySubKey doesn't exist -> (null)
    if ( sk1 == null )
    {
        return null;
    }
    else
    {
        try 
        {
            // If the RegistryKey exists I get its value
            // or null is returned.
            return (string)sk1.GetValue(KeyName.ToUpper());
        }
        catch (Exception e)
        {
            // AAAAAAAAAAARGH, an error!
            ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
            return null;
        }
    }
}

源代码

需要查找的位置:

http://www.windowsnetworking.com/articles_tutorials/Registry-Keys-Tweaking-Windows-Update-Part1.html

这些键的第一个是AUOptions键。这个DWORD值可以被分配一个值为2、3、4或5的数值。值为2表示代理应在下载更新之前通知用户。值为3表示将自动下载更新并通知用户安装。值为4表示应根据计划自动下载和安装更新。要使此选项起作用,还必须设置ScheduledInstallDay和ScheduledInstallTime键。稍后我会更详细地讨论这些键。最后,值为5表示需要自动更新,但可以由最终用户配置。

等等。

如果设置是通过群组策略完成的,则可能会有所不同。

更多信息请参见: http://support.microsoft.com/kb/328010


这个方法适用于Windows 2008 R2及以后的32位和64位版本吗?我可以在Windows 2008、2008 R2、2012和Windows 7 x86和x64位系统上依赖它吗?很抱歉我在最初的问题中没有澄清这一点,但我明白了。谢谢。 - Steve Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接