SystemUpdateManager クラス

定義

SystemUpdateManager を使用すると、システム更新プログラムを対話的に制御できます。

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
継承
Object Platform::Object IInspectable SystemUpdateManager
属性

Windows の要件

デバイス ファミリ
Windows 10, version 1809 (10.0.17763.0 で導入)
API contract
Windows.System.SystemManagementContract (v6.0 で導入)

SystemUpdateManager サンプル コード

注釈

SystemUpdateFlow

システム更新プロセスの状態は次のとおりです。

  1. 検出。 更新プログラム パッケージが使用可能かどうかを判断します。
  2. ダウンロードします。 サーバーから更新プログラム パッケージをダウンロードします。
  3. ステージ。 更新パッケージを展開し、後でコミットするようにステージングします。
  4. Update OS が再起動するまで待ちます。 OS の変更がコミットされている間、更新 OS にはWindows 10 IoT Coreに歯車が表示されます。
  5. コミット。 システム更新プログラムの変更がコミットされている間に歯車を表示する Update OS を起動します。
  6. 更新されたメイン OS に再起動します。 この時点で、更新プロセスが完了します。

更新プログラム パッケージのインストールには、ファイルと設定をステージング領域に抽出し、後でステージングされた変更をコミットすることで、更新プログラム パッケージをステージングする必要があります。 コミット フェーズが開始されると、更新パッケージをWindows 10 IoT Coreにロールバックすることはできません。 ステージングされただけのコミットされていない更新パッケージは、更新プログラムを取り消すことによって、必要に応じて破棄できます。 コミット プロセスが開始されると、それを中断することはできません。

自動更新プロセスはポリシーによって制御されます。 OEM は、MDM やDUC(Device Update Center) などのポリシー マネージャーを使用してポリシーを制御できます。

対話型の更新プロセス セッションは、デバイス ユーザーによって制御されます。 自動更新プロセスを延期するポリシーは、対話型の更新プロセス セッション中にオーバーライドされる可能性があります。 たとえば、ユーザーは更新プログラム パッケージをスキャンし、自動更新プロセス セッションが現在のポリシーによってこれらのアクションの実行をブロックされる場合に、対話型プロセス セッションでダウンロードできます。 対話型の更新プロセスでは、更新パッケージをステージングすることもできます。 ステージング更新パッケージはパッケージを展開し、コミットするパッケージ内のファイルと設定を準備します。

更新パッケージがダウンロードされてステージングされると、Update OS を再起動して更新パッケージをコミットすることで、開発者が対話型の更新プロセスを続行できます。 Update OS は、更新プログラム パッケージをコミットする唯一の目的を持つ非常に小さな OS です。 Windows 10 IoT Core更新 OS には、歯車が動く画面が表示されます。 Update OS への再起動は、ユーザー入力に応じて、または単一目的デバイスのビジネス ロジックの一部として実行できます。 Update OS に進むには、RebootToCompleteInstall を呼び出す必要があります。 電源のオンとオフを切り替えたり、代替 API を使用してデバイスを再起動したりしても、効果はありません。 または、開発者は、現在のポリシーによって構成されている次のスケジュールされた自動更新プロセスの再起動ウィンドウ (たとえば、アクティブな時間外) まで待機することを選択できます。

インストールする前に

SystemUpdateManager API を使用する前に、アプリケーションで SystemManagementContract 6.0 が存在することを確認する必要があります。

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

次に、アプリケーションで SystemUpdateManager が 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)";
}

システム更新状態の表示

コントラクトが存在し、API がサポートされている場合は、状態変更通知に登録します。

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

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

ユーザー インターフェイスを初期化します。

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

UpdateVisualState サンプル コード関数は、次の処理を行います。

  1. 状態フィールドを更新します。
  2. 最後の更新プログラムのチェック時刻を更新します。
  3. VisualStateManager 状態を更新します。
  4. 進行状況がある状態の進行状況バーを更新します。
  5. 更新アイテムの状態を更新します。

コードは次のとおりです。

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

システム更新プログラムをインストールする

ダウンロードの開始を制御するようにデバイス所有者が自動更新プロセス ポリシーを構成している場合、またはお客様が対話形式で更新プロセスを開始することを選択した場合、 SystemUpdateManager.StartInstall を呼び出すと、更新パッケージの有無が確認され、更新パッケージが存在する場合はダウンロードされます。 これは、非同期的に実行されますが、すぐにを返す fire-and-forget メソッドです。

更新プロセスの進行状況は、 StateChanged イベントと State プロパティを使用して追跡できます。 ダウンロードが既に進行中の場合、呼び出しはエラーなしですぐに返されます。 続行するためにユーザーの注意が必要な場合、状態は AttentionRequired に設定され、 AttentionRequiredReason が設定されます。 回復不可能なエラーが発生した場合、状態は ExtendedError に設定され、 ExtendedError プロパティが設定されます。

更新を開始するには、 SystemUpdateManager.StartInstall を呼び出します。 パラメーターが SystemUpdateStartInstallAction.UpToReboot の場合、再起動が必要になるまでインストールが続行されます。 パラメーターが SystemUpdateStartInstallAction.AllowReboot の場合、ポリシーによって許可されるとすぐにインストールが続行され、再起動されます。

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

システム更新プログラムのインストールをコミットするには、再起動が必要な場合があります。 この場合 、SystemUpdateManager.StateSystemUpdateManagerState.RebootRequired と等しくなります。 通常の再起動では、この状態の変更を完了できません。 SystemUpdateManager.RebootToCompleteInstall を呼び出すか、システム更新ウィンドウ (ユーザーのアクティブ時間外) に自動的にスケジュールされた再起動が発生するまで待つ必要があります。

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

ユーザーのアクティブ時間を管理する:

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

システム更新プログラムの最後のエラーを取得する

システム更新プログラムのインストール中にエラーが発生した場合は、 SystemUpdateManager.LastErrorInfo が設定されます。 最後のエラー情報を表示する例を次に示します。

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

システム更新のフライト リング

フライト リングには、空、カナリア、セルフホスト、またはユーザー定義を指定できます。 値が空の場合、UI で [なし] が選択されます。 それ以外の場合は、Canary または Selfhost でない場合は、リングがユーザー定義であると想定し、UI リストに保存します。

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

自動再起動をブロックする

システムの更新が許可されていないことを更新サービスに通知するには、 SystemUpdateManager.UnblockAutomaticRebootAsync(id) を呼び出します。 ここで、id は数字、文字、ダッシュで構成される一意の文字列です。 重要なコードの実行が完了したら、BlockAutomaticRebootAsync に渡された ID ごとにSystemUpdateManager.UnblockAutomaticRebootAsync を呼び出す必要があります

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

アプリケーションで systemManagement 機能を宣言する必要があります。 Windows 10 IoT Coreでのみサポートされます。

プロパティ

AttentionRequiredReason

ユーザーの注意が必要な理由。

DownloadProgress

ダウンロードの進行状況の割合。

ExtendedError

拡張エラー情報 (使用可能な場合)。

InstallProgress

インストールの進行状況の割合。

LastErrorInfo

最後に失敗したシステム更新に関する情報。

LastUpdateCheckTime

更新プログラムの最終確認時刻。

LastUpdateInstallTime

前回の更新プログラムのインストール時刻。

State

SystemUpdateManager の現在の状態。

UserActiveHoursEnd

ユーザーのアクティブな時間の終了時刻の値を取得します。

UserActiveHoursMax

UserActiveHoursStartUserActiveHoursEnd の間で許容される最大間隔を時間単位で取得します。

UserActiveHoursStart

ユーザーのアクティブ時間の開始時刻の値を取得します。

メソッド

BlockAutomaticRebootAsync(String)

UnblockAutomaticRebootAsync が呼び出されるか、システム ポリシーによって再起動が適用されるまで、更新の自動再起動をブロックします。

GetAutomaticRebootBlockIds()

自動再起動ブロック要求の ID を取得します。

GetFlightRing()

フライト リングを取得します。

GetUpdateItems()

保留中の更新アイテムの一覧を取得します。

IsSupported()

この API がこのデバイスでサポートされているかどうかを示します。

RebootToCompleteInstall()

再起動が必要な場合は、デバイスを再起動してインストールを完了します。

SetFlightRing(String)

フライト リングを設定します。

StartCancelUpdates()

更新プログラムが進行中の場合は、更新の取り消しを開始します。

StartInstall(SystemUpdateStartInstallAction)

保留中の更新プログラムの検出、ダウンロード、インストールを開始します。

TrySetUserActiveHours(TimeSpan, TimeSpan)

更新プログラムの自動再起動が許可されないユーザー定義のアクティブ時間を設定してみてください。

UnblockAutomaticRebootAsync(String)

ブロックされている場合は、自動更新の再起動のブロックを解除します。

イベント

StateChanged

State プロパティ変更通知イベント。

適用対象