ASP.NET で偽装を使用している場合、予期しない例外が発生した場合にイベントログに書き込む処理などでイベントログに書き込みを行う処理を実装していると書き込みに失敗します。これは、Domain User 等の一般のユーザーに偽装している場合に、イベントログへの書き込み権限がないために、権限エラーが発生することが原因です。詳細は下記KBを参照してください。

Writing to the Windows Event Log from an ASP.NET or ASP application fails.
http://support.microsoft.com/kb/2028427 

上記KBでは、グループポリシーやローカルセキュリティーポリシーを使用して 特定のユーザー(セキュリティグループ)に権限を付与する方法が掲載されています。いずれの方法も、権限を付与したい種類のイベントログのレジストリに対して、 CustomSD のエントリを適切に設定します。

今回は、Windows Server 2008 以降で使用できる wevtutil ツールを使用して特定のマシンのイベントログ(アプリケーションログ)に対して 認証されたすべてのユーザーにイベントログの書き込み権限を付与する手順を覚書として記載します。Windows Server 2003 以前の場合は KB の方法や、[Windows] ASP.NET で偽装したユーザーでイベントログに書き込みを行うように権限を設定するで紹介している URLを参照してください。

1. Application (アプリケーション) のイベントログに対して認証されたユーザーが書き込みを行えるように設定する

コマンドプロンプトを管理者として起動します。下図のように  wevtutil gl Application コマンドを起動して、現在の Application イベントログの設定をエクスポートします。

出力をリダイレクトした backup.txt ファイルを開きます。下図のように channel Access の部分 O:BAG:XXX をコピーします。長いのでコピーミスをしないように注意してください。

メモ帳を起動し、コピーしたテキストを貼り付けます。テキストの末尾に下図のように (A;;0x0003;;;AU) を追記します。本例では偽装したユーザーがイベントログに書き込みを行えるように、認証されたすべてのユーザーに対して書き込み権限を設定できるようにしています。より細かい制御を行うには、 KB に紹介されている内容を確認して 権限付与のSDDLを設定してください。

上記メモで準備したテキストをコピーします。コマンドプロンプトで、下記のように wevtutil sl Application /ca: の後にコピーしたテキストを貼り付け、Enter を入力します。

regedit.exe を起動して、 HKLM\System\CurrentControlSet\services\eventlog\Application のキーを確認すると CustomSD に先ほど設定した文字列が設定されていることが確認できます。

KB にはコンピューターの再起動が必要というような説明があったのですが、動作確認を行った時には特に再起動せず権限設定が反映されました。

以上です。間違い、指摘点などありましたらご連絡ください。