Compartir a través de


SystemUpdateManager Clase

Definición

SystemUpdateManager permite el control interactivo de las actualizaciones del 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
Herencia
Object Platform::Object IInspectable SystemUpdateManager
Atributos

Requisitos de Windows

Familia de dispositivos
Windows 10, version 1809 (se introdujo en la versión 10.0.17763.0)
API contract
Windows.System.SystemManagementContract (se introdujo en la versión v6.0)

Ejemplos

Código de ejemplo de SystemUpdateManager

Comentarios

SystemUpdateFlow

El proceso de actualización del sistema tiene los siguientes estados:

  1. Detectar. Determine si hay paquetes de actualización disponibles.
  2. Descargue. Descargue los paquetes de actualización desde el servidor.
  3. Fase. Desempaquetar los paquetes de actualización y almacenarlos provisionalmente para confirmarlos más adelante.
  4. Espere a que se reinicie en el sistema operativo de actualización. El sistema operativo de actualización muestra engranajes en Windows 10 IoT Core mientras se confirman los cambios del sistema operativo.
  5. Confirmación. Arranque en el sistema operativo de actualización que muestra los engranajes mientras se confirman los cambios de actualización del sistema.
  6. Reinicie en el sistema operativo principal actualizado. En este momento, se ha completado el proceso de actualización.

La instalación de un paquete de actualización incluye el almacenamiento provisional del paquete de actualización mediante la extracción de los archivos y la configuración en un área de almacenamiento provisional y, después, la confirmación de los cambios almacenados provisionalmente. Los paquetes de actualización no se pueden revertir en Windows 10 IoT Core una vez que comienza la fase de confirmación. Los paquetes de actualización no confirmados que solo se han almacenado provisionalmente se pueden descartar si es necesario cancelando la actualización. Una vez iniciado el proceso de confirmación, no se puede interrumpir.

La directiva controla el proceso de actualización automática. Un OEM puede controlar la directiva a través de un administrador de directivas como MDM o DUC(Device Update Center).

El usuario del dispositivo controla las sesiones de proceso de actualización interactivas. Las directivas que aplazarían el proceso de actualización automática se pueden invalidar durante una sesión de proceso de actualización interactiva. Por ejemplo, el usuario puede buscar paquetes de actualización y descargarlos con una sesión de proceso interactiva cuando se bloquearía que una sesión de proceso de actualización automática realice estas acciones mediante las directivas actuales. El proceso de actualización interactiva también puede almacenar provisionalmente los paquetes de actualización. Los paquetes de actualización de almacenamiento provisional desempaquetan los paquetes y prepara los archivos y la configuración del paquete que se va a confirmar.

Una vez descargados y almacenados provisionalmente los paquetes de actualización, el desarrollador puede continuar el proceso de actualización interactiva reiniciando en el sistema operativo de actualización y confirmando los paquetes de actualización. El sistema operativo de actualización es un sistema operativo muy pequeño que tiene el único propósito de confirmar paquetes de actualización. En Windows 10 IoT Core el sistema operativo de actualización muestra una pantalla con engranajes móviles. El reinicio en el sistema operativo de actualización se puede realizar en respuesta a la entrada del usuario o como parte de la lógica de negocios de un único dispositivo de propósito. Se debe llamar a RebootToCompleteInstall para continuar con el sistema operativo de actualización. La activación y desactivación de la alimentación o el uso de una API alternativa para reiniciar el dispositivo no tendrá ningún efecto. Como alternativa, el desarrollador puede optar por esperar hasta la siguiente ventana de reinicio del proceso de actualización automática programada según lo configurado por las directivas actuales (fuera de las horas activas por ejemplo).

Antes de la instalación

Antes de intentar usar la API SystemUpdateManager , la aplicación debe comprobar que 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";
}

A continuación, la aplicación debe asegurarse de que SystemUpdateManager es compatible con la versión y edición actuales de 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)";
}

Mostrar el estado de actualización del sistema

Si el contrato está presente y se admite la API, registre las notificaciones de cambio 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();
    });
}

Inicialice la interfaz de usuario:

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

La función de código de ejemplo UpdateVisualState hace lo siguiente:

  1. Novedades el campo de estado.
  2. Novedades la hora de comprobación de la última actualización.
  3. Novedades el estado de VisualStateManager.
  4. Novedades barras de progreso para los estados con progreso.
  5. Novedades el estado del elemento de actualización.

Este es el código:

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

Instalación de actualizaciones del sistema

Si el propietario del dispositivo tiene directivas de proceso de actualización automática configuradas para que controlen cuándo se inician las descargas, o si decide permitir a los clientes iniciar el proceso de actualización de forma interactiva, llamar a SystemUpdateManager.StartInstall comprobará si hay paquetes de actualización y descargará los paquetes de actualización si existen. Se trata de un método fire-and-forget que se ejecuta de forma asincrónica, pero devuelve inmediatamente.

Se puede realizar un seguimiento del progreso del proceso de actualización a través del evento StateChanged y la propiedad State . Si una descarga ya está en curso, la llamada se devuelve inmediatamente sin errores. Si se necesita atención del usuario para continuar, el estado se establece en AttentionRequired y se establece AttentionRequiredReason . Si se produce un error irrecuperable, el estado se establece en ExtendedError y se establece la propiedad ExtendedError .

Para comenzar una actualización, llame a SystemUpdateManager.StartInstall. Si el parámetro es SystemUpdateStartInstallAction.UpToReboot , la instalación continuará hasta que se requiera un reinicio. Si el parámetro es SystemUpdateStartInstallAction.AllowReboot , la instalación continuará y se reiniciará en cuanto la directiva lo permita.

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

Para confirmar una instalación de actualización del sistema, a veces se requiere un reinicio. En este caso SystemUpdateManager.State será igual a SystemUpdateManagerState.RebootRequired. Tenga en cuenta que un reinicio normal no funcionará para finalizar los cambios en este estado. Debe llamar a SystemUpdateManager.RebootToCompleteInstall o esperar a que se produzca el reinicio programado automáticamente durante las ventanas de actualización del sistema (fuera de las horas activas del usuario).

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

Administrar horas activas de usuario:

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

Obtención del último error de actualización del sistema

Si se produce un error durante la instalación de una actualización del sistema, se establecerá SystemUpdateManager.LastErrorInfo . Este es un ejemplo de cómo mostrar la última información de error:

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

Anillo piloto de actualización del sistema

El anillo de vuelo puede estar vacío, Canary, Selfhost o definido por el usuario. Si el valor está vacío, se selecciona "None" en la interfaz de usuario. De lo contrario, si no es Canary o Selfhost, suponga que el anillo está definido por el usuario y guárdelo en la lista de la interfaz de usuario.

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 reinicios automáticos

Para indicar al servicio de actualización que no se permiten las actualizaciones del sistema, llame a SystemUpdateManager.UnblockAutomaticRebootAsync(id) donde id es una cadena única compuesta de números, letras y guiones. Cuando se completa la ejecución de código crítica, el código debe llamar a SystemUpdateManager.UnblockAutomaticRebootAsync para cada identificador que se pasó a 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);
    }
}

La aplicación debe declarar la funcionalidad systemManagement. Solo se admite en Windows 10 IoT Core.

Propiedades

AttentionRequiredReason

Motivo por el que se requiere atención del usuario.

DownloadProgress

Porcentaje de progreso de descarga.

ExtendedError

Información de error extendida si está disponible.

InstallProgress

Porcentaje de progreso de instalación.

LastErrorInfo

Información sobre la última actualización del sistema con errores.

LastUpdateCheckTime

Hora de la última comprobación de actualizaciones.

LastUpdateInstallTime

Hora de la última instalación de actualización.

State

Estado actual del SystemUpdateManager.

UserActiveHoursEnd

Obtiene el valor de hora de finalización de horas activas del usuario.

UserActiveHoursMax

Obtiene el intervalo máximo permitido entre UserActiveHoursStart y UserActiveHoursEnd en horas.

UserActiveHoursStart

Obtiene el valor de hora de inicio de horas activas del usuario.

Métodos

BlockAutomaticRebootAsync(String)

Bloquee los reinicios automáticos de la actualización hasta que se llame a UnblockAutomaticRebootAsync o hasta que la directiva del sistema aplique el reinicio.

GetAutomaticRebootBlockIds()

Obtenga los identificadores de las solicitudes de bloqueo de reinicio automático.

GetFlightRing()

Consigue el anillo de vuelo.

GetUpdateItems()

Obtiene una lista de elementos de actualización pendientes.

IsSupported()

Indica si esta API se admite en este dispositivo.

RebootToCompleteInstall()

Reinicia el dispositivo para completar la instalación, si se requiere un reinicio.

SetFlightRing(String)

Establece el anillo de vuelo.

StartCancelUpdates()

Comience a cancelar las actualizaciones si hay alguna actualización en curso.

StartInstall(SystemUpdateStartInstallAction)

Inicie la detección, descarga e instalación de actualizaciones pendientes.

TrySetUserActiveHours(TimeSpan, TimeSpan)

Intente establecer las horas activas definidas por el usuario durante las que no se permitirán los reinicios automáticos de la actualización.

UnblockAutomaticRebootAsync(String)

Desbloquee los reinicios automáticos de la actualización, si está bloqueado.

Eventos

StateChanged

Evento de notificación de cambio de propiedad de estado.

Se aplica a