残念ながら、イベント ソースを作成するには管理者権限が必要です。ただし、イベント ログへの書き込みや読み取りに管理者権限は必要ありません。
これには 2 つの方法があります。
管理者としてアプリケーションをインストールするときに、新しいイベント ソースを追加します。
アプリケーションを構成するために管理者として実行する単純なアプリを作成します。これは、インストーラーに含めることもできます。
インストーラーがない場合、または必要な場合は、アプリを管理者としてコンピューターにロードし、プログラムを 1 回実行します。イベント ソースがまだ存在しない場合は、アプリの起動時にイベント ソースを構成する必要があります。(わかりました、それは3つの方法です。)
このコード スニペットは Microsoft からのものです: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspxであり、管理者ユーザーとして実行するように設計されています。
using System;
using System.Diagnostics;
using System.Threading;
class MySample
{
public static void Main()
{
// Create the source, if it does not already exist.
if (!EventLog.SourceExists("MySource"))
{
//An event log source should not be created and immediately used.
//There is a latency time to enable the source, it should be created
//prior to executing the application that uses the source.
//Execute this sample a second time to use the new source.
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatedEventSource");
Console.WriteLine("Exiting, execute the application a second time to use the source.");
// The source is created. Exit the application to allow it to be registered.
return;
}
// 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.");
}
}
私はそれがあなたが求めていたものと正確に一致しないかもしれないことを知っていますが、これがこれを行う唯一の方法だと思います.
編集1:さらにコードを追加
public class EventLogger
{
private const string logName = "Application";
private static string appName = "";
private static bool sourceExists = false;
public static string AppName
{
get { return appName; }
set { appName = value; }
}
public static void Init(string appName)
{
AppName = appName;
sourceExists = EventLog.SourceExists(AppName);
if (!sourceExists)
{
EventLog.CreateEventSource(AppName, logName);
sourceExists = true;
}
}
private static void Write(string entry, EventLogEntryType logType, int eventID)
{
if (sourceExists)
{
EventLog.WriteEntry(AppName, entry, logType, eventID);
}
}
public static void Warning(string entry) { Write(entry, EventLogEntryType.Warning, 200); }
public static void Warning(string entry, int eventID) { Write(entry, EventLogEntryType.Warning, eventID); }
public static void Error(string entry) { Write(entry, EventLogEntryType.Error, 300); }
public static void Error(string entry, int eventID) { Write(entry, EventLogEntryType.Error, eventID); }
public static void Info(string entry) { Write(entry, EventLogEntryType.Information, 100); }
public static void Info(string entry, int eventID) { Write(entry, EventLogEntryType.Information, eventID); }
}
これは、本番アプリケーションで使用されている EventLogger クラスを実装した方法です。
コードを投稿していただければ、比較を行うことができます。
ソースを作成するときに、アプリケーション名を使用しているのに、アプリケーション ログファイルをそのまま使用していることに気付きました。また、新しいログファイルを作成しようとしていますか? その場合は、イベント ビューアで作成されていることを確認してください。
編集 2: ゼロのユーザー トークン値でユーザーを偽装する
これはちょっと困ったことです。
イベント書き込みコードをラップしたこのコードを試してください。
System.Security.Principal.WindowsImpersonationContext wic = System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero);
// your code to write to event log or any to do something which needs elevated permission--
wic.Undo();
私のコードが機能しているという理由だけで、私はこれを試していません。 -書き込みアクセスを持っている/