#windows #rights #comexception
Вопрос:
Уважаемые Коллеги Разработчики,
Я работаю над приложением киоска .NET для Windows 10 (LTSC). В рамках последовательности запуска этого приложения мне нужно проверить и применить все ожидающие обновления Windows. Для этого я использую WUApiLib (см. Код ниже), и он хорошо работает, пока я запускаю приложение с правами администратора. Проблема в том, что мое приложение киоска должно запускаться от имени пользователя. Это немного удивительно, так как я могу выполнять обновления как пользователь, используя графический интерфейс настроек Windows.
Приложение завершает работу с исключением COMException (0x80240044) при попытке загрузить ожидающие обновления.
Любые указания о том, как это можно сделать без прав администратора, будут высоко оценены.
Я теоретизирую, что мне нужно где-то повернуть переключатель, чтобы это сработало, возможно, назначить какое-то правило пользователю. Любые общие рекомендации о том, как определить, что именно послужило причиной исключения, также будут оценены!
Питер
Log.Information("Checking for Windows updates ...");
var updateSession = new UpdateSession();
IUpdateSearcher updateSearcher = updateSession.CreateUpdateSearcher();
updateSearcher.Online = true; //set to true if you want to search online
try
{
// Note: BrowseOnly = 0 means "updated that are not considered optional"
var searchResult = updateSearcher.Search("IsInstalled = 0 And IsHidden = 0 And BrowseOnly = 0");
if (searchResult.Updates.Count == 0)
{
Log.Information("No Windows updates found");
}
else
{
Log.Information("Found {0} Windows updates", searchResult.Updates.Count);
foreach (IUpdate update in searchResult.Updates)
{
Log.Information("Found pending update {0}: {1}", update.Title, update.Description);
}
Log.Information("Windows update download started");
var downloader = updateSession.CreateUpdateDownloader();
downloader.Updates = searchResult.Updates;
var x = downloader.Download();
Log.Information("Windows update download ended");
Log.Information("Installing updates");
UpdateCollection updatesToInstall = new UpdateCollection();
foreach (IUpdate update in searchResult.Updates)
{
if (update.IsDownloaded)
updatesToInstall.Add(update);
}
var installer = updateSession.CreateUpdateInstaller();
installer.Updates = updatesToInstall;
var installerResult = installer.Install();
Log.Information("Updates installed, reboot required: {@RebootRequired}", installerResult.RebootRequired);
if(installerResult.RebootRequired)
{
Log.Information("Rebooting to complete installation of updates");
Restart();
}
}
}
catch(COMException e)
{
if (e.HResult == unchecked((int)0x80240044))
{
throw new Exception("Access denied");
}
else
{
throw e;
}
}
catch (Exception ex)
{
Log.Error(ex, "Exception raised while updating Windows");
}
Комментарии:
1. Код ошибки
0x80240044
таковWU_E_PER_MACHINE_UPDATE_ACCESS_DENIED
. Может быть, это объясняет, в чем дело.