Bagikan melalui


SystemUpdateManager Kelas

Definisi

SystemUpdateManager memungkinkan kontrol interaktif pembaruan sistem.

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
Warisan
Object Platform::Object IInspectable SystemUpdateManager
Atribut

Persyaratan Windows

Rangkaian perangkat
Windows 10, version 1809 (diperkenalkan dalam 10.0.17763.0)
API contract
Windows.System.SystemManagementContract (diperkenalkan dalam v6.0)

Contoh

Kode Sampel SystemUpdateManager

Keterangan

SystemUpdateFlow

Proses pembaruan sistem memiliki status berikut:

  1. Deteksi. Tentukan apakah ada paket pembaruan yang tersedia.
  2. Download. Unduh paket pembaruan dari server.
  3. Tahapan. Buka kemasan paket pembaruan dan tahapkan untuk diterapkan nanti.
  4. Tunggu mulai ulang ke OS Pembaruan. OS Pembaruan menunjukkan gigi pada Windows 10 IoT Core saat perubahan OS sedang dilakukan.
  5. Penerapan. Boot ke OS Pembaruan yang menunjukkan gigi saat perubahan pembaruan sistem dilakukan.
  6. Reboot ke OS Utama yang diperbarui. Pada titik ini proses pembaruan selesai.

Menginstal paket pembaruan mencakup penahapan paket pembaruan dengan mengekstrak file dan pengaturan ke area penahapan, lalu kemudian melakukan perubahan bertahap. Paket pembaruan tidak dapat digulung balik Windows 10 IoT Core setelah fase penerapan dimulai. Paket pembaruan yang belum dikomit yang hanya ditahapkan dapat dibuang jika perlu dengan membatalkan pembaruan. Setelah proses penerapan dimulai, proses tersebut tidak dapat diinterupsi.

Proses pembaruan otomatis dikendalikan oleh kebijakan. OEM dapat mengontrol kebijakan melalui manajer kebijakan seperti MDM, atau DUC(Device Update Center).

Sesi proses pembaruan interaktif dikendalikan oleh pengguna perangkat. Kebijakan yang akan menumpahkan proses pembaruan otomatis dapat ditimpa selama sesi proses pembaruan interaktif. Misalnya pengguna dapat memindai paket pembaruan, dan mengunduhnya dengan sesi proses interaktif ketika sesi proses pembaruan otomatis akan diblokir agar tidak melakukan tindakan ini oleh kebijakan saat ini. Proses pembaruan interaktif juga dapat menahapkan paket pembaruan. Paket pembaruan penahapan membuka kemasan paket dan menyiapkan file dan pengaturan dalam paket yang akan diterapkan.

Setelah paket pembaruan diunduh dan dipentaskan, proses pembaruan interaktif dapat dilanjutkan oleh pengembang dengan me-reboot ke OS Pembaruan dan menerapkan paket pembaruan. OS Pembaruan adalah OS yang sangat kecil yang memiliki satu-satunya tujuan untuk menerapkan paket pembaruan. Pada Windows 10 IoT Core UPDATE OS menampilkan layar dengan gigi bergerak. Me-reboot ke os pembaruan dapat dilakukan sebagai respons terhadap input pengguna atau sebagai bagian dari logika bisnis dari satu perangkat tujuan. RebootToCompleteInstall harus dipanggil untuk melanjutkan ke OS Pembaruan. Menyalakan dan mematikan daya, atau menggunakan API alternatif untuk me-reboot perangkat tidak akan berpengaruh. Atau pengembang dapat memilih untuk menunggu hingga jendela reboot proses pembaruan otomatis terjadwal berikutnya seperti yang dikonfigurasi oleh kebijakan saat ini (di luar jam aktif misalnya.)

Sebelum Anda memasang

Sebelum mencoba menggunakan SYSTEMUpdateManager API, aplikasi harus memverifikasi bahwa SystemManagementContract 6.0 ada.

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

Selanjutnya aplikasi harus memastikan bahwa SystemUpdateManager didukung pada versi dan edisi Windows saat ini.

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

Menampilkan status pembaruan sistem

Jika kontrak ada dan API didukung, maka daftar untuk pemberitahuan perubahan status:

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

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

Menginisialisasi antarmuka pengguna:

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

Fungsi kode sampel UpdateVisualState melakukan hal berikut:

  1. Updates bidang status.
  2. Updates waktu pemeriksaan pembaruan terakhir.
  3. Updates status VisualStateManager.
  4. Updates bilah kemajuan untuk status yang sedang berlangsung.
  5. Updates status item pembaruan.

Berikut kodenya:

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

Instal pembaruan sistem

Jika pemilik perangkat memiliki kebijakan proses pembaruan otomatis yang dikonfigurasi sehingga mereka mengontrol kapan pengunduhan dimulai, atau mereka memilih untuk memungkinkan pelanggan memulai proses pembaruan secara interaktif maka memanggil SystemUpdateManager.StartInstall akan memeriksa paket pembaruan dan mengunduh paket pembaruan jika ada. Ini adalah metode fire-and-forget yang berjalan secara asinkron tetapi segera kembali.

Kemajuan proses pembaruan dapat dilacak melalui peristiwa StateChanged dan properti State . Jika unduhan sudah berlangsung, panggilan akan segera kembali tanpa kesalahan. Jika perhatian pengguna diperlukan untuk melanjutkan status diatur ke AttentionRequired dan AttentionRequiredReason diatur. Jika terjadi kesalahan yang tidak dapat dipulihkan, status diatur ke ExtendedError, dan properti ExtendedError diatur.

Untuk memulai pembaruan, panggil SystemUpdateManager.StartInstall. Jika parameternya adalah SystemUpdateStartInstallAction.UpToReboot , penginstalan akan dilanjutkan hingga reboot diperlukan. Jika parameternya adalah SystemUpdateStartInstallAction.AllowReboot , penginstalan akan dilanjutkan dan di-boot ulang segera setelah diizinkan oleh kebijakan.

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

Untuk menerapkan penginstalan pembaruan sistem, terkadang reboot diperlukan. Dalam hal ini SystemUpdateManager.State akan sama dengan SystemUpdateManagerState.RebootRequired. Perhatikan bahwa reboot normal tidak akan berfungsi untuk menyelesaikan perubahan dalam status ini. Anda harus memanggil SystemUpdateManager.RebootToCompleteInstall atau menunggu boot ulang yang dijadwalkan secara otomatis terjadi selama jendela pembaruan sistem (di luar jam aktif pengguna).

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

Mengelola jam aktif pengguna:

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

Dapatkan kesalahan pembaruan sistem terakhir

Jika terjadi kesalahan selama penginstalan pembaruan sistem, maka SystemUpdateManager.LastErrorInfo akan diatur. Berikut adalah contoh menampilkan informasi kesalahan terakhir:

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

Cincin penerbangan pembaruan sistem

Cincin penerbangan bisa kosong, Canary, Selfhost, atau ditentukan pengguna. Jika nilai kosong, maka 'Tidak Ada' dipilih di UI. Jika tidak, jika bukan Canary atau Selfhost, asumsikan bahwa cincin ditentukan pengguna dan simpan ke daftar antarmuka pengguna.

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

Memblokir reboot otomatis

Untuk memberi tahu layanan pembaruan bahwa pembaruan sistem tidak diizinkan, panggil SystemUpdateManager.UnblockAutomaticRebootAsync(id) di mana id adalah string unik yang terdiri dari angka, huruf, dan tanda hubung. Ketika eksekusi kode penting selesai, kode harus memanggil SystemUpdateManager.UnblockAutomaticRebootAsync untuk setiap id yang diteruskan ke 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);
    }
}

Aplikasi harus mendeklarasikan kemampuan systemManagement. Hanya didukung pada Windows 10 IoT Core.

Properti

AttentionRequiredReason

Alasan mengapa perhatian pengguna diperlukan.

DownloadProgress

Mengunduh persentase kemajuan.

ExtendedError

Informasi kesalahan yang diperluas jika tersedia.

InstallProgress

Pasang persentase kemajuan.

LastErrorInfo

Informasi tentang pembaruan sistem terakhir yang gagal.

LastUpdateCheckTime

Waktu pemeriksaan terakhir untuk pembaruan.

LastUpdateInstallTime

Waktu penginstalan pembaruan terakhir.

State

Status SystemUpdateManager saat ini.

UserActiveHoursEnd

Mendapatkan nilai waktu akhir jam aktif pengguna.

UserActiveHoursMax

Mendapatkan interval maksimum yang diizinkan antara UserActiveHoursStart dan UserActiveHoursEnd dalam hitungan jam.

UserActiveHoursStart

Mendapatkan nilai waktu mulai jam aktif pengguna.

Metode

BlockAutomaticRebootAsync(String)

Blokir reboot otomatis untuk pembaruan hingga UnblockAutomaticRebootAsync dipanggil atau sampai boot ulang diberlakukan oleh kebijakan sistem.

GetAutomaticRebootBlockIds()

Dapatkan ID permintaan blok reboot otomatis.

GetFlightRing()

Dapatkan cincin penerbangan.

GetUpdateItems()

Dapatkan daftar item pembaruan yang tertunda.

IsSupported()

Menunjukkan apakah API ini didukung pada perangkat ini.

RebootToCompleteInstall()

Reboot perangkat untuk menyelesaikan penginstalan, jika reboot diperlukan.

SetFlightRing(String)

Mengatur cincin penerbangan.

StartCancelUpdates()

Mulai batalkan pembaruan jika ada pembaruan yang sedang berlangsung.

StartInstall(SystemUpdateStartInstallAction)

Mulai deteksi, pengunduhan, dan penginstalan pembaruan yang tertunda.

TrySetUserActiveHours(TimeSpan, TimeSpan)

Cobalah untuk mengatur Jam Aktif yang ditentukan pengguna di mana reboot otomatis untuk pembaruan tidak akan diizinkan.

UnblockAutomaticRebootAsync(String)

Buka blokir boot ulang pembaruan otomatis, jika diblokir.

Acara

StateChanged

Peristiwa pemberitahuan perubahan properti status.

Berlaku untuk