web-dev-qa-db-ja.com

イベントログに書き込むときにSystem.Security.SecurityException

私は、Server 2003(およびIIS 6)からServer 2008(IIS 7)にASP.NETアプリケーションを移植しようとしています。

ブラウザのページにアクセスしようとすると、次のように表示されます。

「/」アプリケーションでサーバーエラーが発生しました。

セキュリティ例外

説明:アプリケーションがセキュリティポリシーで許可されていない操作を実行しようとしました。このアプリケーションに必要な権限を付与するには、システム管理者に連絡するか、設定ファイルでアプリケーションの信頼レベルを変更してください。

例外の詳細:System.Security.SecurityException:ソースは見つかりませんでしたが、一部またはすべてのイベントログを検索できませんでした。アクセスできないログ:セキュリティ

ソースエラー:

現在のWeb要求の実行中に未処理の例外が発生しました。起源と例外の場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[SecurityException:ソースが見つかりませんでしたが、一部またはすべてのイベントログを検索できませんでした。アクセスできないログ:セキュリティ。

System.Diagnostics.EventLog.FindSourceRegistration(文字列ソース、文字列machineName、ブール値readOnly)+562 System.Diagnostics.EventLog.SourceExists(文字列ソース、文字列machineName)+251

[スニップ]

これらを試して解決するために私がしたことは、

  1. キー "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security"に "Everyone"のフルアクセス許可を与えます。これはうまくいった。しかし当然のことながら、私は本番ではこれができません。だから私は数分間アプリを実行した後に "Everyone"権限を削除し、エラーが再表示されました。

  2. 昇格したアクセス許可を使用して、インストール中にアプリケーションログとセキュリティログにソースを作成し(そしてそれがregeditを介して存在することを確認しました)、エラーは残りました。

  3. 私はweb.configファイルで(そしてappcmd.exeを使って)完全な信頼レベルをアプリに与えましたが、役に立ちませんでした。

ここでできることについて誰かが洞察を持っていますか?

シモンズ:これはこれへのフォローアップです 質問 。私は与えられた答えに従いましたが、役に立ちませんでした(上記の#2を見てください)。

183
encee

解決策は、 "Network Service"アカウントにEventLog/Securityキーの読み取り権限を与えることでした。

46
encee

Network Serviceキーの読み取り許可をEventLog/Securityに与えるには(Firenziおよびroyrules22が提案するとおり) http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  1. レジストリエディターを開きます。
    1. Startを選択してからRunを選択します
    2. regedt32またはregeditを入力します
  2. 次のキーに移動/展開します。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  3. このエントリを右クリックして、[アクセス許可]を選択します

  4. Network Serviceユーザーを追加します

  5. 読み取り許可を与える

PDATE:上記の手順は、アプリケーションをインストールするために展開プロセスを使用しない開発者のマシンでは問題ありません。
ただし、アプリケーションを他のマシンにデプロイする場合は、インストール中にイベントログソースを登録するSailAvid's および Nicole Calinoiuの 答え。

PowerShell関数を使用しています(Octopus Deploy.ps1で呼び出します)

function Create-EventSources() {
    $eventSources = @("MySource1","MySource2" )
    foreach ($source in $eventSources) {
            if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
                [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
            }
    }
}
168

問題は、EventLog.SourceExistsEventLog\Securityキーにアクセスしようとしていることです。アクセスは管理者にのみ許可されています。

EventLogにログインするC#プログラムの一般的な例は次のとおりです。

string sSource;
string sLog;
string sEvent;

sSource = "dotNET Sample App";
sLog = "Application";
sEvent = "Sample Event";

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234);

ただし、EventLog\ApplicationEventLog.SourceExistsにアクセスしようとするため、プログラムに管理者権限がなく、キーがEventLog\Securityの下に見つからない場合、次の行は失敗します。

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

したがって、推奨される方法は、対応するキーを作成するインストールスクリプトを作成することです。

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥EventLog¥Application¥dotNETサンプルアプリケーション

その後、これら2行を削除できます。

レジストリキーを作成するために.regファイルを作成することもできます。次のテキストをファイルcreate.regに保存するだけです。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]
53

私にとっては、 'Network Service'に対する 'Read'パーミッションを全体の 'EventLog'ブランチに許可するだけでした。

8
evictorov

私はVS2010(XPのVS2008からアップグレード)で開発したコンソールプログラムと非常によく似た問題を抱えていました。 EntLibに新しいイベントソースを登録する権限がないため、エラーが発生しました。

それで私は私のコンパイルされたprog 管理者としてを一度始めました:それはイベントソースを登録しました。それから私は問題なくVSの中から開発とデバッグに戻りました。

(あなたも参照することができます http://www.blackwasp.co.uk/EventLog_3.aspx 、それは私を助けました

7
oldbrazil

私はこの問題を解決するためにここでほとんどすべてを試みます...私はここで私に役立つ答えを共有します:

この問題を解決するもう1つの方法:

  • IISコンソールで、サイトを管理しているアプリケーションプールに移動し、それを実行しているID(​​通常はネットワークサービス)をメモします。
  • このIDがKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlogになることを確認してください(厳密なクリック、承認)
  • 今すぐこのアプリケーションプールのIDをローカルシステムに変更し、適用して、ネットワークサービスに切り替えます。

認証情報が再ロードされ、EventLogが再取得可能になります。

in http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx 、ありがとうMichael Freidgeim

6
Gelásio

この例外は、スケジュールされたタスクとして実行されている.NETコンソールアプリケーションから発生していました。基本的には同じことをやろうとしていました - 新しいイベントソースを作成してイベントログに書き込みます。

結局、次のキーでタスクが実行されていたユーザーにフルパーミッションを設定することは私にとってはトリックでした。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
5
tswann

私は同じ問題に遭遇しました、しかし私は1つ上のレベルに上がって、セキュリティに行くのではなく、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog \キーへの全アクセス権を与えなければなりませんでした。

4
nodonoghue

Windows 7 64ビットでも同じ問題があります。管理者として実行して問題を解決しました。

3
Dom

参考までに…私の問題は、誤って「ローカルシステム」ではなくProcessInstallerのプロパティのアカウントとして「ローカルサービス」を選択したことでした。ローカルサービスの選択が最初に表示され、私は細心の注意を払っていなかったようにMSDNのチュートリアルに従った他の誰かに言及するだけで....

3
DaleS

使用するソース名を持つ新しいキーは、regEditのHKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥services¥eventlog¥Applicationの下に作成する必要があります。System.Diagnostics.EventLog.WriteEntry( "SourceName"、 "ErrorMessage"、EventLogEntryType) .Error);

だから基本的にあなたのユーザーはキーを作成する権限を持っていません。 [アプリケーションプールの詳細設定]の[ID]の値から、使用しているユーザーに応じて次の操作を実行できます。

  1. RegEditを実行してHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlogに移動します。
  2. EventLogキーを右クリックして[Permissions ...]オプションを選択します。3.フルコントロールアクセス権でユーザーを追加します。

    - 使用している場合"NetworkService" NETWORK SERVICEユーザーを追加

    - あなたがusinfの場合"ApplicationPoolIdentity" add IIS AP​​PPOL {アプリプールの名前}(ユーザーを検索するときにローカルマシンの場所を使用)。

    - 使用している場合"LocalSystem"ユーザーに管理者権限があることを確認してください。脆弱性にはお勧めできません。

  3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Securityに対して、1から3までの手順を繰り返します。

Visual Studioでのデバッグには "NetworkService"(ASP.Net User)を使用し、サイトの公開時には "AppicationPoolIdentity"を使用しました。

3
Pablishe

こんにちは私は私がアプリケーションを開発していたときに同じ問題に遭遇し、リモートPCにそれをインストールしたいと思いました、私はそれを以下のようにすることによってそれを直しました:

1)レジストリに移動し、次の場所に移動します。HKLM\System\CurrentControlSet\Services\EventLog\Application(??? YOUR_SERVICE_OR_APP_NAME ???)

"(??? YOUR_SERVICE_OR_APP_NAME ???)"は、.NETデプロイメントを作成したときに定義したアプリケーションサービス名です。たとえば、新しいアプリケーションに "My new App"という名前を付けた場合、キーは次のようになります。 HKLM¥System¥CurrentControlSet¥Services¥EventLog¥Application¥My New app

注2:どのeventLogに書き込むかに応じて、DEVボックス、\ Application \(上記のとおり)、またはアプリケーションが書き込んでいるイベントに応じて(\ System)または(\ Security)に表示されます。 、(\ Application)は常に問題ないはずです。

2)上記のキーを押して、メニューから。 「ファイル」 - >「エクスポート」を選択してファイルを保存します。 (注:アプリケーションがイベントビューアに書き込むためにこのキーにアクセスする必要がある場合は、必要なレジストリ設定が作成されます)、新しいファイルは.REGファイルになります。引数として、 "My New App.REG"と呼びます。 「

3)PRODuctionにデプロイする場合は、サーバーのシステム管理者(SA)に相談して、アプリケーションと一緒に "My New App.REG"ファイルを渡し、SAにREGファイルをインストールするよう依頼してください。 (管理者として)これはあなたのアプリケーションのためのキーを作成するでしょう。

4)アプリケーションを実行します。このキー以外のものにアクセスする必要はありません。

これで問題は解決するはずです。

原因:

EventLogに何かを書き込むアプリケーションを開発するとき、このキーが見つからない場合はEventlogレジストリの下にKEYが必要になります。作成しようとすると、権限がないため失敗します。上記のプロセスは、私たちがこれを自分で作成しているのに対し、(手動で)アプリケーションをデプロイするのに似ています。また、EVERYONEにアクセス許可を追加してレジストリを調整する必要はありません。

これが解決に役立つことを願っています。

2
Heider Sati

私はIISに取り組んでいませんが、2K8のボックスで同じエラーをスローするアプリケーションがあります。それは2K 3箱でちょうどうまく働きます、図を行きなさい。

私の解決策は、アプリケーションに上位の権限を与え、すべてが問題なく動作するようにするための「管理者として実行」です。これがあなたを正しい方向へ導いてくれることを願っています。

Windows 2008は、権利/許可/昇格がWindows 2003とは大きく異なります。

2
thomasnguyencom

少なくとも自分自身のイベントソースを作成するために管理者権限を取得するのが現実的でない場合、私はまだ大きなマイナス面を見ることができない、これに対する明白な解決策があるように思われます。

私が利用し始めた2つは ".Net Runtime"と "Application Error"で、どちらもほとんどのマシンに存在するようです。

主なデメリットは、そのイベントをグループ化できないこと、および関連するイベントIDがおそらくないことです。これは、ログエントリに「ソースからのイベントID 0の説明.Net」という語句が付いていることを意味します。ランタイムを見つけることができません.... "あなたがそれを省略するならば、ログは入ります、そして、出力は広く賢明に見えます。

結果のコードは次のようになります。

EventLog.WriteEntry(
    ".Net Runtime", 
    "Some message text here, maybe an exception you want to log",
    EventLogEntryType.Error
    );

もちろん、何らかの理由でこれらのイベントソースを持たないマシンを使用している可能性が常にあるので、失敗して状況が悪化した場合に備えてtry {} catch{}ラップすることをお勧めしますが、イベントは保存可能になりました。

2
tobriand

私は同じような問題にぶつかりました - 私の場合、Sourceは<>文字を含んでいました。 64ビットマシンでは、log-xmlという新しい偶数を使用していますが、これらの文字(文字列から設定)を使用すると無効なxmlが作成され、例外が発生します。おそらくこれはMicrosoftの問題を考慮する必要があります - Source(name/string)を正しく処理していません。

1
alflesio

当社の2008年のサーバーすべてに同様の問題がありました。セキュリティログは、グループ[Authenticated Users]を読み取り、キーHKLM\System\CurrentControlSet\Services\EventLog\securityから読み取り権限を取得したGPOのために完全に機能しなくなりました

Microsoftの推奨に従ってこれを元に戻すと、問題は解決しました。認証されたすべてのユーザーに高いレベルでの読み取りを許可しても問題は解決します。

1
Steve M

インストーラの答えは良い答えですが、あなたが書いていないソフトウェアを扱うときには必ずしも実用的ではありません。簡単な答えは、PowerShellコマンドを使用してログとイベントソースを作成することですNew-EventLoghttp://technet.Microsoft。 com/ja-jp/library/hh849768.aspx

管理者としてPowerShellを実行し、必要なログ名とソースを変更して次のコマンドを実行します。

New-EventLog -LogNameアプリケーション - ソースTFSAggregator

Codeplexからの Aggregatorの実行時のイベントログ例外 の問題を解決するために使用しました。

1
John Brown

私のアプリはクライアントWebサーバーにインストールされます。ネットワークサービスのアクセス許可とレジストリをいじるのではなく、インストーラでSourceExistsを確認してCreateEventSourceを実行することにしました。

また、イベントソースが作成されていない場合は、既知のソースに設定するためのtry/catch log.source = "xx"をアプリに追加しました(これは、再インストールの代わりに.dllをホットスワップした場合にのみ発生します)。

0
basher

web.configで以下を試してください

 <system.web>

<trust level="Full"/>

</system.web>
0
Anjan Kant

解決策は非常に簡単です - 管理モードでVisual Studioアプリケーションを実行してください!

0
frigate