[Windows] [event ID 10016] DCOM エラー: ShellServiceHost|LOCAL SERVICE

Windowsビルトインアカウント LOCAL SERVICE がDCOMコンポーネント ShellServiceHost にアクセスすることができないために記録されるエラーで、管理人環境ではPCが何度となくフリーズする現象でした。

修復することができたので手順を解説します。

イベントビューアーのメッセージ

イベントビューアーのメッセージは以下の通りです。

メッセージ アプリケーション固有 のアクセス許可の設定では、CLSID
{6B3B8D23-FA8D-40B9-8DBD-B950333E2C52}
および APPID
{4839DDB7-58C2-48F5-8283-E1D1807D0D7D}
の COM サーバー アプリケーションに対するローカルアクティブ化のアクセス許可を、アプリケーション コンテナー 利用不可 SID (利用不可) で実行中のアドレス LocalHost (LRPC 使用) のユーザー NT AUTHORITY\LOCAL SERVICE SID (S-1-5-19) に与えることはできません。このセキュリティ アクセス許可は、コンポーネント サービス管理ツールを使って変更できます。
ログの名称 システム
ソース DistributedCOM (DCOM)
イベントID 10016
レベル エラー
ユーザ LOCAL SERVICE
APPID {4839DDB7-58C2-48F5-8283-E1D1807D0D7D}
APPIDの名称 ShellServiceHost

エラーの原因

Windows 10 と Windows Server 2016 で DCOM のイベント ID 10016 がログに記録される

この問題は、イベント ログに示されている DCOM コンポーネントに対するアクセス許可を、特定のプロセスが持っていないために発生します。

これらのイベントは無視しても問題ありません。

出典: support.microsoft.com

修復手順

レジストリエディターでAPPIDの所有者を変更する

レジストリの編集操作は自己責任です。
レジストリエディターを操作する前に、不測の事態に備えてレジストリのバックアップを取っておきましょう。

レジストリエディターを起動する。

「スタート」をクリックして、アプリ一覧の「W」欄から「Windowsシステムツール」をクリックします。

表示された一覧から「ファイル名を指定して実行」をクリックして、名前に「regedit」と入力してOKをクリックします。

APPIDを検索する

レジストリエディターの検索ダイアログを起動します。

ctrl+f または 編集>検索

検索する値に {4839DDB7-58C2-48F5-8283-E1D1807D0D7D} を入力して「次を検索」をクリックします。

所有者をAdministaratorsに変更する

ShellServiceHostの所有者を変更するには、現在操作しているWindowsにログインしているアカウント(自分のアカウント)が、管理者権限のあるアカウント (Administratorsに所属しているアカウント) でなければなりません。

{4839DDB7-58C2-48F5-8283-E1D1807D0D7D}を選択して、[右クリック > アクセス許可] を選択します。

管理人の環境では、Administratorsはグループまたはユーザー名に登録されていましたが、アクセス許可は[読み取り] になっていました。
ものの試しに、フルコントロール にチェックを入れてOKをクリックしたらエラーを返されたので、所有者を変更します。

「詳細設定」をクリックします。

所有者を確認すると TrustedInstaller になっているので「変更」をクリックします。

「ユーザーまたはグループの選択」画面が表示されるので 「詳細設定」 をクリックします。

「検索」をクリックすると、検索結果にAdministratorsがリストに表示されるので、選択してOKをクリックします。

「選択するオブジェクトを入力してください」の画面に ユーザ名¥Administrators が追加されたことを確認したらOKをクリックします。

所有者がAdministratorsに変更されていることを確認してOKをクリックします。

Administratorsのアクセス権限をフルコントロールに変更する

Administratorsを選択して、アクセス許可欄のフルコントロールの☑許可にチェックを入れてOKをクリックします。

コンポーネントサービスを起動してAPPIDにLOCAL SERVICEを追加する

コンポーネントサービスを起動します。
スタートメニュー > Windows 管理ツール > コンポーネントサービス

または、「ファイル名を指定して実行」を起動して、名前に「dcomcnfg」と入力後OKをクリックします。

アプリケーションIDを探す

APPID {4839DDB7-58C2-48F5-8283-E1D1807D0D7D} は DCOMの構成を選択すると右ペインに表示される ”アプリケーション ID”の列から目視(検索機能がないため)で探します。

アプリケーションはアルファベット順に並んでいるので、APPIDで探すよりもShellServiceHostで探す方が見つけやすいです。

ShellServiceHost に LOCAL SERVICE を追加する

ShellServiceHostを右クリックしてプロパティを選択します。

「セキュリティ」タブの編集をクリックします。

「追加」をクリックします。

「詳細設定」をクリックします。

検索をクリックします。

検索結果一覧からLOCAL SERVICEを選択してOKをクリックします。

オブジェクト名にLOCAL SERVICEが記述されていることを確認してOKをクリックします。

LOCAL SERVICEのアクセス許可で「ローカルからのアクティブ化」に☑チェックを入れてOKをクリックします。

変更した所有者を元に戻す

これで一連の作業が完了しました。
変更を加えたレジストリキーの所有者は、コンポーネントサービスの処理が終わったら元に戻すことが肝要です。
上記で所有権をTrustedInstallerからAdministratorsへと変更した手順と同様に、今度はAdministratorsからTrustedInstallerへと戻します。

元の値「NT SERVICE\TrustedInstaller」は検索しても表示されないので直接入力する必要があります。

PCを再起動する

PCを再起動してイベントビューアーを確認したところエラーが記録されなくなりました。

追記

なお、この手順はDistributedCOM(APPID{15C20B67-12E7-4BB6-92BB-7AFF07997402})においても同様の手順でエラーを解消することができます。