Поделиться через


SystemUpdateManager Класс

Определение

SystemUpdateManager позволяет интерактивно управлять обновлениями системы.

public ref class SystemUpdateManager abstract sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.System.SystemManagementContract, 393216)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class SystemUpdateManager final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.System.SystemManagementContract), 393216)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public static class SystemUpdateManager
Public Class SystemUpdateManager
Наследование
Object Platform::Object IInspectable SystemUpdateManager
Атрибуты

Требования к Windows

Семейство устройств
Windows 10, version 1809 (появилось в 10.0.17763.0)
API contract
Windows.System.SystemManagementContract (появилось в v6.0)

Примеры

Пример кода SystemUpdateManager

Комментарии

SystemUpdateFlow

Процесс обновления системы имеет следующие состояния:

  1. Обнаружение. Определите, доступны ли какие-либо пакеты обновления.
  2. Скачайте компоненты. Скачайте пакеты обновления с сервера.
  3. Этап. Распакуйте пакеты обновления и подготовьте их для фиксации позже.
  4. Дождитесь перезагрузки в ОС обновления. Обновление ОС отображает шестеренки на Windows 10 IoT Базовая во время фиксации изменений операционной системы.
  5. Фиксация. Загрузка в ОС обновления, которая показывает шестеренки во время фиксации изменений обновления системы.
  6. Перезагрузитесь в обновленную основную ОС. На этом этапе процесс обновления завершен.

Установка пакета обновления включает в себя промежуточное хранение пакета обновления путем извлечения файлов и параметров в промежуточную область, а затем фиксации промежуточных изменений. Пакеты обновления нельзя откатить Windows 10 IoT Базовая после начала этапа фиксации. Незафиксированные пакеты обновления, которые были только промежуточными, при необходимости можно отменить путем отмены обновления. После запуска процесса фиксации его невозможно прервать.

Процесс автоматического обновления контролируется политикой. Изготовитель оборудования может управлять политикой с помощью диспетчера политик, например MDM или DUC (центр обновления устройств).

Интерактивные сеансы процесса обновления управляются пользователем устройства. Политики, которые откладывают процесс автоматического обновления, могут быть переопределены во время интерактивного сеанса обновления. Например, пользователь может проверить наличие пакетов обновлений и скачать их с помощью интерактивного сеанса процесса, если сеанс автоматического обновления будет заблокирован от выполнения этих действий текущими политиками. Интерактивный процесс обновления также может подготовить пакеты обновления. Промежуточные пакеты обновления распаковывает пакеты и подготавливает файлы и параметры в пакете для фиксации.

После скачивания и промежуточной загрузки пакетов обновления разработчик может продолжить процесс интерактивного обновления, перезагрузив ос обновления и зафиксировав пакеты обновления. Ос обновления — это очень небольшая ОС, которая имеет единственную цель фиксации пакетов обновления. На Windows 10 IoT Базовая в ОС обновления отображается экран с движущимися шестеренками. Перезагрузку в ОС обновления можно выполнить в ответ на ввод данных пользователем или в рамках бизнес-логики устройства с одним назначением. Необходимо вызвать RebootToCompleteInstall , чтобы перейти к обновлению ОС. Включение и выключение питания или использование альтернативного API для перезагрузки устройства не повлияет. Кроме того, разработчик может подождать следующего запланированного периода перезагрузки процесса автоматического обновления, настроенного текущими политиками (например, вне часы активности).

Перед началом установки

Перед попыткой использовать API SystemUpdateManager приложение должно проверить наличие SystemManagementContract 6.0.

if (!ApiInformation.IsApiContractPresent("Windows.System.SystemManagementContract", 6, 0))
{
    // SystemUpdateManager was first implemented in SystemManagementContract 6.0
    VisualStateManager.GoToState(this, "NotSupported", false);
    UpdateStateTextBlock.Text = "Windows.System.SystemManagementContract 6.0 not found";
}

Затем приложение должно убедиться, что SystemUpdateManager поддерживается в текущей версии и выпуске Windows.

else if (!SystemUpdateManager.IsSupported())
{
    // The API must be supported by the current edition of Windows
    // This can also return false if the application doesn't have the systemManagement capability
    VisualStateManager.GoToState(this, "NotSupported", false);
    UpdateStateTextBlock.Text = "System Update not supported (or systemManagement capability missing)";
}

Отображение состояния обновления системы

Если контракт присутствует и API поддерживается, зарегистрируйтесь для получения уведомлений об изменении состояния:

// Register for state change notifications
SystemUpdateManager.StateChanged += SystemUpdateManager_StateChanged;

private void SystemUpdateManager_StateChanged(object sender, object args)
{
    var action = _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        UpdateVisualState();
    });
}

Инициализируйте пользовательский интерфейс:

// Display update information
UpdateStateTextBlock.Text = GetResourceString(SystemUpdateManager.State.ToString());
LastChecked.Text = SystemUpdateManager.LastUpdateCheckTime.ToString("G");
LastInstalled.Text = SystemUpdateManager.LastUpdateInstallTime.ToString("G");

// Attach ViewModel to ListView
UpdateItemsListView.ItemsSource = _items;

// Initialize the visual state
UpdateVisualState();
UpdateFlightRing();

BlockAutoReboot.IsOn = IsAutomaticRebootBlockOn();

Пример функции кода UpdateVisualState выполняет следующие действия:

  1. Обновления поле состояния.
  2. Обновления время последней проверки обновления.
  3. Обновления состояние VisualStateManager.
  4. Обновления индикаторы выполнения для состояний с ходом выполнения.
  5. Обновления состояние элемента обновления.

Вот этот код:

private void UpdateVisualState()
{
    // Update the state text
    UpdateStateTextBlock.Text = GetResourceString(SystemUpdateManager.State.ToString());

    // Update the last update check time
    LastChecked.Text = SystemUpdateManager.LastUpdateCheckTime.ToString("G");

    // Change the VisualStateManager state based on the current SystemUpdateManagerState
    var state = SystemUpdateManager.State;
    Debug.WriteLine($"State={state}");
    switch (state)
    {
        case SystemUpdateManagerState.Idle:
        case SystemUpdateManagerState.Detecting:
        case SystemUpdateManagerState.Downloading:
        case SystemUpdateManagerState.Installing:
        case SystemUpdateManagerState.RebootRequired:
            VisualStateManager.GoToState(this, SystemUpdateManager.State.ToString(), false);
            break;

        case SystemUpdateManagerState.AttentionRequired:
            AttentionRequiredTextBlock.Text = GetResourceString(SystemUpdateManager.AttentionRequiredReason.ToString());
            VisualStateManager.GoToState(this, "AttentionRequired", false);
            break;

        default:
            VisualStateManager.GoToState(this, "UnknownState", false);
            break;
    }

    // Update progress for states with progress
    switch (SystemUpdateManager.State)
    {
        case SystemUpdateManagerState.Downloading:
            Debug.WriteLine($"Downloading={SystemUpdateManager.DownloadProgress}");
            SessionDownloadProgressBar.Value = SystemUpdateManager.DownloadProgress;
            break;
        case SystemUpdateManagerState.Installing:
            Debug.WriteLine($"Installing={SystemUpdateManager.InstallProgress}");
            SessionDownloadProgressBar.Value = SystemUpdateManager.DownloadProgress;
            SessionInstallProgressBar.Value = SystemUpdateManager.InstallProgress;
            break;
    }

    // Update progress items
    switch (SystemUpdateManager.State)
    {
        case SystemUpdateManagerState.Downloading:
        case SystemUpdateManagerState.Installing:
            foreach (var updateItem in SystemUpdateManager.GetUpdateItems())
            {
                var viewModelItem = _items.Where(x => x.Id == updateItem.Id).FirstOrDefault();
                if (viewModelItem != null)
                {
                    viewModelItem.Update(updateItem);
                }
                else
                {
                    _items.Add(new UpdateItemViewModel(updateItem));
                }
            }
            break;
    }
}

Установка обновлений системы

Если владелец устройства имеет политики автоматического обновления, настроенные таким образом, чтобы он контролировал время начала загрузки, или он разрешил клиентам запускать процесс обновления в интерактивном режиме, вызов SystemUpdateManager.StartInstall проверит наличие пакетов обновления и скачивает пакеты обновления, если они существуют. Это метод запуска и забыть, который выполняется асинхронно, но возвращается немедленно.

Ход процесса обновления можно отслеживать с помощью события StateChanged и свойства State . Если скачивание уже выполняется, вызов немедленно возвращается без ошибок. Если для продолжения требуется внимание пользователя, устанавливается состояние AttentionRequired и значение AttentionRequiredReason . Если возникает неустранимая ошибка, устанавливается состояние ExtendedError и устанавливается свойство ExtendedError .

Чтобы начать обновление, вызовите SystemUpdateManager.StartInstall. Если параметр имеет значение SystemUpdateStartInstallAction.UpToReboot , установка будет продолжаться до тех пор, пока не потребуется перезагрузка. Если параметр имеет значение SystemUpdateStartInstallAction.AllowReboot , установка продолжится и перезагрузится, как только она будет разрешена политикой.

private void CheckForUpdates_Click(object sender, RoutedEventArgs e)
{
    if (SystemUpdateManager.State == SystemUpdateManagerState.Idle)
    {
        SystemUpdateManager.StartInstall(SystemUpdateStartInstallAction.UpToReboot);
    }
}

Для фиксации установки обновления системы иногда требуется перезагрузка. В этом случае SystemUpdateManager.State будет иметь значение SystemUpdateManagerState.RebootRequired. Обратите внимание, что обычная перезагрузка не будет работать для завершения изменений в этом состоянии. Необходимо вызвать SystemUpdateManager.RebootToCompleteInstall или дождаться автоматической запланированной перезагрузки во время окна обновления системы (не в часы активности пользователя).

private void RebootNow_Click(object sender, RoutedEventArgs e)
{
    if (SystemUpdateManager.State == SystemUpdateManagerState.RebootRequired)
    {
        SystemUpdateManager.RebootToCompleteInstall();
    }
}

Управление периодами активности пользователей:

private void ChangeActiveHours_Click(object sender, RoutedEventArgs e)
{
    StartTime.Time = SystemUpdateManager.UserActiveHoursStart;
    EndTime.Time = SystemUpdateManager.UserActiveHoursEnd;
    ActiveHoursErrorText.Visibility = Visibility.Collapsed;
    ActiveHoursPopup.IsOpen = true;
}

private void SaveActiveHours_Click(object sender, RoutedEventArgs e)
{
    bool succeeded = SystemUpdateManager.TrySetUserActiveHours(StartTime.Time, EndTime.Time);
    if (succeeded)
    {
        ActiveHoursPopup.IsOpen = false;
    }
    else
    {
        // Active hours not set display error message
        string format = GetResourceString("ActiveHoursErrorFormat");
        ActiveHoursErrorText.Text = String.Format(format, SystemUpdateManager.UserActiveHoursMax);
        ActiveHoursErrorText.Visibility = Visibility.Visible;
    }
}

Получение последней ошибки обновления системы

Если во время установки обновления системы возникает ошибка, будет задан параметр SystemUpdateManager.LastErrorInfo . Ниже приведен пример отображения сведений о последней ошибке:

var info = SystemUpdateManager.LastErrorInfo;
if (SystemUpdateManager.LastErrorInfo.ExtendedError == null)
{
    NoErrorText.Visibility = Visibility.Visible;
    LastErrorInfoPanel.Visibility = Visibility.Collapsed;
}
else
{
    NoErrorText.Visibility = Visibility.Collapsed;
    LastErrorInfoPanel.Visibility = Visibility.Visible;
    ErrorStateTextBlock.Text = GetResourceString(info.State.ToString());
    HResultTextBlock.Text = (info.ExtendedError == null) ? "No Error Data" : info.ExtendedError.Message;
    IsInteractiveTextBlock.Text = GetResourceString(info.IsInteractive ? "Yes" : "No");
}

Круг тестирования обновлений системы

Тестовый круг может быть пустым, Canary, Selfhost или определяемым пользователем. Если значение пустое, в пользовательском интерфейсе выбирается значение None. В противном случае, если это не Canary или Selfhost, предположим, что кольцо определено пользователем, и сохраните его в списке пользовательского интерфейса.

private void UpdateFlightRing()
{
    var ring = Windows.System.Update.SystemUpdateManager.GetFlightRing();
    for (int i = 0; i < FlightRingCombo.Items.Count(); i++)
    {
        if (ring == FlightRingCombo.Items[i] as string)
        {
            FlightRingCombo.SelectedIndex = i;
            return;
        }
    }

    // if the current ring is non-empty and is not in the list save it to the list
    if (!String.IsNullOrEmpty(ring))
    {
        int index = FlightRingCombo.Items.Count;
        FlightRingCombo.Items.Insert(index, ring);
        FlightRingCombo.SelectedIndex = index;
        return;
    }

    FlightRingCombo.SelectedIndex = 0;
}

private void FlightRingCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var oldRing = SystemUpdateManager.GetFlightRing();
    var newRing = e.AddedItems[0].ToString();
    Debug.WriteLine($"newRing={newRing} oldRing={oldRing}");

    if (oldRing != newRing)
    {
        if (newRing == "None")
        {
            // only set if previous ring was not null or empty
            if (!String.IsNullOrEmpty(oldRing))
            {
                Windows.System.Update.SystemUpdateManager.SetFlightRing(String.Empty);
            }
        }
        else
        {
            Windows.System.Update.SystemUpdateManager.SetFlightRing(newRing);
        }
    }
}

Блокировать автоматические перезагрузки

Чтобы сообщить службе обновлений, что системные обновления запрещены, вызовите SystemUpdateManager.UnblockAutomaticRebootAsync(id), где id — это уникальная строка, состоящая из цифр, букв и дефисов. После завершения выполнения критического кода код должен вызывать SystemUpdateManager.UnblockAutomaticRebootAsync для каждого идентификатора, переданного в BlockAutomaticRebootAsync.

if (BlockAutoReboot.IsOn)
{
    await SystemUpdateManager.BlockAutomaticRebootAsync(Guid.NewGuid().ToString());
}
else
{
    var ids = SystemUpdateManager.GetAutomaticRebootBlockIds();
    foreach(var id in ids)
    {
        bool unblocked = await SystemUpdateManager.UnblockAutomaticRebootAsync(id);
    }
}

Приложение должно объявить возможность systemManagement. Поддерживается только в Windows 10 IoT Базовая.

Свойства

AttentionRequiredReason

Причина, по которой требуется внимание пользователя.

DownloadProgress

Процент хода выполнения скачивания.

ExtendedError

Расширенные сведения об ошибке, если они доступны.

InstallProgress

Процент хода выполнения установки.

LastErrorInfo

Сведения о последнем сбое обновления системы.

LastUpdateCheckTime

Время последней проверки наличия обновлений.

LastUpdateInstallTime

Время установки последнего обновления.

State

Текущее состояние SystemUpdateManager.

UserActiveHoursEnd

Возвращает значение времени окончания периода активности пользователя.

UserActiveHoursMax

Возвращает максимальный интервал между UserActiveHoursStart и UserActiveHoursEnd в часах.

UserActiveHoursStart

Возвращает значение времени начала в часы активности пользователя.

Методы

BlockAutomaticRebootAsync(String)

Блокировать автоматические перезагрузки для обновления до вызова UnblockAutomaticRebootAsync или до тех пор, пока перезагрузка не будет принудительно применена системной политикой.

GetAutomaticRebootBlockIds()

Получение идентификаторов запросов на блокировку автоматической перезагрузки.

GetFlightRing()

Получите кольцо полета.

GetUpdateItems()

Получение списка ожидающих обновления элементов.

IsSupported()

Указывает, поддерживается ли этот API на этом устройстве.

RebootToCompleteInstall()

Перезагружает устройство для завершения установки, если требуется перезагрузка.

SetFlightRing(String)

Задает круг полета.

StartCancelUpdates()

Начните отмену обновлений, если какие-либо обновления выполняются.

StartInstall(SystemUpdateStartInstallAction)

Запустите обнаружение, скачивание и установку ожидающих обновлений.

TrySetUserActiveHours(TimeSpan, TimeSpan)

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

UnblockAutomaticRebootAsync(String)

Разблокируйте автоматические перезагрузки обновления, если они заблокированы.

События

StateChanged

Событие уведомления об изменении свойства состояния.

Применяется к