EventLog.SourceExist method は check method なのに例外を垂れ流します。これで困るのが standard user で利用した場合。とりあえず、下記 code を実行してみてください。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(EventLog.SourceExists("存在しない source"));
}
}
下記例外が発生します。
ハンドルされていない例外: System.Security.SecurityException: ソースが見つかりませんでしたが、いくつかまたはすべてのログを検索できませんでした。アクセス不可能なログ: Security
直接の原因は下記 registry key の ACL。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
Windows 7 の既定では下記のように ACL が構成されています。
| Account
| ACL |
| System |
フル コントロール |
| Administrators |
フル コントロール |
| eventlog |
読み取り |
ということで、standard users には権限が無いですね。
しかし、SecurityException とはいえ、check method で例外を垂れ流すのはひどいですね。読み取りの場合、権限無いものは無視するのが鉄則だと思うのですが。。。次の version でもいいのでぜひ修正して欲しいものですね。
既存との互換性を考慮して修正しない場合には下記 method を追加する手もあると思いますね。
EventLog.SourceExist(string source, string machineName, string logName)
最も利用される log は "Application" なので、多くの場合こちらを利用することで回避できるでしょう。
2010/4/25 追記
.NET Framework 4.0 でもこの問題は再現しますね。