2013-09-19 3 views
1

Я пишу небольшую dll для моего webapp. Я отслеживаю службу, у меня есть веб-страница, показывающая, работает ли служба, остановлена ​​или что-то другое. Поэтому я хотел бы получить последние 10 записей EventLog, зарегистрированных этой службой. Но когда я делаю, я получаю исключение, вызывая ToArray(). Что мне делать?Не удается прочитать журнал событий из-за SecurityException

public static IEnumerable<EventLogEntry> GetEventLogs(string serviceName) 
    { 
     if (!EventLog.SourceExists(serviceName)) 
      throw new ArgumentException("Service not found", "serviceName"); 
     var myLog = new EventLog { Source = "MySource" }; 

     var entries = myLog.Entries; 
     return (from EventLogEntry entry in entries 
       where entry.Source == serviceName 
       select entry).ToArray(); 
    } 

Так EventLog.SourceExists(serviceName) возвращается true, но после того, как он выходит из строя.

Он терпит неудачу в то время как переборе Security папку, но мне нужно Application только



Решенные

Забавно, что я могу читать из указанной папки, однако. Это зависит от Log объекта EventLog класс. Поэтому я должен просто заменить одну строку на это

var myLog = new EventLog {Source = "MySource", Log = "Application"}; 

Другая шутка - это иногда работает. А иногда нет. Например, этот код работает для моих служб, но не работает с услугой netprofm. tnx для помощи всем

ответ

3

Вам необходимо иметь права администратора для чтения из журнала событий. Вы работаете как администратор?

Вы также можете изменить права доступа к этому в реестре:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security 

правой кнопкой мыши на этой записи, выберите разрешения, и убедитесь, что у вас есть доступ.

Вы не можете просто пропустить папку безопасности и посмотреть только в приложении. От documentation:

Для поиска источника события в Windows Vista и более поздних версиях или Windows Server 2003 у вас должны быть административные привилегии. Причиной этого требования является то, что необходимо найти все журналы событий, включая безопасность,, чтобы определить, уникален ли источник событий. Начиная с Windows Vista, пользователи не имеют доступа к журналу безопасности; поэтому возникает исключение SecurityException.

Further reading и другая соответствующая цитата:

нет необходимости указывать источник, когда только чтение из журнала. Вы можете указать только имя журнала и имя_источника (имя сервера) для экземпляра EventLog.

+0

Я могу работать как администратор, но на стороне клиента я не буду. Могу ли я программно повышать привилегии, возможно, используя манифест и так далее? А также проблема в том, что я пишу dll, поэтому код вызова также должен быть запущен как администратор ... –

+0

@AlexJoukovsky Elevation - это возможность, это зависит от того, какое это приложение. Если ваша DLL находится в GAC, вы должны иметь возможность записывать в журнал событий через это, поскольку у GAC будут привилегии для этого.Это в основном связано с требованием, чтобы для установки GAC вам нужно было иметь права администратора при установке приложения для начала. Если клиент полностью не в состоянии сделать это, тогда нет никакого способа обойти этот AFAIK. – tnw

+0

Добавлена ​​некоторая информация выше –

Смежные вопросы