WUA IUpdate2.CopyToCache выбрасывает WU_E_INVALID_UPDATE_TYPE - PullRequest
0 голосов
/ 21 ноября 2011

У меня проблемы с запуском API-интерфейса WUA.Я хочу вручную скопировать файл обновления на компьютер и затем передать его в АВП.Вызов IUpdate2.CopyToCache вызывает ошибку, которая меня немного смущает.Обновление окончательно правильно.Использование имени файла, которое даже не существует, также приводит к той же ошибке!

Есть еще одна странная вещь, которую я заметил: я искал обновление и нашел его в API, но запись на диск не работаетсовсем.Код выполняется, и нет сообщений об ошибках, но каталог остается пустым.

IUpdateSearcher updateSearcher = new UpdateSearcher();
updateSearcher.Online = true;

ISearchResult searchResult = updateSearcher.Search("UpdateID='" + wsusID + "'");
if (searchResult.ResultCode == OperationResultCode.orcSucceeded && searchResult.Updates.Count == 1)
{
  IUpdate update = searchResult.Updates[0];
  Console.WriteLine(update.KBArticleIDs[0]);
  Console.WriteLine(update.Title);
  Console.WriteLine(update.Identity.UpdateID);
  Console.WriteLine("IsInstalled=" + update.IsInstalled);
  Console.WriteLine("IsDownloaded=" + update.IsDownloaded);

  // this line does nothing                  
  update.CopyFromCache("C:\\Test\\", true);

  // this returns error code 0
  int errorCode = Marshal.GetLastWin32Error();
  var update2 = (IUpdate2)update;
  var s = new StringCollection();
  // this file has been manually downloaded and exists!
  s.Add(@"C:\test\Windows6.1-KB2518869-x64.msu");

  // this throws the exception (0x80240026 - WU_E_INVALID_UPDATE_TYPE)
  update2.CopyToCache(s);
}

Почему CopyFromCache ничего не делает и почему CopyToCache выдает это странное исключение, даже если файл не существует?1006 *

Справочник по API: http://msdn.microsoft.com/en-us/library/windows/desktop/aa386101(v=VS.85).aspx

1 Ответ

3 голосов
/ 21 ноября 2011

Проблема с вашим кодом в том, что указанное обновление не является реальным обновлением.Это контейнер для пакета обновлений.Попробуйте скопировать файл в кеш для связанного обновления.

    // Example
    Console.WriteLine("Bundled update=" + update.BundledUpdates[0].Title);
   var s = new StringCollection();
   s.Add(@"C:\test\Windows6.1-KB2518869-x64.msu");
   ((IUpdate2)update.BundledUpdates[0]).CopyToCache(s);
...