- PR -

[ASP.NET]カスタムログにイベントログを書き込むことができない

投稿者投稿内容
Ten.
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 67
投稿日時: 2004-08-04 19:40
環境は以下のとおりです。
WindowsXP SP1、.NET Framework 1.1、VS.NET 2003(VB.NET)

状況は以下のとおりです。
1.ASP.NETの実行アカウントの権限は変更しない
2.カスタムログとイベントソースは事前に管理者権限でコンソールアプリケーションを実行して登録する
(EventLog.CreateEventSourceメソッドを使用、登録後にマシンを再起動)
3.EventLog.WriteEntryメソッドで書き込みにいくとSecurityExceptionがスローされる
(エラーメッセージは「要求されたレジストリ アクセスは許可されていません」)
4.Windowsアプリケーションからは書き込みできる(管理者権限で実行)
5.イベントソースをアプリケーションログに登録するとWebアプリケーションからでも書き込みできる

EventLog.SourceExistsメソッドを実行しても3と同じ例外が発生するので、カスタムログに関するレジストリを参照する権限がないものと思われます。

アプリケーションログには書き込みできるので、カスタムログの設定が怪しいとは思うのですが、どこが悪いのかが分からず行き詰っています。

EventLog.CreateEventSourceメソッドでは細かい設定はできそうにないです。

レジストリを直接変更したりとかあまり手がかかるようならば、妥協してアプリケーションログにしようかと思うのですが・・・
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-08-04 20:01
2でEventLog.CreateEventSourceの後、ダミーなログを1行書くとか(WriteEntry)。
Ten.
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 67
投稿日時: 2004-08-05 11:34
引用:

2でEventLog.CreateEventSourceの後、ダミーなログを1行書くとか(WriteEntry)。


試してみました。

Windowsアプリケーションで1件書き込んでから、Webアプリケーションから書き込んでみましたが、同様にSecurityExceptionがスローされました。残念・・・

アプリケーションログに書いてもフィルタをかけて見れば特に問題ないとは思いますが、少なくともできない理由だけでも分かればと思います。

「何でできないの?」と聞かれたら困りますし、第一気持ち悪いんですよね。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-08-05 12:00
これが該当するのかな。
http://blogs.sqlpassj.org/matu_tak/archive/2004/06/25/2929.aspx
Ten.
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 67
投稿日時: 2004-08-05 14:32
noderaさん、情報ありがとうございます。
引用:

noderaさんの書き込み (2004-08-05 12:00) より:
これが該当するのかな。
http://blogs.sqlpassj.org/matu_tak/archive/2004/06/25/2929.aspx


こちらの話はASP.NETからイベントソースを登録しようとした場合のことだと思いますので、申し訳ないのですが違うようです。

ただ、下のほうに出てくるレジストリのアクセス許可については、怪しいかなと思っています。

単純に考えると、ASP.NETの実行アカウントはアプリケーションログのレジストリにはアクセスできるが、追加したカスタムログのレジストリにはアクセスする権限がないのでは?と思ってしまいます。

ただ、レジストリのキーごとのアクセス許可の設定はどのようにしたら行えるのかがわかりません。(キーごとの設定が可能かどうかすらわからないのですが)

レジストリ自体にアクセス許可の設定があるかもしれないと思い、該当する部分のレジストリの内容を見て調べたりしたのですが、それらしいところは見つかりませんでした。
(この辺の詳しい情報がないのですが、レジストリをやたらといじって試すのも怖くて・・・)

次に、コードアクセスセキュリティか?と思ったのですが、よく考えればASP.NETはWebサーバにあるものをWebサーバで実行しているだけなので「マイコンピュータ」ゾーンなんですよね・・・
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-08-05 15:26
引用:

試してみました。

Windowsアプリケーションで1件書き込んでから、Webアプリケーションから書き込んでみましたが、同様にSecurityExceptionがスローされました。残念・・・



当方では、苦労しましたが動いています。

以下をお試しください。

(1).MachineName に System.Net.Dns.GetHostName()を代入する。
(2) .Logと.Sourceを同じ名前にする。

nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-08-05 15:36
こんにちは。
気になったのでテストしてみましたが、Ten.さんが最初に書いた方法で自分のところではいけてしまいました(^^;
環境はほぼ一緒です(違うのはC#なだけ)

MSDNのEventLogクラスのところに記述されていた次のコードをWindowsアプリケーションでまず動かし、続いてASP.NETのWebアプリケーションでまったく同じコードを動作させたら、書き込みOKでした。
-----
// Create the source, if it does not already exist.
if(!EventLog.SourceExists("MySource")){
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatingEventSource");
}

// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";

// Write an informational entry to the event log.
myLog.WriteEntry("Writing to event log.");
-----

Windowsアプリで動作させる前に、Webアプリ側で動作させた場合は、SecurityExceptionが発生しました。
Ten.さんところとの違いは何でしょうね。。。。
Windowsアプリで書いた後に、該当のレジストリをレジストリエディタのアクセス許可プロパティで見たとき、Usersグループは読み取り可となっているでしょうか?

Ten.
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 67
投稿日時: 2004-08-05 19:43
アドバイスありがとうございます。

引用:

(1).MachineName に System.Net.Dns.GetHostName()を代入する。
(2) .Logと.Sourceを同じ名前にする。


こちらの方法を試してみましたが、結果は同じでした。

引用:

Windowsアプリで書いた後に、該当のレジストリをレジストリエディタのアクセス許可プロパティで見たとき、Usersグループは読み取り可となっているでしょうか?


お恥ずかしい話なのですが、レジストリエディタでアクセス許可の設定ができるとは知りませんでした。
設定内容についてですが、読み取りの許可はちゃんとUsersグループに設定されています。
(ASPNETアカウントがUsersグループに所属しているのも確認しました)

どうやら環境に原因がありそうなので、Windows Server 2003で試してみたところ、あっさりとログが書けてしまいました。。。
(Windows Server 2003 にしたのは、テストに使えるのがこれしかなかったからです)

いろいろとご助言をいただいたのに、「結局は自分のマシンがおかしかっただけ」という誠に申し訳ない結果になりそうですが、もう少しがんばってみます。

スキルアップ/キャリアアップ(JOB@IT)