#c# #.net #wuapi
#c# #.net #wuapi
Вопрос:
Я использую этот код для получения ожидающих обновлений Windows, а также большей части информации об обновлении:
static List<PendingUpdate> GetPendingUpdates()
{
var updateSession = new UpdateSession();
var updateSearcher = updateSession.CreateUpdateSearcher();
updateSearcher.Online = false; //set to true if you want to search online
List<PendingUpdate> pendingUpdates = new List<PendingUpdate>();
try
{
var searchResult = updateSearcher.Search("IsInstalled=0 And IsHidden=0");
if (searchResult.Updates.Count > 0)
{
Console.WriteLine("There are updates available for installation");
foreach (IUpdate windowsUpdate in searchResult.Updates)
{
PendingUpdate update = new PendingUpdate();
update.Title = windowsUpdate.Title;
update.Description = windowsUpdate.Description;
update.Downloaded = windowsUpdate.IsDownloaded;
update.Urls = new List<string>();
foreach (string url in windowsUpdate.MoreInfoUrls)
{
update.Urls.Add(url);
}
foreach (dynamic category in windowsUpdate.Categories)
{
update.Categories = category.Name ", ";
}
pendingUpdates.Add(update);
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR");
throw ex;
}
return pendingUpdates;
}
Я также использую этот код, чтобы узнать, требуется ли в настоящее время перезагрузка компьютера для завершения установленных обновлений:
static bool needsRestart()
{
ISystemInformation systemInfo = new SystemInformation();
return systemInfo.RebootRequired;
}
Теперь мой вопрос в том, можно ли узнать, требует ли ожидающее обновление перезагрузки компьютера для завершения? В первом коде я получаю объект IUpdate, но я не вижу информации о необходимом перезапуске после установки этого обновления. Есть ли способ получить эту информацию?
Комментарии:
1. Ваш
windowsUpdate
объект должен иметьInstallationBehavior.RebootBehavior
свойство типаInstallationRebootBehavior
. Это может быть либоirbAlwaysRequiresReboot
,irbCanRequestReboot
либоirbNeverReboots
.
Ответ №1:
Для асинхронной установки я использую что-то вроде этого:
rebootRequired = false;
UpdateSession updateSession = new UpdateSession();
updateSession.ClientApplicationID = SusClientID;
IUpdateInstaller updatesInstaller = updateSession.CreateUpdateInstaller();
IInstallationJob job = updatesInstaller.BeginInstall(InstallProgressCallback, installComplete, installState);
// here is your installer code and the checking if the installation is completed
IInstallationProgress jobProgress = job.GetProgress();
for (int updateindex = 0; updateindex < updatesInstaller.Updates.Count; updateindex )
{
IUpdateInstallationResult updateInstallResult = jobProgress.GetUpdateResult(updateindex);
rebootRequired |= updateInstallResult.RebootRequired;
}
if(rebootRequired)
{
// any of the updates need a reboot
}