COM+ アプリケーションは、ユーザーがログオフしたときに Windows での動作を停止する可能性があります

この記事では、ユーザーがログオフしたときに COM+ アプリケーションが Windows で動作を停止する問題の解決策について説明します。

適用対象:Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows 10 - すべてのエディション、Windows 7 Service Pack 1
元の KB 番号: 2287297

現象

Windows サーバーには、特定のユーザーとして実行するように ID が構成されている COM+ サーバー アプリケーションがあります。 しばらく作業した後、アプリケーションが動作を停止し、失敗し続ける可能性があります。 問題を解決するには、COM+ アプリケーションを再起動する必要があります。

CLIENT マシンのアプリケーション ログに、次のようなエラーが表示される場合があります。 クライアント実行可能ファイルが COM+ サーバー アプリケーションと同じコンピューターで実行されている場合、COM+ サーバーに次のエラーが表示されます。

イベントの種類: エラー
イベント ソース: DCOM
イベント カテゴリ: なし
イベント ID: 10006
Date: <DateTime>
時刻: <DateTime>
ユーザー: Domain\user
コンピューター:*****
説明:
サーバーをアクティブ化しようとしたときに、コンピューター 'servername' からエラー "Unspecified error" が発生しました: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

この場合、イベント メッセージは、サーバーからエラー (E_FAILまたは80004005または未指定のエラー) が返されることを示します。 コンポーネントの CLSID がイベント ログ エントリに一覧表示されます。

COM+ アプリケーションが実行されているコンピューターのアプリケーション ログにも、次のようなイベントが表示されます。

ログ名: アプリケーション
ソース: Microsoft-Windows-User Profiles Service
Date: <DateTime>
イベント ID: 1530
タスク カテゴリ: なし
レベル: 警告
キーワード: クラシック
ユーザー: SYSTEM
コンピューター: SERVERNAME
説明:
Windows は、レジストリ ファイルが他のアプリケーションまたはサービスによって引き続き使用されていることを検出しました。 これでファイルがアンロードされます。 レジストリ ファイルを保持するアプリケーションまたはサービスが、後で正常に機能しない可能性があります。

詳細-
\Registry\User\S-1-5-21-1049297961-3057247634-349289542-1004_Classesからリークされた 1 つのユーザー レジストリ ハンドル:
プロセス 2428 (\Device\HarddiskVolume1\Windows\System32\dllhost.exe) がキー \REGISTRY\USER\S-1-5-21-1123456789-3057247634-349289542-1004_CLASSES

コンポーネントのインスタンスを作成するための呼び出しが0x800703faを返す場合があります。

原因

COM+ アプリケーションに関連付けられているユーザー ID は、COM+ アプリケーションが最初に初期化されるときにログオンされます。 このユーザーがコンピューターからログオフすると、ユーザーのプロファイルがアンロードされ、COM+ アプリケーションはユーザー ID のプロファイルのレジストリ キーを読み取れなくなります。 Windows Vista 以降、ユーザー プロファイル サービスは、そのユーザーがログオフしたときにユーザー プロファイルのアンロードを強制します。 これは、レジストリ ハンドルがプロセスで閉じられない場合に、ユーザー プロファイルのアンロードを強制する機能がアプリケーションを壊す可能性がある状況です。 この新しいユーザー プロファイル サービス機能は、既定の動作です。

解決方法

回避策として、ユーザー プロファイル サービスの既定の動作を変更する必要がある場合があります。 ポリシー設定 [ ユーザー ログオフ時にユーザー レジストリを強制的にアンロードしない ] は、Vista 以降のオペレーティング システムの既定の動作に対応します。 有効にすると、ユーザー プロファイル サービスはレジストリを強制的にアンロードしません。代わりに、ユーザー レジストリをアンロードする前に、他のプロセスがユーザー レジストリを使用していないまで待機します。 ポリシーは、グループ ポリシー エディター (gpedit.msc) にあります。 [ユーザー ログオフ時にユーザー レジストリを強制的にアンロードしない] ポリシーは、[コンピューターの構成>] [管理用テンプレート>] [システム>ユーザー プロファイル] の下にあります。

新しいユーザー プロファイル サービス機能を無効にする設定を [未構成] から [有効] に変更します。 DisableForceUnload は、レジストリに追加される値です。

詳細

ユーザー ログオフ時にユーザーごとのレジストリ キーに対して開いているハンドルがある場合でも、Windows は常にユーザー レジストリをアンロードします。 このポリシー設定を使用すると、管理者はこの動作を無効にして、Windows がユーザー ログオフ時にユーザー レジストリを強制的にアンロードできないようにすることができます。

注:

このポリシーは、この特定の Windows 動作のためにアプリケーションの互換性の問題が発生する可能性がある場合にのみ使用してください。 ユーザーがローミング ユーザー プロファイルの更新バージョンを取得できなくなる可能性があるため、既定でこのポリシーを有効にすることはお勧めしません。

このポリシー設定を有効にした場合、Windows はログオフ時にユーザー レジストリを強制的にアンロードしませんが、ユーザーごとのレジストリ キーに対するすべての開いているハンドルが閉じられたときにレジストリをアンロードします。

このポリシー設定を無効にした場合、または構成しない場合、ユーザー のログオフ時にユーザー ごとのレジストリ キーに対して開いているハンドルがある場合でも、Windows は常にログオフ時にユーザー レジストリをアンロードします。

[ ユーザー ログオフ時にユーザー レジストリを強制的にアンロードしない ] ポリシー設定を有効にした場合でも、イベント ID 1530 の警告がログに記録される場合があります。 この警告は、レジストリ ハイブのアンロードを最初に試みた後にログに記録されます。 これが失敗した場合、開いているレジストリ ハンドルに関係なく、レジストリ ハイブを強制的にアンロードするかどうかを判断するためにポリシーがチェックされます。