Использование API центра обновления Windows (WUApiLib) без прав администратора

#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 . Может быть, это объясняет, в чем дело.