この KB 記事では、問題について説明しています
http://support.microsoft.com/kb/329291
PRB: ASP.NET アプリケーションが EventLog に新しい EventSource を書き込もうとすると、「要求されたレジストリ アクセスは許可されていません」というエラー メッセージが表示される
症状
ASP.NET を使用してイベント ログに新しいイベント ソースを作成すると、次のエラー メッセージが表示される場合があります。
System.Security.SecurityException: 要求されたレジストリ アクセスは許可されていません。
原因
既定では、ASP.NET ワーカー プロセスのユーザー トークンは ASPNET (または、インターネット インフォメーション サービス [IIS] 6.0 で実行されるアプリケーションの場合は NetworkService) です。「現象」セクションの問題は、アカウントがイベント ソースを作成するための適切なユーザー権限を持っていないために発生します。
解像度
最初のアプローチ:
レジストリ エディター (開発用 PC ではなくサーバー上)のアプリケーション イベント ログの下にイベント ソースを作成します。これを行うには、次の手順を実行します。
- サーバーの Windows デスクトップにアクセスします。[スタート] をクリックし、[実行] をクリックします。
- [名前] テキスト ボックスに「regedit」と入力します。
- 次のレジストリ サブキーを見つけます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
- Application サブキーを右クリックし、 [新規] をポイントして、[キー] をクリックします。
TEST
キー名に「 」と入力します。
- レジストリ エディタを閉じます。
2 番目の (代替) アプローチ:
名前空間のEventLogInstaller
クラスをSystem.Diagnostics
使用すると、実行中にアプリケーションが読み書きするイベント ログをインストールして構成できます。を使用して、イベント ソースを作成できますEventLogInstaller
。これを行うには、次の手順を実行します。
- Microsoft Visual Basic .NET または Microsoft Visual C# .NET を使用して、EventLogSourceInstaller という名前の新しいクラス ライブラリを作成します。デフォルトでは、Class1.vb ファイルまたは Class1.cs ファイルが作成されます。
- ソリューション エクスプローラーで を右クリック
EventLogSourceInstaller
し、[参照の追加] をクリックします。
- [参照の追加] ダイアログ ボックスで、 をダブルクリック
System.Configuration.Install.dll
し、[OK] をクリックします。
- 「Class1.cs」の名前
Class1.vb
を MyEventLogInstaller.vb\MyEventLogInstaller.cs に変更します。
MyEventLogInstaller.vb
またはMyEventLogInstaller.cs
次のサンプル コード
で既存のコードを置き換えます。 Visual Basic .NET のサンプル
Imports System.Diagnostics
Imports System.Configuration.Install
Imports System.ComponentModel
<RunInstaller(True)> _
Public Class MyEventLogInstaller
Inherits Installer
Private myEventLogInstaller As EventLogInstaller
Public Sub New()
' Create an instance of 'EventLogInstaller'.
myEventLogInstaller = New EventLogInstaller()
' Set the 'Source' of the event log, to be created.
myEventLogInstaller.Source = "TEST"
' Set the 'Log' that the source is created in.
myEventLogInstaller.Log = "Application"
' Add myEventLogInstaller to 'InstallerCollection'.
Installers.Add(myEventLogInstaller)
End Sub
End Class
ビジュアル C# .NET サンプル
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;
namespace EventLogSourceInstaller
{
[RunInstaller(true)]
public class MyEventLogInstaller : Installer
{
private EventLogInstaller myEventLogInstaller;
public MyEventLogInstaller()
{
//Create Instance of EventLogInstaller
myEventLogInstaller = new EventLogInstaller();
// Set the Source of Event Log, to be created.
myEventLogInstaller.Source = "TEST";
// Set the Log that source is created in
myEventLogInstaller.Log = "Application";
// Add myEventLogInstaller to the Installers Collection.
Installers.Add(myEventLogInstaller);
}
}
}
- [ビルド] メニューで [ソリューションのビルド] をクリックして、EventLogSourceInstaller.dll を作成します。
- Visual Studio .NET コマンド プロンプトを開きます。
- コマンド プロンプトで、EventLogSourceInstaller.dll が配置されているフォルダーに移動します。
- 次のコマンドを実行して、EventSource を作成します。
InstallUtil EventLogSourceInstaller.dll
解像度の下で 2 番目のアプローチを使用する場合は、それを機能させる必要があります。
それをしたくない場合、または正しく機能させられない場合は、別の方法として、ID タグを使用しweb.config
て、レジストリを編集する権限を持つユーザーになりすますことができます。これはこのアプリケーション専用のセキュリティ全体ですが、追加のセキュリティ対策を実装すれば問題ありません。