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


189

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

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

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

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

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

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

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

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

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

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

System.Diagnostics.EventLog.FindSourceRegistration (строковый источник, строковое имя машины, логическое чтение только) +562 System.Diagnostics.EventLog.SourceExists (строковый источник, строковое имя машины) +251

[Надрез]

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

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

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

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

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

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


Я получал это при попытке записи в пользовательский источник в .Net-сервисе, который работал как NetworkService. Я просто изменил источник журнала событий, чтобы он соответствовал имени службы, которое было установлено с помощью пакета .Net Service Setup, и оно работало без установки разрешений реестра. Я заметил это, увидев имя службы в качестве ключа уже в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
Джон Адамс,


2
Другой возможный ответ: щелкните правой кнопкой мыши на exe и выберите «Запуск от имени администратора»
MacGyver

Ответы:


169

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

  1. Откройте редактор реестра:
    1. StartЗатем выберитеRun
    2. Введите regedt32илиregedit
  2. Перейдите / разверните следующую клавишу:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

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

  4. Добавить Network Serviceпользователя

  5. Дайте разрешение на чтение

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

Я использую функцию 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")
            }
    }
}

В IIS7 вы можете назначить «СЕТЬ СЕТИ» в качестве идентификатора для пула приложений (может оказаться, что ApplicationPoolIdentity используется по умолчанию) или вместо этого вы можете создать нового пользователя для каждого пула приложений и установить разрешения для этой «пользовательской учетной записи». см. Укажите идентификатор для пула приложений (IIS 7)
Grokodile

5
Изменения вступают в силу только после перезапуска приложения в IIS
Zé Carlos

7
Я дал IIS_IUSRS разрешение на чтение / запись ключа журнала событий и чтение ключа безопасности. Моему продукту требовался доступ для записи ключа журнала событий, потому что он создавал собственный источник событий.
duck9

1
duck9 я исправляю для IIS8, смотрите здесь для более подробной информации: stackoverflow.com/questions/712203/…
thedrs

1
Также посмотрите на serverfault.com/a/81246/219898 относительно пользователей пула приложений и соответствующих разрешений - для этого решения. Спасибо @Michael Freidgeim - была большая помощь.
Энтони Хорн

59

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

Типичный пример входа в программу C # 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\Applicationas EventLog.SourceExists, после чего попытается получить доступ EventLog\Security.

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

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

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]

1
Это именно то, что я делаю для всех моих услуг. Я считаю, что это правильно. В каждом сервисе, где я использую журнал событий, у меня есть файл .reg, подобный приведенному выше. Одно маленькое примечание, файл должен быть сохранен как Unicode-32 (cp 1200.)
Valo

Этот ответ описывает реальную причину ошибки. Проверка существует, пытается перечислить весь ключ. если он существует, checkExists работает нормально.
Дан

EventLog \ Security - это ключ к работе, убедитесь, что у вас есть разрешение на это.
Принца

45

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


1
Я вижу похожие решения вокруг. Но мне просто интересно, почему это так. Потому что я вижу, что многие сервисы вошли в систему как NetworkService, и они должны иметь возможность читать журнал событий / безопасность. Так почему же нужно добавить разрешение для NetworkService?
h - n

11
Для тех из нас, кто обычно не сканирует
Аллан

Хорошая ссылка Аллан. Пункт № 3 по принятому ответу важен и уже укусил меня однажды. т.е. предоставление разрешения в родительском разделе реестра EventLog НЕ распространяется на «недоступные журналы», такие как Security и Virtual Server, даже если они являются дочерними ключами в реестре. Если вам нужен полный доступ к журналу событий, вы должны предоставить разрешение на ОБА уровне родительского журнала событий и дочерних уровней безопасности.
Бен Баррет

1
Изменения вступают в силу только после перезапуска приложения на IIS
Zé Carlos

Для тех, кто пытался скопировать / вставить, убедитесь, что между словами «Сетевой сервис» есть пробел.
Крис Фремген

7

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


это не очень важно, потому что для подключей, таких как «Безопасность» или «Виртуальный сервер», необходимо предоставить доступ на чтение индивидуально, так как были установлены разрешения не наследовать от родительского ключа.
Серж

7

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

Поэтому я однажды запустил мою скомпилированную прогу как Администратор : она зарегистрировала источник события. Затем я вернулся к разработке и отладке изнутри VS без проблем.

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


7

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

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

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

3
Ты спас мой день. Кстати, разрешение на чтение было достаточно на eventlog\Applicationи eventlog\Security; полный контроль требуется eventlogтолько для пользователя root.
Рууд Хелдерман,

6

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

Еще один способ решения проблемы:

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

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

в http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx , спасибо Майклу Фрайдгейму


Изменение пула приложений с «ApplicationPoolIdentity» на «LocalSystem» решило проблему создания / чтения журналов событий для меня.
Великий

4

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


1
Также попробуйте настроить приложение для запуска в качестве LocalSystem, чтобы был создан раздел реестра, а затем вы можете вернуться к NetworkService.
demoncodemonkey

4

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


4

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

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

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

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

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

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

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

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


3

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


3

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

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

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

Результирующий код выглядит примерно так:

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

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


2

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

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

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


2

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

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), в зависимости от того, в какое событие пишет ваше приложение, в основном (\ Приложение) должно быть все время в порядке.

2) Находясь на клавише выше, из меню; Выберите «FILE» -> «Export», а затем сохраните файл. (Примечание: это создаст необходимые параметры реестра, когда приложению потребуется доступ к этому ключу для записи в средство просмотра событий), новый файл будет .REG-файлом, для аргумента ради, назовите его «My New App.REG». "

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

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

Проблема должна быть решена к настоящему времени.

Причина:

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

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


2

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

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

New-EventLog -LogName Application -Source TFSAggregator

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


1

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

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


1

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


1

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


При устранении неполадок в VS и получил эту ошибку, это все
исправило

Это может привести к ошибке, потому что не VS вызывает этот вызов, а приложение, которое, вероятно, работает в другом контексте безопасности.
CodeMonkey1313,

0

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

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



-1

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.