SystemUpdateManager Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- 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
El proceso de actualización del sistema tiene los siguientes estados:
- Detectar. Determine si hay paquetes de actualización disponibles.
- Descargue. Descargue los paquetes de actualización desde el servidor.
- Fase. Desempaquetar los paquetes de actualización y almacenarlos provisionalmente para confirmarlos más adelante.
- 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.
- Confirmación. Arranque en el sistema operativo de actualización que muestra los engranajes mientras se confirman los cambios de actualización del sistema.
- 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:
- Novedades el campo de estado.
- Novedades la hora de comprobación de la última actualización.
- Novedades el estado de VisualStateManager.
- Novedades barras de progreso para los estados con progreso.
- 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. |