Исключение безопасности при записи в EventLog из приложения ASP.NET MVC - PullRequest
9 голосов
/ 23 октября 2009

У меня есть библиотека, которую я создал с некоторой бизнес-логикой, которая включает запись в экземпляр System.Diagnostics.EventLog. Библиотека обычно вызывается из приложения службы Windows, но сейчас я пытаюсь вызвать те же функции библиотеки из моего приложения ASP.NET MVC.

Я попробовал этот код внутри моего контроллера, чтобы создать экземпляр EventLog, который я передаю в метод, который должен записываться в журнал.

Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp")

Следующая ошибка генерируется, когда код в методе библиотеки пытается записать в журнал:

[SecurityException: Requested registry access is not allowed.]
 System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51
 Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217
 System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366
 System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194
 System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205
 System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14

Мое веб-приложение работает как пользователь сетевой службы на Windows Server 2003 с IIS 6. Нужно ли что-то делать, чтобы дать пользователю сетевой службы доступ к реестру?

Есть ли лучший способ создать экземпляр EventLog для использования в приложении ASP.NET MVC? Есть ли уже созданный фреймворк, на который мне просто нужно сослаться?

Ответы [ 3 ]

19 голосов
/ 25 октября 2009

Из MSDN: «Приложения, работающие с использованием идентификатора Network Service, могут записывать в журнал событий , используя существующие источники событий , но они не могут создавать новые источники событий из-за недостаточных разрешений реестра. "

И ...

" Если Источник для журнала событий, связанного с экземпляром EventLog , не существует, создается новый источник событий. "

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

"Чтобы приложение ASP.NET могло выполнять запись в журнал событий с использованием источника событий, который еще не существует, у вас есть две опции:"

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

Итак, необходимо создать журнал за пределами приложения (вы не можете сделать это программно с этим пользователем. Сделайте это либо вручную, либо создайте простое приложение командной строки для упрощения установки).

Для получения полной информации:

http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess

Лично я бы порекомендовал вам не изменять разрешения для пользователей сети, а создавать источник журналов вне веб-приложения. Я предпочитаю консольное приложение (которое займет у вас около 5 минут, чтобы написать, и которое вы также можете использовать для подготовки других машин). Запустите новое консольное приложение в VS.NET и добавьте код для создания источников журналов. Пример:

http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx

Затем просто запустите консольное приложение из строки cmd при входе в систему с соответствующими разрешениями.

5 голосов
/ 14 июня 2013

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

Более простым решением было бы переключить пул приложений на временное использование LocalSystem, затем запустить приложение и выдать ошибку. Он сможет создать соответствующий источник журнала событий, и после этого вы сможете переключить его обратно на использование NetworkService.

0 голосов
/ 29 января 2016

Я не знаю, почему вы не можете создать свой собственный EventLog вместо записи в журнале приложений.

Вы можете создать приложение окна / консоли со следующим кодом и запустить его от имени администратора, это создаст для вас новый журнал.

if (!EventLog.Exists("LOG_NAME"))
   EventLog.CreateEventSource("LOG_NAME", "LOG_NAME");

это создаст новый журнал внутри журнала событий и будет виден в журналах приложений и сервисов.

 if (!EventLog.SourceExists("MyMVCApp"))
    EventLog.CreateEventSource("MyMVCApp", "LOG_NAME");

Это создаст новый источник внутри пользовательского «LOG_NAME», и вы сможете использовать код

Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp")

для создания собственного журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...