Partager via


SystemUpdateManager Classe

Définition

SystemUpdateManager permet un contrôle interactif des mises à jour système.

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
Héritage
Object Platform::Object IInspectable SystemUpdateManager
Attributs

Configuration requise pour Windows

Famille d’appareils
Windows 10, version 1809 (introduit dans 10.0.17763.0)
API contract
Windows.System.SystemManagementContract (introduit dans v6.0)

Exemples

Exemple de code SystemUpdateManager

Remarques

SystemUpdateFlow

Le processus de mise à jour du système présente les états suivants :

  1. Détecter. Déterminez si des packages de mise à jour sont disponibles.
  2. Téléchargez. Téléchargez les packages de mise à jour à partir du serveur.
  3. Une phase. Décompressez les packages de mise à jour et mettez-les en place pour qu’ils soient validées ultérieurement.
  4. Attendez le redémarrage dans le système d’exploitation de mise à jour. Le système d’exploitation de mise à jour affiche les engrenages sur Windows 10 IoT Standard pendant la validation des modifications du système d’exploitation.
  5. Commiter. Démarrez dans le système d’exploitation de mise à jour qui affiche les engrenages pendant que les modifications de mise à jour du système sont validées.
  6. Redémarrez dans le système d’exploitation principal mis à jour. À ce stade, le processus de mise à jour est terminé.

L’installation d’un package de mise à jour inclut la mise en lots du package de mise à jour en extrayant les fichiers et les paramètres dans une zone de préproduction, puis en validant ultérieurement les modifications intermédiaires. Les packages de mise à jour ne peuvent pas être restaurés sur Windows 10 IoT Standard une fois la phase de validation commencée. Les packages de mise à jour non validés qui n’ont été intermédiaires que peuvent être ignorés si nécessaire en annulant la mise à jour. Une fois le processus de validation démarré, il ne peut pas être interrompu.

Le processus de mise à jour automatique est contrôlé par la stratégie. Un OEM peut contrôler la stratégie par le biais d’un gestionnaire de stratégies comme MDM ou DUC (Device Update Center).

Les sessions de processus de mise à jour interactives sont contrôlées par l’utilisateur de l’appareil. Les stratégies qui différeraient le processus de mise à jour automatique peuvent être remplacées pendant une session de processus de mise à jour interactive. Par exemple, l’utilisateur peut rechercher les packages de mise à jour et les télécharger avec une session de processus interactive lorsqu’une session de processus de mise à jour automatique est bloquée par les stratégies actuelles. Le processus de mise à jour interactive peut également mettre en scène les packages de mise à jour. Les packages de mise à jour intermédiaires décompressent les packages et préparent les fichiers et les paramètres du package à commiter.

Une fois les packages de mise à jour téléchargés et intermédiaires, le processus de mise à jour interactif peut être poursuivi par le développeur en redémarrant dans le système d’exploitation de mise à jour et en validant les packages de mise à jour. Le système d’exploitation de mise à jour est un très petit système d’exploitation qui a pour seul but de valider les packages de mise à jour. Sur Windows 10 IoT Standard le système d’exploitation de mise à jour affiche un écran avec des engrenages mobiles. Le redémarrage dans le système d’exploitation de mise à jour peut être effectué en réponse à une entrée utilisateur ou dans le cadre de la logique métier d’un appareil à usage unique. RebootToCompleteInstall doit être appelé pour passer au système d’exploitation de mise à jour. L’activation et la désactivation de l’appareil, ou l’utilisation d’une autre API pour redémarrer l’appareil n’aura aucun effet. Le développeur peut également choisir d’attendre la prochaine fenêtre de redémarrage du processus de mise à jour automatique planifiée, telle que configurée par les stratégies actuelles (en dehors des heures d’activité, par exemple).

Avant l’installation

Avant d’essayer d’utiliser l’API SystemUpdateManager , l’application doit vérifier que SystemManagementContract 6.0 est présent.

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

Ensuite, l’application doit s’assurer que SystemUpdateManager est pris en charge sur la version et l’édition actuelles 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)";
}

Affichage de l’état de mise à jour du système

Si le contrat est présent et que l’API est prise en charge, inscrivez-vous aux notifications de changement d’état :

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

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

Initialisez l’interface utilisateur :

// 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 fonction d’exemple de code UpdateVisualState effectue les opérations suivantes :

  1. Mises à jour le champ d’état.
  2. Mises à jour l’heure de la dernière vérification de la mise à jour.
  3. Mises à jour l’état VisualStateManager.
  4. Mises à jour barres de progression pour les états avec progression.
  5. Mises à jour l’état de l’élément de mise à jour.

Voici le code :

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

Installer les mises à jour système

Si le propriétaire de l’appareil dispose de stratégies de processus de mise à jour automatique configurées pour contrôler le démarrage des téléchargements, ou s’il choisit d’autoriser les clients à démarrer le processus de mise à jour de manière interactive, l’appel de SystemUpdateManager.StartInstall recherche les packages de mise à jour et télécharge les packages de mise à jour s’ils existent. Il s’agit d’une méthode fire-and-forget qui s’exécute de façon asynchrone mais retourne immédiatement.

La progression du processus de mise à jour peut être suivie via l’événement StateChanged et la propriété State . Si un téléchargement est déjà en cours, l’appel retourne immédiatement sans erreur. Si l’attention de l’utilisateur est nécessaire pour continuer, l’état est défini sur AttentionRequired et attentionRequiredReason est défini. Si une erreur irrécupérable se produit, l’état est défini sur ExtendedError et la propriété ExtendedError est définie.

Pour commencer une mise à jour, appelez SystemUpdateManager.StartInstall. Si le paramètre est SystemUpdateStartInstallAction.UpToReboot , l’installation se poursuit jusqu’à ce qu’un redémarrage soit requis. Si le paramètre est SystemUpdateStartInstallAction.AllowReboot , l’installation se poursuit et redémarre dès qu’elle est autorisée par la stratégie.

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

Pour valider une installation de mise à jour système, un redémarrage est parfois nécessaire. Dans ce cas , SystemUpdateManager.State est égal à SystemUpdateManagerState.RebootRequired. Notez qu’un redémarrage normal ne fonctionnera pas pour finaliser les modifications dans cet état. Vous devez appeler SystemUpdateManager.RebootToCompleteInstall ou attendre que le redémarrage automatiquement planifié se produise pendant les fenêtres de mise à jour du système (en dehors des heures d’activité de l’utilisateur).

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

Gérer les heures d’activité de l’utilisateur :

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

Obtenir l’erreur de la dernière mise à jour du système

Si une erreur se produit lors de l’installation d’une mise à jour système, SystemUpdateManager.LastErrorInfo est défini. Voici un exemple d’affichage des dernières informations d’erreur :

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

Anneau de version d’évaluation de la mise à jour du système

L’anneau de vol peut être vide, Canary, Selfhost ou défini par l’utilisateur. Si la valeur est vide, « None » est sélectionné dans l’interface utilisateur. Sinon, s’il n’est pas Canary ou Selfhost, supposez que l’anneau est défini par l’utilisateur et enregistrez-le dans la liste de l’interface utilisateur.

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

Bloquer les redémarrages automatiques

Pour indiquer au service de mise à jour que les mises à jour système ne sont pas autorisées, appelez SystemUpdateManager.UnblockAutomaticRebootAsync(id)id est une chaîne unique composée de chiffres, de lettres et de tirets. Une fois l’exécution du code critique terminée, le code doit appeler SystemUpdateManager.UnblockAutomaticRebootAsync pour chaque ID passé dans 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);
    }
}

L’application doit déclarer la fonctionnalité systemManagement. Pris en charge uniquement sur Windows 10 IoT Standard.

Propriétés

AttentionRequiredReason

Raison pour laquelle l’attention de l’utilisateur est requise.

DownloadProgress

Pourcentage de progression du téléchargement.

ExtendedError

Informations d’erreur étendues si disponibles.

InstallProgress

Pourcentage de progression de l’installation.

LastErrorInfo

Informations sur la dernière mise à jour du système ayant échoué.

LastUpdateCheckTime

Heure de la dernière vérification des mises à jour.

LastUpdateInstallTime

Heure de la dernière installation de la mise à jour.

State

État actuel de SystemUpdateManager.

UserActiveHoursEnd

Obtient la valeur d’heure de fin des heures d’activité de l’utilisateur.

UserActiveHoursMax

Obtient l’intervalle maximal autorisé entre UserActiveHoursStart et UserActiveHoursEnd en heures.

UserActiveHoursStart

Obtient la valeur d’heure de début des heures d’activité de l’utilisateur.

Méthodes

BlockAutomaticRebootAsync(String)

Bloquez les redémarrages automatiques pour la mise à jour jusqu’à ce que UnblockAutomaticRebootAsync soit appelé ou jusqu’à ce que le redémarrage soit appliqué par la stratégie système.

GetAutomaticRebootBlockIds()

Obtenez les ID des demandes de bloc de redémarrage automatique.

GetFlightRing()

Obtenez l’anneau de vol.

GetUpdateItems()

Obtenir la liste des éléments de mise à jour en attente.

IsSupported()

Indique si cette API est prise en charge sur cet appareil.

RebootToCompleteInstall()

Redémarre l’appareil pour terminer l’installation, si un redémarrage est nécessaire.

SetFlightRing(String)

Définit l’anneau de vol.

StartCancelUpdates()

Commencez à annuler les mises à jour si des mises à jour sont en cours.

StartInstall(SystemUpdateStartInstallAction)

Démarrez la détection, le téléchargement et l’installation des mises à jour en attente.

TrySetUserActiveHours(TimeSpan, TimeSpan)

Essayez de définir les heures d’activité définies par l’utilisateur pendant lesquelles les redémarrages automatiques pour la mise à jour ne seront pas autorisés.

UnblockAutomaticRebootAsync(String)

Débloquer les redémarrages automatiques des mises à jour, s’ils sont bloqués.

Événements

StateChanged

Événement de notification de modification de propriété d’état.

S’applique à