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


189

ASP.NETアプリをServer 2003(およびIIS6)からServer 2008(IIS7)に移植しようと取り組んでいます。

ブラウザでページにアクセスしようとすると、次のようになります。

「/」アプリケーションでのサーバーエラー。

セキュリティ例外

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

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

ソースエラー:

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

スタックトレース:

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

System.Diagnostics.EventLog.FindSourceRegistration(String source、String machineName、Boolean readOnly)+562 System.Diagnostics.EventLog.SourceExists(String source、String machineName)+251

[をちょきちょきと切る]

これらは私がそれを試して解決するためにやったことです:

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

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

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

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

PS:これはこの質問のフォローアップです。私は与えられた答えに従いましたが、役に立ちませんでした(上記の#2を参照)。


NetworkServiceとして実行されていた.Netサービスのカスタムソースに書き込もうとしたときに、これが発生しました。.Net Service Setupパッケージで設定されたサービス名と一致するようにイベントログソースを変更したところ、レジストリのアクセス許可を設定しなくても機能しました。私はます。HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Servicesの\ EventLogに\アプリケーションですでにキーとしてサービス名を見て、それに気づいた
ジョン・アダムズ


2
別の考えられる答え:exeを右クリックして[管理者として実行]を選択
MacGyver

回答:


169

キーの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. 読み取り許可を与える

更新:上記の手順は、アプリケーションのインストールにデプロイメントプロセスを使用しない開発者のマシンでは問題ありません。
ただし、アプリケーションを他のマシンにデプロイする場合は、SailAvidNicole 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")
            }
    }
}

IIS7では、「ネットワークサービス」をアプリプールのIDとして割り当てることができます(ApplicationPoolIdentityがデフォルトであることがわかる場合があります)。代わりに、アプリケーションプールごとに新しいユーザーを作成し、その「カスタムアカウント」に権限を設定できます。アプリケーションプールのIDを指定する(IIS 7)を
Grokodile 2013年

5
あなたはIIS上であなたaplicationを再起動した後の変更はのみ有効になります
ゼ・カルロス

7
IIS_IUSRSに、イベントログキーの読み取り/書き込み、およびセキュリティキーの読み取りを許可しました。私の製品は独自のイベントソースを作成するため、eventlogキーへの書き込みアクセスが必要でした。
duck9 2013

1
duck9私は、IIS8を補正詳細はこちらをご覧ください:stackoverflow.com/questions/712203/...
thedrs

1
また見て 、このソリューションの場合は、アプリケーションプールユーザーと関連する権限について serverfault.com / a / 81246/219898を。ありがとう@Michael Freidgeim-大きな助けになりました。
Anthony Horne

58

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

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

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]

1
これはまさに私のすべてのサービスのために私がすることです。これは正しいことだと思います。イベントログを使用するすべてのサービスで、上記のような.regファイルがあります。ファイルをUnicode-32(cp 1200)として保存する必要があることに注意してください
Valo

この回答は、エラーの背後にある実際の理由を説明しています。存在するチェックは、キー全体を列挙しようとします。存在する場合、checkExistsは正常に動作します。
DanO 2015

EventLog \ Securityこれが機能の鍵です。これに対する権限があることを確認してください。
Princa

45

解決策は、「ネットワークサービス」アカウントに、EventLog / Securityキーの読み取り権限を与えることでした。


1
周りにも同様の解決策があります。でも、どうしてこんなふうになってるんだろう。なぜなら、多くのサービスがNetworkServiceとしてログオンしていて、イベントログ/ securityを読み取ることができる必要があるからです。では、なぜNetworkServiceのアクセス許可を追加する必要があるのでしょうか。
h--n

11
通常はレジストリを通じてクロールしない人たちのもののために、このリンクは役に立つかもしれ:social.msdn.microsoft.com/forums/en-US/...
アラン・

素敵なリンクアラン。受け入れられた回答によるポイント#3は重要であり、すでに一度私をかみました。つまり、親のEventLogレジストリキーにアクセス許可を付与しても、セキュリティや仮想サーバーなどの「アクセスできないログ」には伝達されません。これらは、レジストリの子キーです。完全なイベントログアクセスが必要な場合は、親イベントログレベルと子セキュリティレベルの両方で権限を付与する必要があります。
ベンバレス2012年

1
あなたはIIS上ごaplication再起動した後の変更はのみ有効になります
ゼ・カルロス

コピー/貼り付けをしようとした場合は、「ネットワークサービス」の間にスペースを入れてください。
Chris Fremgen、2016年

7

私にとっては、「NetworkService」の「読み取り」権限を「EventLog」ブランチ全体に付与するだけでうまくいきました。


「セキュリティ」や「仮想サーバー」などのサブキーは、親キーから継承しないように権限が設定されているため、読み取りアクセス権を個別に付与する必要があるため、あまり関係ありません。
セルジュ

7

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

コンパイルしたプログラムを管理者として開始したところ、イベントソースが登録されました。その後、VS内から問題なく開発とデバッグに戻りました。

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


7

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

最後に、次のキーでタスクを実行しているユーザーに完全なアクセス許可を設定することが、私にとってはうまくいきました。

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

3
あなたは私の日を救った。ところで、読み取り許可が上十分であったeventlog\Applicationeventlog\Securityeventlogルートでのみフルコントロールが必要です。
Ruud Helderman、2014

6

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

問題を解決する別の方法:

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

資格情報が再ロードされ、EventLogに到達可能

http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx、おかげでマイケルFreidgeim


アプリプールを「ApplicationPoolIdentity」から「LocalSystem」に変更すると、イベントログの作成/読み取りに関する問題が解決しました。
majestzim

4

私は同じ問題に遭遇しましたが、1レベル上に行き、セキュリティにダウンするのではなく、HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \キーへのすべてのユーザーに完全なアクセス権を与える必要があり、問題が解決しました。


1
また、アプリケーションをLocalSystemとして実行するように設定して、レジストリキーが作成されたら、後でNetworkServiceに戻すことができます。
demoncodemonkey 2013年

4

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


4

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

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

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

    - 「NetworkService」を使用している場合、NETWORK SERVICEユーザーを追加します

    -usinfの場合"ApplicationPoolIdentity"、IIS APPPOL {アプリプールの名前}を追加します(ユーザーを検索するときにローカルマシンの場所を使用します)。

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

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

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


3

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


3

これに対する明白な解決策があるように見えますが、少なくとも独自のイベントソースを作成するために管理者権限を取得することが現実的ではない場合、大きな欠点はまだありません。既に存在するものを使用してください。

私が使い始めた2つは「.Netランタイム」と「アプリケーションエラー」で、どちらもほとんどのマシンに存在するようです。

主な欠点は、そのイベントでグループ化できないことと、関連付けられたイベントIDがない可能性があります。これは、ログエントリに「ソース.NetからのイベントID 0の説明ランタイムが見つかりません.... "省略した場合、ログは入力され、出力はおおまかに見えます。

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

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

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


2

私はIISで作業していませんが、2K8ボックスで同じエラーをスローするアプリケーションがあります。2K3ボックスで問題なく動作します。

私の解決策は、「管理者として実行」してアプリケーションに高い権限を与えることであり、すべてが問題なく機能しました。これがあなたを正しい方向に導くのに役立つことを願っています。

Windows 2008は権利/権限/昇格はWindows 2003とは本当に異なります。


2

こんにちは私がアプリケーションを開発しているときに同じ問題に遭遇し、それをリモート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レジストリの下にそのキーが必要です。このキーが見つからない場合、作成しようとしますが、アクセス許可がないために失敗します。上記のプロセスは、アプリケーションを(手動で)展開するのと似ていますが、これは自分で作成するものであり、Everyoneにアクセス許可を追加してレジストリを調整する必要がないため、問題が発生することはありません。

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


2

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

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

新-EventLogに-LogName アプリケーション -Source TFSAggregator

Aggregatorが codeplexから問題を実行するときに、これを使用してイベントログの例外を解決しました。


1

2008年のサーバーすべてに同様の問題がありました。グループAuthenticated Usersと読み取りアクセス許可をキーから奪うGPOが原因で、セキュリティログが完全に機能しなくなったHKLM\System\CurrentControlSet\Services\EventLog\security

これをマイクロソフトの推奨に従って戻すと、問題は修正されました。すべての認証済みユーザーに上位レベルでの読み取りを許可すると、問題も修正されると思います。


1

私は同様の問題に遭遇しました-私の場合、ソースに<>文字が含まれていました。64ビットマシンは新しい偶数ログを使用しています-私が言うxmlベースとこれらの文字(文字列から設定)は、例外を引き起こす無効なxmlを作成します。間違いなく、これはMicrosoftの問題-ソース(名前/文字列)を正しく処理しないことを考慮すべきです。


1

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


VSでトラブルシューティングを行ってこのエラーが発生した場合、これで問題が解決しました
wruckie

これは、この呼び出しを呼び出しているのはVSではなく、おそらく別のセキュリティコンテキストで実行されているアプリケーションであるため、エラーになります。
CodeMonkey1313 2015年

0

アプリがクライアントのウェブサーバーにインストールされます。Network Serviceのアクセス許可とレジストリをいじるのではなく、インストーラーでチェックSourceExistsして実行することを選びましたCreateEventSource

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



-1

VS内でアプリを実行すると、この問題が発生しました。私がしなければならなかったのは、一度プログラムを管理者として実行することだけでした。その後、VS内から実行できました。

管理者として実行するには、Windowsエクスプローラーでデバッグフォルダーに移動します。プログラムを右クリックして、[管理者として実行]を選択します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.