2015-05-25 4 views
0

Мое приложение находится на C# .NET и развертывается на разных компьютерах. Пользователи моего приложения имеют обычные права доступа (никаких прав ADMIN). На нескольких системах я получаю System.Security.SecurityException. Он говорит: «System.Security.SecurityException: источник не был найден, но некоторые или все журналы событий не могли быть найдены Недоступные журналы: безопасность».System.Security.SecurityException при записи в журнал событий C#

Я сделал несколько обходных путей: -

  1. на одной машине я запустил приложение с правами администратора, он отлично работал - никаких проблем.
  2. Я добавил группу пользователей в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog \ Security. Все нормально.

Я не хочу идти на все машины и делать над обходными методами. Мне нужно какое-то общее обходное решение, которое можно применить один раз на всех машинах. Любая помощь?

Записав несколько строк кода: - Config файл: -

<add key="E_Source" Value="ABC"> 

C# код

Public static readonly string E_Source = ConfigManager.GetString("E_Source"); 

EventLog.writeEntry(E_Source, logtext, logtype); 

Заранее спасибо

+0

Есть действительно только две исправления, которые я нашел, не требуя прав администратора. 1) Добавьте сертификат в свое приложение и сделайте этот сертификат доверенным в своем домене. 2) Сверните свой собственный регистратор и откройте журнал событий Windows. Я предполагаю, что есть вариант. 3) Создайте специальную учетную запись пользователя домена только для ведения журнала и выполните код регистратора под специальным контекстом пользователя. – VoteCoffee

+1

См. Мой ответ на https://stackoverflow.com/questions/8447948/log4net-eventlog-permissions-issue. -using-non-administrator-account/8478672 # 8478672 – sgmoore

+0

Вам нужны только повышенные права на создание источника событий, а не запись на него. Поэтому, если ваше приложение имеет установщик, который все равно должен запускаться как администратор, в это время создайте источник события. – Crowcoder

ответ

0

Если вы пишете в EventLog программно , вам необходимо создать источник событий с повышенными разрешениями, как указано в документации по классу EventLog:

https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog%28v=vs.110%29.aspx

+0

FYI, в то время как ваш ответ действительно, по первому вопросу, у пользователей нет прав администратора для этого – VoteCoffee

+3

Это не совсем так. Вам не нужны права администратора для записи в журнал событий, однако вам нужен админ для создания источника событий, поэтому это обычно делается как часть установки. – sgmoore

+0

Спасибо. Я отредактировал ответ, чтобы отразить несоответствие. – maniak1982

4

Чтобы найти источник, который вы хотите написать, NET перечисляет все журналы событий. Если этого не существует, .NET в конечном итоге попытается перечислить через журнал безопасности, для которого у вас даже нет прав чтения как обычный пользователь. Таким образом, вы получаете SecurityException.

Таким образом, вы должны убедиться, что журнал событий существует (какой AFAIK вы не можете обойтись без запуска исключения). Обычно это делается как часть вашей установки/установки. Затем, при написании, поймайте SecurityException и обработайте его соответствующим образом (например, покажите сообщение об ошибке, которое невозможно записать в журнал).

+0

Я изо всех сил пытаюсь понять ваш ответ. Если журнал событий не существует, зачем его искать? – jpmc26

+1

@ jpmc26 Я переформулировал свой ответ. –