Windows Update 時の RestartManager によるアプリの強制終了?

あげびだし 20 評価のポイント
2024-09-12T07:10:28.6+00:00

こんにちは。

以下のような現象があって、原因と対策を検討しています。

お知恵を拝借できればと、質問させていただきます。

環境

OS : Microsoft Windows 10 Enterprise LTSC XYZ : C# (Visusal Studio 2019/.NET Framework 4.7.2)

現象

ある装置の状態を一定周期で監視して、その結果をウェブサーバーにFTPするアプリケーション XYZ があります。

このアプリケーションがしばしば停止していたのですが、 イベントログ(アプリケーションログ)を見てみると、

XYZが停止したいずれの日時にも、

アプリケーションまたはサービス 'XYZ' をシャットダウンしています。 (ソース:RestartManager, イベントID:10002)

がロギングされていました。 前後のほかのログ内容から、Windows Update処理がされていたように見受けられます。

質問

マイクロソフトのサイトを参照して
https://learn.microsoft.com/ja-jp/windows/win32/rstmgr/about-restart-manager)
RestartManager は Windows Update等 があった際に端末再起動の機会を減らす仕組みであると解釈したのですが、ここに、

再起動マネージャーは、次の順序でアプリケーションを停止し、アプリケーションが更新された後、 再起動のために登録されているアプリケーションを逆の順序で再起動します。 1.GUI アプリケーション 2.コンソール アプリケーション 3.Windows サービス 4.Windows エクスプローラー

とありました。

  1. XYZ は RestartManager によって強制終了させられたと思っているのですが、その見立ては正しいでしょうか。
  2. RestartManagerにより停止はされるが再起動されない理由は何が考えられますでしょうか。 ちなみに、XYZはコーディング上、RestartManagerのことは特に何も考慮していないアプリケーションになります。
  3. XYZがRestartManagerによってシャットダウンされないようにできるのでしょうか。 あるいは、シャットダウンされた後にRestartManagerによって再起動されるようにするにはどうすれば良いのでしょうか。
  4. XYZに限らず、PC上ではいろいろなアプリケーションを動作させると思うのですが、 それらもやはりRestartManagerによってしばしば落とされるものなのでしょうか。

よろしくお願いいたします。

ビジネス向け Windows | IT プロフェッショナル用 Windows クライアント | ユーザー エクスペリエンス | その他
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 12,206 評価のポイント MVP ボランティア モデレーター
    2024-09-13T03:51:24.2666667+00:00

    アプリケーションXYZがサービスなら、サービスの自動再開の設定で再起動されると思うので、GUIあるいはコンソールアプリケーションだとして。

    再起動マネージャー/アプリケーションのガイドライン

    再起動マネージャーは、lParam パラメーターが ENDSESSION_CLOSEAPP (0x1) に設定されたWM_QUERYENDSESSION通知を送信して、GUI アプリケーションに対してシャットダウンを照会します。
    GUI アプリケーションは、WM_QUERYENDSESSIONメッセージをリッスンし、アプリケーションがシャットダウンして再起動する準備ができている場合は TRUE の値を返す必要があります。
    アプリケーションが FALSE の値を返さない場合、再起動マネージャーは、lParam パラメーターを ENDSESSION_CLOSEAPP(0x1) に設定し、wparamパラメーターをTRUEに設定して、WM_ENDSESSIONメッセージを送信します。
    アプリケーションは、WM_ENDSESSIONメッセージを受信した場合にのみシャットダウンする必要があります。

    GUI アプリケーションはWM_ENDSESSION メッセージを受信すると、アプリケーションは、指定されたタイムアウト期間内にシャットダウンするように準備する必要があります。

    アプリケーションは、 RegisterApplicationRestart関数を使用して再起動のために登録する必要があります。
    再起動マネージャーは、再起動のために登録されているアプリケーションのみを再起動できます。
    これは、再起動マネージャーがアプリケーションの再起動時に使用するコマンドラインコマンドを決定する唯一の方法です。
    保存された状態またはデータを使用してアプリケーションを再度開く必要がある場合は、その情報をアプリケーションに登録されているコマンドラインコマンドに含める必要があります。

    再起動マネージャーは、更新プログラムをインストールするためにシステムの再起動が必要であると判断した場合、アプリケーションとサービスをシャットダウンしません。

    WM_ENDSESSIONのENDSESSION_CLOSEAPP

    再起動マネージャーは、アプリケーションで置き換える必要があるファイルを使用している場合、システムにサービスを提供する必要がある場合、またはシステム リソースが使い果たされたときに、このメッセージを送信します。 アプリケーションは、 RegisterApplicationRestart関数を使用して再起動するために登録されている場合に再起動されます

    RegisterApplicationRestartの注釈

    更新されるのがWindows アプリケーションの場合、この関数を呼び出す最後の機会は 、WM_QUERYENDSESSION メッセージの処理中です。
    更新されるのがコンソール アプリケーションの場合、インストーラーがアプリケーションのシャットダウンを試みる前に登録を行う必要があります

    まとめると、

    • GUIアプリケーションがWM_QUERYENDSESSIONに対してTRUEを返している場合は、再起動マネージャーはアプリケーションを終了しても良いと判断して、終了させます。
    • GUIアプリケーションならWM_QUERYENDSESSIONを検出して処理を抜けるよりも以前に、RegisterApplicationRestartで再起動してほしいことを登録しておく必要がある。(コンソールならCTRL_C_EVENT)

    つまり、

    • 更新が原因でアプリケーションを終了させられたくなければWM_QUERYENDSESSIONに対してFALSEを返す必要がある。(システムの再起動が必要であるとされる)
    • 終了してもいいが再起動してほしいなら、RegisterApplicationRestartは自動的に実行されるものではないので、明示的にアプリケーションで行っておく必要がある。
    • RegisterApplicationRestartを行っていないなら再起動されない。

    .Net Frameworkのアプリケーションであるならば、OSにインストールされているランタイムに依存しているため、.NetFrameworkのランタイム更新が行われる時にはアプリケーションの終了が必要です。
    .Net Core以降でフレームワーク依存(=ランタイムを共有)での配置であるなら、.Net Framework同様に、ランタイム更新時にはアプリケーションの終了が必要です。
    .Net Core以降の自己完結型での配置であるなら共有ランタイムを参照しないので、終了の必要はありません。(より低レベルのC++などのランタイム更新の場合には影響は受ける可能性はある)

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。