2013-05-01 2 views
0

Я сейчас пытаюсь выяснить, как установить обновление Windows, чтобы «позвольте мне выбрать, следует ли устанавливать» вместо «Устанавливать обновления автоматически» на ОС Windows 8.Как программно изменить параметр обновления Windows?

По Check from .NET if Windows Update is enabled я попробовал:

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

После ответа в Change windows updates setting with 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 на «позвольте мне выбрать, следует ли устанавливать»?

+1

Чтобы избавиться от ошибки interop, щелкните правой кнопкой мыши ссылку в Visual Studio и перейдите к ее свойствам и измените «Вставить типы взаимодействия» в значение false. – Arran

+0

@Arran Я вижу, теперь первый вариант работает как минимум. Полезно знать, спасибо! Теперь я могу продолжить свою работу: D – Nolonar

ответ

3

Благодаря Arran, мне удалось сделать шаг в правильном направлении:

Ну, чтобы избавиться от ошибки-взаимодействия, щелкните правой кнопкой мыши на ссылку в Visual Studio и перейти его свойства, и поворот «Вставить типы взаимодействия» в значение false.

Теперь, когда я больше не получаю ошибки взаимодействия, мне удалось сделать вывод; вот код:

// using WUApiLib; 
AutomaticUpdatesClass auc = new AutomaticUpdatesClass(); 
auc.Settings.NotificationLevel = AutomaticUpdatesNotificationLevel.aunlNotifyBeforeInstallation; 
auc.Settings.Save(); 
+0

+1, хорошо сделано для того, чтобы добраться до него :) – Arran

+0

Отлично. Помогает мне много. И человеку, который голосует, почему, черт возьми, вы это сделали?Это может быть совершенно бесполезно для вас, но другие (как и я) считают, что это очень полезно. – swdev

0

Вы можете избежать «тип Interop ... не может быть вложена» ошибка при выходе «Типы Код Interop» правда, и опуская класса суффикс из кода.

Использование new AutomaticUpdates() вместо new AutomaticUpdatesClass()

См this answer для лучшего описания опуская суффикс класса. Говорят .Net 4.0, но это также работает для меня в 4.5.1.

например:

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

Я заметил, что когда я переключился "Вставить Interop Типы" ложь, он также включен "Copy Local" истина. С кодом, аналогичным приведенному выше (и Embed = true), я смог запросить NotificationLevel на Win7, 8 и 10 без развертывания любой версии «wuapilib.dll» вместе с моим приложением.

Смежные вопросы