Compartilhar via


SystemUpdateManager Classe

Definição

O SystemUpdateManager permite o controle interativo das atualizações do sistema.

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
Herança
Object Platform::Object IInspectable SystemUpdateManager
Atributos

Requisitos do Windows

Família de dispositivos
Windows 10, version 1809 (introduzida na 10.0.17763.0)
API contract
Windows.System.SystemManagementContract (introduzida na v6.0)

Exemplos

Código de exemplo SystemUpdateManager

Comentários

SystemUpdateFlow

O processo de atualização do sistema tem os seguintes estados:

  1. Detectar. Determine se algum pacote de atualização está disponível.
  2. Baixar. Baixe os pacotes de atualização do servidor.
  3. Fase. Descompacte os pacotes de atualização e prepare-os para serem confirmados posteriormente.
  4. Aguarde a reinicialização no sistema operacional de atualização. O sistema operacional de atualização mostra as engrenagens em Windows 10 IoT Core enquanto as alterações do sistema operacional estão sendo confirmadas.
  5. Commit. Inicialize o sistema operacional de atualização que mostra as engrenagens enquanto as alterações de atualização do sistema são confirmadas.
  6. Reinicialize para o sistema operacional principal atualizado. Neste ponto, o processo de atualização está concluído.

A instalação de um pacote de atualização inclui o preparo do pacote de atualização extraindo os arquivos e as configurações para uma área de preparo e, em seguida, confirmando as alterações em etapas. Os pacotes de atualização não podem ser revertidos em Windows 10 IoT Core depois que a fase de confirmação é iniciada. Pacotes de atualização não confirmados que só foram preparados podem ser descartados se necessário cancelando a atualização. Depois que o processo de confirmação for iniciado, ele não poderá ser interrompido.

O processo de atualização automática é controlado pela política. Um OEM pode controlar a política por meio de um gerenciador de políticas, como MDM ou DUC (Device Update Center).

As sessões de processo de atualização interativa são controladas pelo usuário do dispositivo. As políticas que adiariam o processo de atualização automática podem ser substituídas durante uma sessão interativa de processo de atualização. Por exemplo, o usuário pode verificar se há pacotes de atualização e baixá-los com uma sessão de processo interativo quando uma sessão de processo de atualização automática seria impedida de executar essas ações pelas políticas atuais. O processo de atualização interativa também pode preparar os pacotes de atualização. Os pacotes de atualização de preparo descompactam os pacotes e preparam os arquivos e as configurações no pacote a serem confirmados.

Depois que os pacotes de atualização forem baixados e preparados, o processo de atualização interativa poderá ser continuado pelo desenvolvedor reinicializando o sistema operacional de atualização e confirmando os pacotes de atualização. O sistema operacional update é um sistema operacional muito pequeno que tem a única finalidade de confirmar pacotes de atualização. Em Windows 10 IoT Core o sistema operacional de atualização mostra uma tela com engrenagens móveis. A reinicialização para o sistema operacional de atualização pode ser feita em resposta à entrada do usuário ou como parte da lógica de negócios de um único dispositivo de finalidade. RebootToCompleteInstall deve ser chamado para prosseguir para o sistema operacional de atualização. Ativar e desativar a energia ou usar uma API alternativa para reinicializar o dispositivo não terá efeito. Como alternativa, o desenvolvedor pode optar por aguardar até a próxima janela de reinicialização do processo de atualização automática agendada, conforme configurado pelas políticas atuais (fora do horário ativo, por exemplo.)

Antes da instalação

Antes de tentar usar a API SystemUpdateManager , o aplicativo deve verificar se SystemManagementContract 6.0 está presente.

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";
}

Em seguida, o aplicativo deve garantir que SystemUpdateManager tenha suporte na versão atual e na edição do 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)";
}

Exibindo o estado de atualização do sistema

Se o contrato estiver presente e a API tiver suporte, registre-se para notificações de alteração de estado:

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

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

Inicializar a interface do usuário:

// 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();

A função de código de exemplo UpdateVisualState faz o seguinte:

  1. Atualizações o campo de estado.
  2. Atualizações a hora de verificação da última atualização.
  3. Atualizações o estado VisualStateManager.
  4. Atualizações barras de progresso para estados com progresso.
  5. Atualizações o status do item de atualização.

O código é o seguinte:

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;
    }
}

Instalar atualizações do sistema

Se o proprietário do dispositivo tiver políticas de processo de atualização automática configuradas para que eles controlem quando os downloads forem iniciados ou optarem por permitir que os clientes iniciem o processo de atualização interativamente, chamar SystemUpdateManager.StartInstall verificará se há pacotes de atualização e baixará os pacotes de atualização se eles existirem. Esse é um método fire-and-forget que é executado de forma assíncrona, mas retorna imediatamente.

O progresso do processo de atualização pode ser acompanhado por meio do evento StateChanged e da propriedade State . Se um download já estiver em andamento, a chamada retornará imediatamente sem erro. Se a atenção do usuário for necessária para continuar, o estado será definido como AttentionRequired e AttentionRequiredReason estiver definido. Se ocorrer um erro irrecuperável, o estado será definido como ExtendedError e a propriedade ExtendedError será definida.

Para iniciar uma atualização, chame SystemUpdateManager.StartInstall. Se o parâmetro for SystemUpdateStartInstallAction.UpToReboot , a instalação continuará até que uma reinicialização seja necessária. Se o parâmetro for SystemUpdateStartInstallAction.AllowReboot , a instalação continuará e será reiniciada assim que for permitida pela política.

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

Para confirmar uma instalação de atualização do sistema, às vezes, uma reinicialização é necessária. Nesse caso , SystemUpdateManager.State será igual a SystemUpdateManagerState.RebootRequired. Observe que uma reinicialização normal não funcionará para finalizar as alterações nesse estado. Você deve chamar SystemUpdateManager.RebootToCompleteInstall ou aguardar a reinicialização agendada automaticamente ocorrer durante as janelas de atualização do sistema (fora do horário ativo do usuário).

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

Gerenciar o horário ativo do usuário:

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;
    }
}

Obter o último erro de atualização do sistema

Se ocorrer um erro durante a instalação de uma atualização do sistema, SystemUpdateManager.LastErrorInfo será definido. Aqui está um exemplo de exibição das últimas informações de erro:

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");
}

Anel de versão de pré-lançamento de atualização do sistema

O anel de voo pode estar vazio, Canário, Selfhost ou definido pelo usuário. Se o valor estiver vazio, 'Nenhum' será selecionado na interface do usuário. Caso contrário, se não for Canário ou Selfhost, suponha que o anel seja definido pelo usuário e salve-o na lista de interface do usuário.

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);
        }
    }
}

Bloquear reinicializações automáticas

Para informar ao serviço de atualização que as atualizações do sistema não são permitidas, chame SystemUpdateManager.UnblockAutomaticRebootAsync(id) em que id é uma cadeia de caracteres exclusiva composta por números, letras e traços. Quando a execução crítica do código for concluída, o código deverá chamar SystemUpdateManager.UnblockAutomaticRebootAsync para cada ID passada para 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);
    }
}

O aplicativo deve declarar a funcionalidade systemManagement. Só há suporte no Windows 10 IoT Core.

Propriedades

AttentionRequiredReason

Motivo pelo qual a atenção do usuário é necessária.

DownloadProgress

Percentual de progresso do download.

ExtendedError

Informações de erro estendidas, se disponíveis.

InstallProgress

Percentual de progresso da instalação.

LastErrorInfo

Informações sobre a última atualização do sistema com falha.

LastUpdateCheckTime

Hora da última verificação de atualizações.

LastUpdateInstallTime

Hora da última instalação da atualização.

State

O estado atual do SystemUpdateManager.

UserActiveHoursEnd

Obtém o valor de hora de término do horário ativo do usuário.

UserActiveHoursMax

Obtém o intervalo máximo permitido entre UserActiveHoursStart e UserActiveHoursEnd em horas.

UserActiveHoursStart

Obtém o valor de hora de início do horário ativo do usuário.

Métodos

BlockAutomaticRebootAsync(String)

Bloqueie reinicializações automáticas para atualização até que UnblockAutomaticRebootAsync seja chamado ou até que a reinicialização seja imposta pela política do sistema.

GetAutomaticRebootBlockIds()

Obtenha as IDs de solicitações de bloco de reinicialização automática.

GetFlightRing()

Pegue o anel de vôo.

GetUpdateItems()

Obter lista de itens de atualização pendentes.

IsSupported()

Indica se essa API tem suporte neste dispositivo.

RebootToCompleteInstall()

Reinicializa o dispositivo para concluir a instalação, se for necessária uma reinicialização.

SetFlightRing(String)

Define o anel de vôo.

StartCancelUpdates()

Comece a cancelar atualizações se houver atualizações em andamento.

StartInstall(SystemUpdateStartInstallAction)

Inicie a detecção, o download e a instalação de atualizações pendentes.

TrySetUserActiveHours(TimeSpan, TimeSpan)

Tente definir o Horário Ativo definido pelo usuário durante o qual as reinicializações automáticas para atualização não serão permitidas.

UnblockAutomaticRebootAsync(String)

Desbloqueie reinicializações automáticas de atualização, se bloqueadas.

Eventos

StateChanged

Evento de notificação de alteração de propriedade de estado.

Aplica-se a