2009-10-22 29 views
9

System.Diagnostics.EventLogインスタンスへの書き込みを含むビジネスロジックで作成したライブラリがあります。ライブラリは、通常、Windowsサービスアプリケーションから呼び出されますが、私はASP.NET MVCアプリケーションから同じライブラリ関数を呼び出そうとしています。ASP.NET MVCアプリケーションからEventLogに書き込むときのセキュリティ例外

私はこのコードを自分のコントローラの中で試して、ログに書き込む必要があるメソッドに渡すEventLogインスタンスを作成しました。

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp") 

ライブラリのメソッド内のコードは、ログに書き込もうとすると、次のエラーが生成されます。

[SecurityException: Requested registry access is not allowed.] 
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51 
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217 
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366 
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205 
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14 

私のウェブアプリがIIS 6を実行しているWindows Server 2003上でネットワークサービスのユーザーとして実行されていますネットワークサービスユーザーにレジストリへのアクセスを許可するために必要なことはありますか?

ASP.NET MVCアプリケーションで使用するEventLogインスタンスを作成するより良い方法はありますか?私が参照する必要があるフレームワークによってすでに作成されているものはありますか? MSDNから

答えて

19

:「ネットワークサービスのIDを使用して実行されるアプリケーションは、既存のイベントソースを使用してイベントログに書き込むことができますが、彼らは不十分なためレジストリのアクセス許可の新しいイベントソースにを作成することはできません。」

そして...

のEventLogインスタンスに関連したイベントログのソースが存在しない場合は、新しいイベントソースが作成される。

だからあなたのイベントのように見えますログソースが存在せず、ネットワークサービスユーザー(レジストリに書き込む必要があるため、動作しない)を使用して新しいイベントログソースを作成しようとしています。

「はすでに存在していないイベントソースを使用してイベントログに書き込むために、ASP.NETアプリケーションを有効にするには、次の2つのオプションがあります:」

  • すると、インストール時にアプリケーションに新しいイベントソースを作成します
  • レジストリに新しいイベントソースエントリを手動で作成します。

したがって、アプリケーションの外部にログを作成する必要があります(手動で行うか、インストールを簡単にするための簡単なコマンドラインアプリを作成してください)。詳細については

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

個人的に私はあなたがネットユーザーの権限を変更するのではなく、Webアプリケーションの外でログソースを作成しないことをお勧めします。私の好みは、コンソールアプリケーション(書いて5分ほどかかりますが、他のマシンの準備にも使用できます)です。 VS.NETで新しいコンソールアプリケーションを起動し、コードを追加してログソースを作成します。例:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

それからちょうど適切な権限でログインしたときに、CMDラインからコンソールアプリケーションを実行します。

5

作成しようとしているイベントソースが不明な場合は、上記の回答を把握することが難しくなります。

より簡単な解決策は、アプリケーションプールを一時的にLocalSystemを使用するように切り替えてから、アプリケーションを実行してエラーを生成することです。関連するイベントログソースを作成することができます。その後、NetworkServiceを使用して元に戻すことができます。

0

なぜアプリケーションログに書き込むのではなく、独自のEventLogを作成できないのか分かりません。

次のコードを使用してウィンドウ/コンソールアプリケーションを作成し、それを管理者として実行すると、新しいログが作成されます。

if (!EventLog.Exists("LOG_NAME")) 
    EventLog.CreateEventSource("LOG_NAME", "LOG_NAME"); 

これにより、イベントログ内に新しいログが作成され、アプリケーションログとサービスログに表示されます。

if (!EventLog.SourceExists("MyMVCApp")) 
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME"); 

これは、カスタム「LOG_NAME」内に新しいソースを作成し、カスタムログを作成するためのコード

Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp") 

を利用することができます。

+0

ログに権限を割り当てる方法を参照してください。http://stackoverflow.com/questions/1823433/eventlog-permission-failing-in-asp-net-on-win7/35086503#35086503 –

関連する問題