System.Security.SecurityException при записи в журнал событий
Я работаю над попыткой портировать приложение ASP.NET с Server 2003 (и IIS6) на Server 2008 (IIS7).
Когда я пытаюсь зайти на страницу в браузере, я получаю это:
Ошибка сервера в приложении '/'
Исключение безопасности
Описание: приложение попыталось выполнить операцию, не разрешенную политикой безопасности. Чтобы предоставить этому приложению необходимые разрешения, обратитесь к системному администратору или измените уровень доверия приложения в файле конфигурации.
Сведения об исключении: System.Security.SecurityException: источник не найден, но не удалось найти некоторые или все журналы событий. Недоступные журналы: безопасность
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.
Трассировки стека:
[SecurityException: источник не был найден, но не удалось найти некоторые или все журналы событий. Недоступные журналы: безопасность.]
System.Diagnostics.EventLog.FindSourceRegistration (строковый источник, строковое имя-машины, логическое чтение только) +562 System.Diagnostics.EventLog.SourceExists(строковый источник, строковое имя-машины) +251
[Надрез]
Вот что я сделал, чтобы попытаться решить эту проблему:
Дайте "Все" разрешение на полный доступ к ключу
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security
, Это сработало. Но, естественно, я не могу сделать это в производстве. Поэтому я удалил разрешение "Все" после запуска приложения в течение нескольких минут, и ошибка снова появилась.Я создал источник в журнале приложений и журнале безопасности (и я убедился, что он существует через regedit) во время установки с повышенными разрешениями, но ошибка осталась.
Я дал приложению полный уровень доверия в
web.config
файл (и использованиеappcmd.exe
) но безрезультатно.
У кого-нибудь есть понимание того, что здесь можно сделать?
PS: это продолжение этого вопроса. Я следовал за данными ответами, но безрезультатно (см. № 2 выше).
23 ответа
Решением было дать разрешение на чтение учетной записи "Сетевая служба" на ключ EventLog/Security.
Дать 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")
}
}
}
Проблема в том, что 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\Application
как 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]
Это исключение происходило для меня из консольного приложения.NET, работающего как запланированная задача, и я пытался сделать в основном то же самое - создать новый источник событий и записать его в журнал событий.
В конце концов, установка полных разрешений для пользователя, под которым выполнялась задача на следующих ключах, сделала мне свое дело:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
Для меня работало только предоставление разрешений "Чтение" для "NetworkService" всей ветви "EventLog".
Я пытаюсь почти все здесь, чтобы решить эту проблему... Я делюсь здесь ответом, который помогает мне:
Еще один способ решения проблемы:
- в консоли IIS перейдите в пул приложений, управляющий вашим сайтом, и запишите удостоверение, на котором он запущен (обычно это сетевая служба)
- убедитесь, что это удостоверение может читать KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog (щелчок правой кнопкой мыши, авторизация)
- теперь измените удостоверение этого пула приложений на локальную систему, примените и переключитесь обратно на сетевую службу
Учетные данные будут перезагружены, а EventLog - повторно
в http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx, спасибо Майклу Фрайдгейму
У меня была очень похожая проблема с консольной программой, которую я разрабатываю под VS2010 (обновленной с VS2008 под XP). Моя прога использует EnLib для некоторой регистрации. Ошибка была вызвана тем, что у EntLib не было разрешения зарегистрировать новый источник событий.
Поэтому я однажды запустил мою скомпилированную прогу как Администратор: она зарегистрировала источник события. Затем я вернулся к разработке и отладке изнутри VS без проблем.
(Вы также можете обратиться к http://www.blackwasp.co.uk/EventLog_3.aspx, это помогло мне
Новый ключ с именем источника должен быть создан в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\ Приложение в regEdit при использовании System.Diagnostics.EventLog.WriteEntry("SourceName", "ErrorMessage", EventLogEntryType.Error);
Так что в основном ваш пользователь не имеет разрешения на создание ключа. Может сделать следующее в зависимости от пользователя, которого вы используете из значения Identity в расширенных настройках пула приложений:
- Запустите RegEdit и перейдите в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog
Щелкните правой кнопкой мыши по ключу EventLog и выберите опцию Permissions... 3. Добавьте вашего пользователя с полным доступом к элементу управления.
-Если вы используете "NetworkService", добавьте пользователя NETWORK SERVICE
-Если вы используете "ApplicationPoolIdentity", добавьте IIS APPPOL{имя пула приложений} (используйте местоположение на локальном компьютере при поиске пользователя).
-Если вы используете "LocalSystem", убедитесь, что у пользователя есть права администратора. Это не рекомендуется для уязвимостей.
Повторите шаги с 1 по 3 для HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security
Для отладки в Visual Studio я использую "NetworkService" (это пользователь ASP.NET), а когда сайт опубликован, я использовал "AppicationPoolIdentity".
Похоже, что существует очевидное решение, и я пока не вижу огромного недостатка, по крайней мере там, где непрактично получать административные права для создания собственного источника событий: используйте тот, который уже есть.
Два, которые я начал использовать, это ".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{}
оберните его на случай, если он потерпит неудачу и усугубит ситуацию, но события теперь можно сохранить.
Та же проблема на Windows 7 64bit. Запустите, как администратор решил проблему.
Я столкнулся с той же проблемой, но мне пришлось подняться на один уровень выше и дать всем полный доступ к ключу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\ вместо того, чтобы перейти к безопасности, которая прояснила проблему для меня.
К вашему сведению... моя проблема заключалась в том, что случайно выбрал "Local Service" в качестве учетной записи на свойствах ProcessInstaller вместо "Local System". Просто упомяну о ком-то еще, кто следовал учебному пособию по MSDN, поскольку выбор Местной службы показывает сначала, и я не обращал пристального внимания....
Я не работаю над IIS, но у меня есть приложение, которое выдает ту же ошибку на коробке 2K8. Он отлично работает на коробке 2K3.
Я решил "Запуск от имени администратора", чтобы предоставить приложению повышенные права, и все работает хорошо. Я надеюсь, что это поможет вам в правильном направлении.
Windows 2008 - это права / разрешения / повышение прав и действительно отличается от Windows 2003, gar.
Привет, я столкнулся с той же проблемой, когда разрабатывал приложение и хотел установить его на удаленном ПК, я исправил это, выполнив следующие действия:
1) Перейдите в свой реестр, найдите: HKLM\System\CurrentControlSet\Services\EventLog\Application(???YOUR_SERVICE_OR_APP_NAME???)
Обратите внимание, что "(???YOUR_SERVICE_OR_APP_NAME???)" - это имя службы приложения, которое вы определили при создании развертывания.NET, например, если вы назвали свое новое приложение "Мое новое приложение", ключом будет: HKLM \ System \ CurrentControlSet \ Services \ EventLog \ Приложение \ Мое новое приложение
Примечание 2: В зависимости от того, в какой EventLog вы пишете, вы можете найти в вашем окне DEV, \Application\ (как отмечено выше) или также (\System) или (\Security), в зависимости от того, в какое событие ваше приложение пишет, в основном, (\Application) должно быть все время в порядке.
2) Находясь на клавише выше, из меню; Выберите "FILE" -> "Export" и сохраните файл. (Примечание. Это создаст необходимые параметры реестра, когда приложению потребуется доступ к этому ключу для записи в средство просмотра событий), новый файл будет представлять собой файл.REG, для аргумента, назовите его "My New App.REG". "
3) При развертывании в PRODuction проконсультируйтесь с системным администратором (SA) сервера, передайте файл "My New App.REG" вместе с приложением и попросите SA установить этот файл REG, как только это будет сделано (как администратор), это будет создайте ключ для вашего приложения.
4) Запустите ваше приложение, оно не должно иметь доступа ни к чему другому, кроме этого ключа.
Проблема должна быть решена к настоящему времени.
Причина:
При разработке приложения, которое записывает что-либо в EventLog, ему потребуется ключ для него в реестре Eventlog, если этот ключ не найден, он попытается создать его, что затем не удается из-за отсутствия разрешений для этого. Вышеописанный процесс аналогичен развертыванию приложения (вручную), в то время как мы создаем его сами, и вам не нужно испытывать головную боль, поскольку вы не настраиваете реестр, добавляя разрешения для ВСЕГО, что создает риск для безопасности на производственных серверах.
Я надеюсь, что это помогает решить это.
Хотя ответ установщика - хороший ответ, он не всегда практичен при работе с программным обеспечением, которое вы не писали. Простой ответ - создать журнал и источник событий с помощью команды PowerShell New-EventLog ( http://technet.microsoft.com/en-us/library/hh849768.aspx).
Запустите PowerShell от имени администратора и выполните следующую команду, изменив нужное имя журнала и источник.
New-EventLog -LogName Application -Source TFSAggregator
Я использовал его, чтобы решить исключение журнала событий, когда Aggregator запускает проблему из кодекса.
Я столкнулся с аналогичной проблемой - в моем случае источник содержал <
, >
персонажи. Я бы сказал, что 64-битные машины используют новую четную базу log - xml, и эти символы (из строки) создают недопустимый xml, что вызывает исключение. Возможно, это должно быть связано с проблемой Microsoft - неправильно обрабатывать источник (имя / строку).
Была похожая проблема со всеми нашими серверами 2008 года. Журнал безопасности перестал работать вообще из-за объекта групповой политики, который забрал группу Authenticated Users и разрешение на чтение от ключа HKLM\System\CurrentControlSet\Services\EventLog\security
Возврат этого в соответствии с рекомендацией Microsoft устранил проблему. Я подозреваю, что чтение всех аутентифицированных пользователей на более высоком уровне также исправит вашу проблему.
Решение очень простое - запустите приложение Visual Studio в режиме администратора!
Мое приложение устанавливается на клиентских веб-серверах. Вместо того, чтобы возиться с разрешениями сетевой службы и реестром, я решил проверить SourceExists
и беги CreateEventSource
в моем установщике.
Я также добавил попробовать / поймать log.source = "xx"
в приложении, чтобы установить его на известный источник, если бы мой источник событий не был создан (это будет происходить только в том случае, если я вместо горячей установки.dll вместо переустановки).
Попробуйте ниже в web.config
<system.web>
<trust level="Full"/>
</system.web>
У меня была эта проблема при запуске приложения в VS. Все, что мне нужно было сделать, это запустить программу от имени администратора один раз, а затем я мог запустить ее из VS.
Для запуска с правами администратора просто перейдите в папку отладки в проводнике Windows. Щелкните правой кнопкой мыши программу и выберите "Запуск от имени администратора".