web-dev-qa-db-ja.com

Windows Server 2008 IIS7上のASP.NETのイベントログへの書き込み

Windows Server 2008 SP1のIIS7で、log4netを使用して顧客のイベントログに書き込もうとしています。ただし、アカウントにはイベントログへの書き込みアクセス権がないようです。誰か提案はありますか?

28
mhenderson

問題はおそらくイベントソースです。イベントログに書き込む前に、イベントソースを作成する必要があります(作成しない場合、イベントログオブジェクトは、ログに初めて書き込むときに「自動的に」作成しようとします)。

イベントログソースを作成するには、上位の権限が必要です。一部のWebアプリでは、イベントソースを作成するコードをセットアップに入れました(セットアップは管理者として実行されるため、常にソースを作成できることが保証されています)。

ソースを一度作成するだけで済みます。その後、ASP.Netアプリには、作成したソースを指定するエントリを書き込むための十分な権限が必要です。

セットアップでEventLogInstallerを使用してソースを作成することも、管理者としてEventLog.CreateEventSource()を呼び出す小さなユーティリティを作成することもできます。

両方の方法を紹介します。


// You would do this one from within an Installer class in a setup:
        private void InstallEventLog()
        {
            EventLogInstaller logInstaller;

            //Create an instance of an EventLogInstaller.
            logInstaller = new EventLogInstaller();

            //Set the source name of the event log.
            logInstaller.Source = "TheEventSourceName";
            Installers.Add(logInstaller);
        }

方法2:CreateEventSourceを管理者として1回呼び出すだけです(たとえば、次のコードをコンソールアプリに挿入して、コンソールアプリを管理者として実行できます)


EventLog.CreateEventSource("TheSourceName", "Application");

ボーナス:サーバーにPowershellがインストールされている場合は、Powershellコマンドプロンプトから実行できます(管理者としてPowershellを実行していることを確認してください)。


[system.Diagnostics.EventLog]::CreateEventSource("SourceName", "Application")

役立つホップ

63
JMarsch

ASPNETアクセス許可をイベントログに付与します。

実行-> regedit->参照

HKEY_LOCAL_MACHINE
   \SYSTEM
      \CurrentControlSet
         \Services
            \Eventlog

権限を選択して右クリックし、ASPNETアカウントにフルコントロールを与えます

15

IIS 8の権限解決の答え

私は怠惰で、コードに特別なログを作成しませんでしたが、代わりに次を使用しました:

System.Diagnostics.EventLog.WriteEntry( "MyAppName"、 "Bla Bla SQLエラー:" + sx.Message);

Michaelの回答を完了するためにIIS8では、サーバー側コードの実行時にIISによって使用されるユーザーは次のとおりです。IIS_IUSRS

(IIS_IUSRS内に仮想アカウントがあるため、実際にはより複雑ですが、それらはそのアカウントからアクセス許可を取得します。詳細については、 IIS_IUSRSおよびIIS8のIUSRアクセス許可 フォームを参照してください)

そのユーザーには、このレジストリノードに対する読み取り権限のみが必要です。

HKLM\CurrentControlSet\System\Services\Eventlog\Security

これは、新しいログソースが書き込まれるときに、システムがログソースを作成する前に、それが存在しないことを確認する必要があるため、ソース名を読み取る必要があるためです。

また、Visual Studioのiis Expressを使用している場合は、個人の資格情報で実行されるため、上のレジストリノードへの読み取りアクセス許可がない場合は、Visual Studioでデバッグするときにも追加する必要があります。

(管理者がノードへのアクセス許可を持ち、そのグループに属している場合は、十分ではありません。「管理者として」Visual Studioを実行する必要があります。これはVisual Studioショートカットからのみ機能し、SNLショートカットからは機能しません)

別の注意:コンピューターがドメイン内にあり、レジストリのアクセス許可を編集するときにIIS_IUSRSアカウントが見つからない場合は、ローカルではなくドメインのActive Directoryでアカウントを検索して、間違った「場所」を探している可能性があります。コンピューター)

7
thedrs

@Michael Kniskernの良い例のより安全なオプションは次のとおりです。

regedit ...

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\your_new_application_log

アプリケーションの目的で作成された特定のアプリケーションログのみを完全に制御します(この例では、your_new_application_logを右クリックし、そこに権限を設定します)。新しいログ名が作成されると、上記のようにイベントログノードの下にネストされたレジストリに表示されます。

2
Sheldon Hage

IIS 10を使用しており、プールIDをローカルシステムに設定します

参照を参照してください: https://stackoverflow.com/a/9067391/9975799

0
tyne