この記事は、ASP.NET またはアプリケーション サービス プロバイダー (ASP) アプリケーションから Windows イベント ログに書き込むと、予期しないエラーがスローされる可能性がある問題を解決するのに役立ちます。
元の製品バージョン: インターネット インフォメーション サービス 8.0 以降のバージョン
元の KB 番号: 2028427
現象
インターネット インフォメーション サービス (IIS) 8.0 以降で実行されている ASP.NET またはレガシ ASP アプリケーションがある。 アプリケーションは、Windows イベント ログにイベントを記録します。 イベント ログへの書き込みが失敗し、次の例のようなエラー メッセージが表示されます。
ASP.NET アプリケーション
System.Security.SecurityException: 要求されたレジストリ アクセスは許可されていません。
System.ComponentModel.Win32Exception: アクセスが拒否されました
InvalidOperationException: ソース アプリケーションのログを開くことができません。 書き込みアクセス権がない可能性があります。
レガシ ASP アプリケーション
アクセス許可が拒否されました。
原因
この問題は、セキュリティ アクセスが制限されているため、既定でアプリケーションのユーザー トークンに Windows イベント ログへの書き込みに必要なユーザー権限がないために発生します。
解決方法
重要
このセクション、方法、またはタスクには、レジストリの編集方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 したがって、次の手順を注意深く実行してください。 保護のために、レジストリを変更する前に、バックアップします。 その後、問題が起こった場合は、レジストリを復元できます。 レジストリのバックアップと復元方法の詳細は、「Windows のレジストリのバックアップおよび復元の方法」を参照してください。
スレッド ID に必要なアクセス許可を提供するには、サーバー コンピューター上の以下のレジストリ キーを使用して、イベント ログのセキュリティを変更します。 アプリケーションが書き込むイベント ログを選択する必要があります。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\System\CustomSD
CustomSD
レジストリ値はREG_SZ型であり、セキュリティ記述子定義言語 (SDDL) 構文のセキュリティ記述子が含まれています。 SDDL 構文の詳細については、以下の「 詳細情報 」セクションのリンクを参照してください。
Note
SDDL 文字列を作成するには、イベント ログに関連する 3 つの異なる権限があります。読み取り、書き込み、クリアです。 これらの権限は、ASCII 互換エンコード (ACE) 文字列のアクセス権フィールドの次のビットに対応します。
- 1 = 読み取り
- 2 = 書き込み
- 4 = クリア
重要
セキュリティ ログは、同じ方法で構成できます。 ただし、変更できるのは、読み取りアクセス許可とクリア アクセス許可のみです。 セキュリティ ログへの書き込みアクセスは、Windows ローカル セキュリティ機関 (LSA) に対してのみ予約されます。
次の例は、アプリケーション ログの既定の SDDL 文字列を示すサンプル SDDL です。 アクセス権 (16 進数) は太字で表示されます。
O:BAG:SYD:(D;;0xf0007;;;AN)(D;;0xf0007;;;BG)(A;;0xf0007;;;SY)(A;;0x5;;BA)(A;;0x7;;SO)(A;;0x3;;;IU)(A;;0x2;;BA)(A;;0x2;;LS)(A;;0x2;;NS)
エントリの意味:
- O:BA オブジェクト所有者は組み込み管理者 (BA) です。
- G:SY プライマリ グループは System (SY) です。
- D: 監査エントリや SACL ではなく、随意アクセス制御リスト (DACL) です。
(D;;0xf0007;;;AN)
匿名 (AN) のすべてのアクセスを拒否します。 (1 = 読み取り + 2 = 書き込み + 4 = クリア)(この SDDL の最初の ACE 文字列)。(D;;0xf0007;;;BG)
組み込みゲスト (BG) のすべてのアクセスを拒否します。(A;;0xf0005;;;SY)
システムの読み取りとクリアを許可する (1 = 読み取り + 4 = クリア)、DELETE、READ_CONTROL、WRITE_DAC、WRITE_OWNER (0xf0000で示されます)。(A;;0x7;;;BA)
組み込みの管理者の読み取り、書き込み、および CLEAR を許可します。(A;;0x7;;;SO)
サーバー演算子の読み取り、書き込み、および CLEAR を許可します。(A;;0x3;;;IU)
対話型ユーザーの読み取りと書き込みを許可します。(A;;0x3;;;SU)
サービス アカウントの読み取りと書き込みを許可します。
Web ページがイベント ログにアクセスできるように、適切な ACE 文字列を追加します。 Web ページが匿名で実行されている場合 (つまり、IIS で匿名認証を使用して実行している場合)、IUSR またはカスタム匿名アカウントに、この CustomSD
レジストリ キーに対する適切なアクセス許可を付与する必要があります。 認証されたユーザー グループは、Windows 統合認証で実行されている場合、必要なアクセス許可を持っている必要があります。
これを行うには、選択したイベント ログの下に、 CustomSD
の既定値に次のエントリを追加します。
認証されたユーザー グループの場合 (Windows 統合認証がある場合): AU = 認証済みユーザーを
(A;;0x0003;;;AU)
します。匿名認証がある場合は、IUSR またはカスタムで構成された匿名アカウントの場合は、そのアカウントの SID を見つけて作成します。これは、最後のフィールドが自分のコンピューター上の IUSR アカウントの SID である
(A;;0x3;;;S-1-5-21-1985444312-785446638-2839930158-1121)
のようになります。IIS での Windows 認証と、特定のユーザー アカウントで有効になっている ASP.NET の偽装の場合は、その偽装されたアカウントの SID を見つけて、次のような SDDL 文字列を作成します。
(A;;0x3;;;S-1-5-21-1985444312-785446638-2839930158-1121)
最後のフィールドは偽装アカウントの SID です。
グループに読み取りアクセス許可を付与するには、現在のCustomSD
文字列の末尾にあるCustomSD
値に次を追加します。
(A;;0x1;;;[Your Group Name/user account SID])
グループに読み取りと書き込みのアクセス許可を付与するには、現在のCustomSD
文字列の末尾にあるCustomSD
値に次を追加します。
(A;;0x3;;;[Your Group Name/user account SID])
Windows Server 2008
代わりに、Windows 2008 サーバーで、対象のユーザーとグループにすべてのイベント ログへの読み取りアクセス権を付与する場合は、組み込みのイベント ログ リーダー グループに追加するだけです。 ただし、すべてのイベント ログへのアクセス権を付与しない場合は、SDDL を使用する必要があります。この場合は、 WevtUtil
ユーティリティを使用できます。 次の例では、Windows 2008 Server でのシステム イベント サインインへのアクセスの定義を示します。
コマンド プロンプトを開き、次のコマンドを実行して、システムサインアウトの SDDL を txt ファイルにダンプします。
wevtutil gl system > C:\temp\out.txt
テキスト ファイルを開き、 channelAccess: エントリをコピーします
channelAccess: O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x1;;;AU)(A;;0x1;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;LS)(A;;0x2;;;NS)(A;;0x2;;;S-1-5-33)
この文字列にユーザーまたはグループを追加し、次のコマンドを実行して新しい SDDL を適用します。 O:BAG:XXXX を、前の手順で作成した SDDL 文字列に置き換えます。
wevtutil sl System /ca:O:BAG:XXXX
Note
この値を編集してコンピューターを再起動すると、新しい設定が有効になります。 この手順を使用する前に、SDDL と各イベント ログに配置される既定のアクセス許可を十分に理解していることを確認してください。 また、運用環境に実装する前に変更を十分にテストしてください。これは、誰もアクセスできない方法でイベント ログにアクセス制御リスト (ACL) を誤って構成する可能性があるためです。