1

我目前正在尝试弄清楚,如何在 Windows 8 上将 Windows更新设置为“让我选择是否安装”而不是“自动安装更新”。

如果启用了 Windows 更新,根据来自 .NET 的检查,我尝试了:

WUApiLib.AutomaticUpdatesClass auc = new WUApiLib.AutomaticUpdatesClass();
// Doing some stuff

但得到以下错误:
Interop type 'WUApiLib.AutomaticUpdatesClass' cannot be embedded. Use the applicable interface instead.

The type 'WUApiLib.AutomaticUpdatesClass' has no constructors defined

按照使用 Powershell 更改窗口更新设置中的答案,我做了:

string subKey = @"SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subKey, true))
    key.SetValue("AUoptions", 4);

但是注册表中不存在导致Reference not set to an instance of an object错误的子项。

Google 的其余结果都描述了如何手动更改此设置,这不是我想要的。

如何以编程方式将 Windows 更新设置为“让我选择是否安装”?

4

2 回答 2

4

感谢Arran,我设法朝着正确的方向迈出了一步:

要摆脱互操作错误,请右键单击 Visual Studio 中的引用并转到它的属性,然后将“嵌入互操作类型”设置为 false。

现在我不再遇到互操作错误,我设法得出结论;这是代码:

// using WUApiLib;
AutomaticUpdatesClass auc = new AutomaticUpdatesClass();
auc.Settings.NotificationLevel = AutomaticUpdatesNotificationLevel.aunlNotifyBeforeInstallation;
auc.Settings.Save();
于 2013-05-01T13:52:42.363 回答
0

您可以通过将“嵌入互操作类型”保留为真并从代码中省略类后缀来避免“互操作类型 ... 无法嵌入”错误。

使用new AutomaticUpdates()代替new AutomaticUpdatesClass()

有关省略类后缀的更好描述,请参见此答案。他们说 .Net 4.0,但它在 4.5.1 中也适用于我。

前任:

// using WUApiLib;
AutomaticUpdates auc = new AutomaticUpdates();
auc.Settings.NotificationLevel = AutomaticUpdatesNotificationLevel.aunlNotifyBeforeInstallation;
if (!auc.Settings.ReadOnly)
    auc.Settings.Save();

我注意到,当我将“嵌入互操作类型”切换为 false 时,它​​也将“复制本地”切换为 true。使用与上述类似的代码(并且 Embed = true),我能够在 Win7、8 和 10 上查询 NotificationLevel,而无需在我的应用程序旁边部署任何版本的“wuapilib.dll”。

于 2015-12-15T22:02:21.427 回答