Исправление System.Security.SecurityException при записи в журнал событий

Im работает над попыткой переноса приложения ASP.NET с сервера 2003 (и IIS6) на Server 2008 (IIS7).

Когда я пытаюсь посетить страницу в браузере, я получаю следующее:

Ошибка сервера в '/приложении.

Исключение безопасности

Описание: приложение попыталось выполнить операцию, не разрешенную политикой безопасности. Чтобы предоставить этому приложению требуемые разрешения, обратитесь к своему системному администратору или измените уровень доверия приложений в файле конфигурации.

Сведения об исключении: System.Security.SecurityException: источник не найден, но некоторые или все журналы событий не могут быть найдены. Недостижимые журналы: безопасность

Ошибка источника:

Необработанное исключение было создано во время выполнения текущего веб-запроса. Информация о происхождении и местоположении исключения может быть идентифицирована с использованием трассы стека исключений ниже.

Трассировка стека:

[SecurityException: источник не найден, но некоторые или все журналы событий не могут быть найдены. Недостижимые журналы: безопасность.]

System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly) +562 System.Diagnostics.EventLog.SourceExists(String source, String machineName) +251

[надрез]

Вот что я сделал, чтобы попытаться решить эту проблему:

  • Дайте "всем" полное разрешение доступа к ключу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security. Это сработало. Но, естественно, я не могу сделать это в производстве. Поэтому я удалил разрешение "Все" после запуска приложения в течение нескольких минут, и ошибка снова появилась.

  • Я создал источник в журнале приложений и в журнале безопасности (и я проверял его через regedit) во время установки с повышенными разрешениями, но ошибка осталась.

  • Я дал приложению полный уровень доверия в файле web.config (и используя appcmd.exe), но безрезультатно.

Есть ли у кого-нибудь представление о том, что можно сделать здесь?

PS: Это продолжение question. Я следовал данным ответам, но безрезультатно (см. № 2 выше).

Ответ 1

Решение заключалось в предоставлении разрешения на чтение учетной записи "Сетевая служба" на ключ EventLog/Security.

Ответ 2

Чтобы предоставить Network Service разрешение на чтение с помощью клавиши EventLog/Security (как предложено Firenzi и royrules22), следуйте инструкциям http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx

  • Откройте редактор реестра:
    • Выберите Start, затем Run
    • Введите regedt32 или regedit
  • Перейдите/развернитесь до следующего ключа:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

  • Щелкните правой кнопкой мыши на этой записи и выберите Разрешения

  • Добавьте пользователя Network Service

  • Предоставить разрешение на чтение

ОБНОВЛЕНИЕ: Вышеупомянутые шаги в порядке, на машинах разработчика, где вы не используете процесс развертывания для установки приложения.
Однако, если вы развертываете свое приложение на другой машине, рассмотрите регистрировать источники журнала событий во время установки, как предложено в SailAvid и ответы Николь Калиноу.

Я использую функцию PowerShell (вызов в Octopus Deploy.ps1)

function Create-EventSources() {
    $eventSources = @("MySource1","MySource2" )
    foreach ($source in $eventSources) {
            if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
                [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
            }
    }
}

Ответ 3

Проблема заключается в том, что EventLog.SourceExists пытается получить доступ к ключу EventLog\Security, доступ к которому разрешен только для администратора.

Общим примером для входа в программу С# Program в EventLog является:

string sSource;
string sLog;
string sEvent;

sSource = "dotNET Sample App";
sLog = "Application";
sEvent = "Sample Event";

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 234);

Однако следующие строки терпят неудачу, если у программы нет прав администратора и ключ не найден в EventLog\Application, поскольку EventLog.SourceExists попытается получить доступ к EventLog\Security.

if (!EventLog.SourceExists(sSource))
    EventLog.CreateEventSource(sSource, sLog);

Поэтому рекомендуемым способом является создание установки script, которая создает соответствующий ключ, а именно:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Пример приложения

Затем можно удалить эти две строки.

Вы также можете создать файл .reg для создания раздела реестра. Просто сохраните следующий текст в файле create.reg:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]

Ответ 4

У меня была очень похожая проблема с консольной программой, которую я разрабатывал под VS2010 (обновлен от VS2008 под XP) Моя программа использует EnLib для выполнения некоторых протоколов. Ошибка была уволена, поскольку у EntLib не было права регистрировать новый источник событий.

Итак, я начал с того, что скомпилировал prog в качестве администратора: он зарегистрировал источник события. Затем я вернулся к разработке и отладке изнутри VS без проблем.

(вы также можете обратиться к http://www.blackwasp.co.uk/EventLog_3.aspx, это помогло мне

Ответ 5

Для меня было предоставлено разрешение "Чтение" для "NetworkService" для всей ветки "EventLog".

Ответ 6

Это исключение произошло для меня из консольного приложения .NET, работающего как запланированное задание, и я пытался сделать в основном то же самое - создать новый источник событий и записать в журнал событий.

В конце концов, установка полных прав для пользователя, под которым выполнялась задача на следующих клавишах, сделала трюк для меня:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog

Ответ 7

Я столкнулся с одной и той же проблемой, но мне нужно было подняться на один уровень и предоставить полный доступ ко всем в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\key вместо того, чтобы перейти к безопасности, что позволило решить проблему для меня.

Ответ 8

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

Другой способ решить проблему:

  • в консоли IIS, перейдите в пул приложений, управляющих вашим сайтом, и обратите внимание на то, что он работает (обычно это сетевая служба)
  • удостоверьтесь, что этот идентификатор может читать KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog (rigth-click, авторизация)
  • теперь измените личность этого пула приложений на локальную систему, примените и вернитесь к Network Service

Учетные данные будут перезагружены, а EventLog reacheable

в http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx, спасибо Michael Freidgeim

Ответ 9

FYI... моя проблема заключалась в том, что случайно выбрана "Локальная служба" в качестве учетной записи свойств свойств ProcessInstaller вместо "Local System". Просто упомянуть для всех, кто следил за учебником MSDN, так как сначала выбирается выбор Local Service, и я не обращал пристального внимания....

Ответ 10

Я не работаю над IIS, но у меня есть приложение, которое выдает ту же ошибку в поле 2K8. Он отлично работает на коробке 2K3, идите на фигуру.

Мое решение состояло в том, чтобы "Запуск от имени администратора", чтобы предоставить приложению повышенные права, и все работает с радостью. Надеюсь, это поможет вам в правильном направлении.

Windows 2008 - права/разрешения/возвышение, действительно отличные от Windows 2003, gar.

Ответ 11

Такая же проблема для Windows 7 64bit. Запуск от имени администратора был решен.

Ответ 12

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

1) Перейдите в свой реестр, найдите: HKLM\System\CurrentControlSet\Services\EventLog\Application (??? YOUR_SERVICE_OR_APP_NAME???)

Обратите внимание, что "(??? YOUR_SERVICE_OR_APP_NAME???)" - это ваше имя службы приложений, как вы его определили, когда вы создали развертывание .NET, например, если вы назвали свое новое приложение "Мое новое приложение", то ключ будет: HKLM\System\CurrentControlSet\Services\EventLog\Application\My New app

Примечание2. В зависимости от того, в какой из событий eventLog вы вписываетесь, вы можете найти в своем поле DEV,\Application\(как указано выше), а также (\ System) или (\ Security) в зависимости от того, какое событие записывает ваше приложение в основном, (\ Application) должно быть хорошо все время.

2) Находясь на клавише выше, из меню; Выберите "ФАЙЛ" → "Экспорт", а затем сохраните файл. (Примечание. Это создало бы необходимые параметры реестра, когда приложению понадобится доступ к этому ключу для записи в средство просмотра событий), новый файл будет .REG файлом для аргументации, назовите его "My New App.REG"

3) При развертывании в PRODuction обратитесь к администратору системы сервера (SA), передайте файл "Мой новый файл App.REG" вместе с приложением и попросите SA установить этот файл REG после его выполнения (в качестве администратора ) это создаст ключ для вашего приложения.

4) Запустите приложение, ему не нужно будет получать доступ к чему-либо другому, кроме этого ключа.

Теперь проблема должна быть решена.

Причина:

При разработке приложения, которое что-либо записывает в EventLog, для него в разделе реестра Eventlog потребуется KEY, если этот ключ не найден, он попытается его создать, а затем не будет иметь никаких разрешений для этого, Вышеупомянутый процесс похож на развертывание приложения (вручную), тогда как мы сами это создаем и не нуждаемся в головной боли, так как вы не настраиваете реестр, добавляя разрешения для EVERYONE, который представляет собой риск безопасности на рабочих серверах.

Я надеюсь, что это поможет разрешить его.

Ответ 13

При использовании System.Diagnostics.EventLog.WriteEntry( "SourceName", "ErrorMessage" ) необходимо создать новый ключ с используемым именем источника в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application в regEdit, EventLogEntryType.Error);

Таким образом, у вашего пользователя нет разрешения на создание ключа. В зависимости от пользователя, который вы используете, из значения Identity в дополнительных пулах приложений, можно сделать следующее:

  • Запустите RegEdit и перейдите в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
  • Щелкните правой кнопкой мыши ключ EventLog и выберите параметр Разрешения... 3.Добавьте своего пользователя с полным доступом к управлению.

    -Если вы используете "NetworkService" , добавьте пользователя NETWORK SERVICE

    -Если вы usinf "ApplicationPoolIdentity" , добавьте IIS APPPOL {имя вашего пула приложений} (используйте локальное расположение компьютера при поиске пользователя).

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

  • Повторите шаги от 1 до 3 для HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security

Для отладки в Visual Studio я использую "NetworkService" (это пользователь ASP.NET), и когда сайт публикуется, я использовал "AppicationPoolIdentity".

Ответ 14

Я сталкиваюсь с аналогичной проблемой - в моем случае Source содержал символы <, >. 64-разрядные машины используют новую четную базу данных log-xml, которую я бы сказал, и эти символы (заданные из строки) создают недопустимый xml, который вызывает исключение. Возможно, это должно рассматриваться как проблема Microsoft - не правильно обрабатывать Source (имя/строка).

Ответ 15

У нас была аналогичная проблема со всеми нашими серверами 2008 года. Журнал безопасности полностью перестает работать из-за объекта групповой политики, который взял группу Authenticated Users и прочитал разрешение от ключа HKLM\System\CurrentControlSet\Services\EventLog\security

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

Ответ 16

Хотя ответ установщика является хорошим ответом, он не всегда практичен при работе с программным обеспечением, которое вы не пишете. Простым ответом является создание журнала и источника событий с помощью команды PowerShell New-EventLog (http://technet.microsoft.com/en-us/library/hh849768.aspx)

Запустите PowerShell в качестве администратора и выполните следующую команду, изменив имя журнала и источник, который вам нужен.

Новое-EventLog -LogName Приложение -Source TFSAggregator

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

Ответ 17

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

Два из них, которые я начал использовать, это ".Net Runtime" и "Application Error", оба из которых выглядят так, как будто они будут присутствовать на большинстве машин.

Основными недостатками являются неспособность группироваться по этому событию и что у вас, вероятно, нет связанного с ним идентификатора события, что означает, что запись в журнале может быть префиксирована чем-то вроде "Описание для идентификатора события 0 из источник .Net Runtime не может быть найден...", если вы его опустите, но журнал входит, и вывод выглядит широко разумным.

В результате получившийся код выглядит следующим образом:

EventLog.WriteEntry(
    ".Net Runtime", 
    "Some message text here, maybe an exception you want to log",
    EventLogEntryType.Error
    );

Конечно, поскольку всегда есть шанс, что вы на машине, у которой нет каких-либо источников событий по какой-либо причине, вы, вероятно, захотите try {} catch{} обернуть ее, если она терпит неудачу, и усугубит ситуацию, но события теперь можно сохранить.

Ответ 18

Мое приложение устанавливается на клиентских веб-серверах. Вместо того, чтобы возиться с разрешениями сетевой службы и реестром, я решил проверить SourceExists и запустить CreateEventSource в моем установщике.

Я также добавил try/catch вокруг log.source = "xx" в приложении, чтобы установить его в известный источник, если мой источник событий не был создан (это только придет, если я горячая замена .dll вместо повторной установки).

Ответ 19

Решение очень просто - Запустите приложение Visual Studio в режиме администратора!

Ответ 20

попробуйте ниже в web.config

 <system.web>

<trust level="Full"/>

</system.web>

Ответ 21

У меня была эта проблема при запуске приложения в VS. Все, что мне нужно было сделать, это запустить программу как Администратор один раз, затем я мог бы работать из VS.

Для запуска в качестве администратора просто перейдите в папку отладки в проводнике Windows. Щелкните правой кнопкой мыши программу и выберите "Запуск от имени администратора".

Ответ 22

Восстановление решения для меня