Система.Безопасность.SecurityException при записи в журнал событий
Я работаю над попыткой портировать ASP.NET приложение от сервера 2003 (и IIS6) до сервера 2008 (IIS7).
когда я пытаюсь посетить страницу в браузере, я получаю следующее:
ошибка сервера в приложении"/".
Исключение Безопасности
описание: приложение попыталось выполнить операцию, не разрешены политикой безопасности. Чтобы предоставить этому приложению необходимое разрешение, обратитесь к системному администратору или измените уровень доверия приложения в файле конфигурации.
Сведения Об Исключении: System.Безопасность.SecurityException: источник не найден, но некоторые или все журналы событий не удалось найти. Недоступные журналы: безопасность
Ошибка Источник:
необработанное исключение при выполнении текущего веб-запроса. Информацию о происхождении и месте возникновения исключения могут быть идентифицированы с помощью стека исключений след ниже.
Трассировка Стека:
[SecurityException: источник не найден, но некоторые или все журналы событий не удалось найти. Недоступные журналы: безопасность.]
система.Диагностика.Журнал событий.FindSourceRegistration(исходная строка, строка имя_компьютера, булево только для чтения) +562
Система.Диагностика.Журнал событий.SourceExists(String source, String machineName) +251
[snip]
Это то, что я сделал, чтобы попробуйте и решить ее:
дайте" всем " полное разрешение на доступ к ключу
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventLogSecurity. Это сработало. Но, естественно, я не могу сделать это в производство. Поэтому я удалил разрешение " все " после запуска приложения в течение нескольких минут, и ошибка снова появилась.Я создал источник в журнале приложений и журнале безопасности (и я проверил, что он существует через regedit) во время установки с повышенными разрешениями, но ошибка оставшийся.
Я дал приложению полный уровень доверия в
web.configфайл (и с помощьюappcmd.exe), но безрезультатно.
есть ли у кого-нибудь представление о том, что можно сделать здесь?
PS: Это продолжение этого вопрос. Я следовал данным ответам, но безрезультатно (см. № 2 выше).
22 ответов:
дать
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\система\CurrentControlSet на\услуги\журнал событий\приложения\dotnet ограничителя образец приложение
затем можно удалить эти две строки.
вы также можете создать
.regфайл для создания раздела реестра. Просто сохраните следующий текст в файлcreate.reg:Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\dotNET Sample App]
решение состояло в том, чтобы предоставить учетной записи "сетевой службы" разрешение на чтение в журнале событий/ключе безопасности.
для меня ony предоставление разрешений "Чтение" для "NetworkService" в весь 'EventLog' филиала работали.
У меня была очень похожая проблема с консольной программой, которую я разрабатываю под VS2010 (обновлен с VS2008 под XP) Моя прога использует EnLib, чтобы сделать некоторые лесозаготовки. Ошибка была вызвана тем, что EntLib не имел разрешения на регистрацию нового источника событий.
Так что я начал, как только мой скомпилированный прог администратор: он зарегистрировал источник события. Затем я вернулся к разработке и отладке изнутри VS без проблем.
(вы также можете обратиться к http://www.blackwasp.co.uk/EventLog_3.aspx, это помогло мне
Я стараюсь почти все здесь, чтобы решить эту проблему... Я разделяю здесь ответ, который поможет мне:
другой способ решить проблему:
- в консоли IIS перейдите в пул приложений, управляющий вашим сайтом, и обратите внимание на идентификатор, выполняющий его (обычно сетевая служба)
- убедитесь, что это удостоверение может читать KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog (rigth-click, authorisations)
- теперь менять идентификация этого пула приложений в локальной системе, применить и переключиться обратно в сетевую службу
учетные данные будут перезагружены и EventLog доступен
в http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx, спасибо Михаилу Фрейдгейму
это исключение происходило для меня из консольного приложения .NET, работающего как запланированная задача, и я пытался сделать в основном то же самое - создать новый источник событий и записать в журнал событий.
в конце концов, установка полных разрешений для пользователя, под которым задача выполнялась на следующих клавишах, сделала трюк для меня:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
Я столкнулся с той же проблемой, но мне пришлось подняться на один уровень и предоставить полный доступ всем к ключу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\, вместо того, чтобы спускаться к безопасности, что прояснило проблему для меня.
FYI...my проблема была в том, что случайно выбрали" Local Service "в качестве учетной записи по свойствам ProcessInstaller вместо"Local System". Просто упоминая для всех, кто следил за учебником MSDN, поскольку выбор локальной службы показывает сначала, и я не обращал пристального внимания....
новый ключ с используемым именем источника необходимо создать в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application в regEdit при использовании
Я не работаю на 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, например, если вы назвали свое новое приложение" My новое приложение " тогда ключ будет: HKLM\System\CurrentControlSet\Services\EventLog\Application\My New app
Note2: в зависимости от того, в какой журнал событий вы записываете, вы можете найти на своем поле DEV, \Application\ (как указано выше), или также (\System) или (\Security) в зависимости от того, в какое событие записывается ваше приложение, в основном, (\Application) должно быть в порядке все время.
2) находясь на клавише выше, в меню выберите "Файл" -> "Экспорт", а затем сохраните файл. (Примечание: это создаст необходимые параметры реестра, когда приложение должно будет получить доступ к этому ключу для записи в Средство просмотра событий), новый файл будет a .REG-файл, для аргументации, назовите его " мое новое приложение.Рег"
3) при развертывании на производстве обратитесь к системному администратору сервера (SA), передайте "мое новое приложение.REG " файл вместе с приложением и попросите SA установить этот файл REG, как только это будет сделано (как администратор), это создаст ключ для вашего применение.
4) запустите приложение, оно не должно иметь доступа ни к чему другому, кроме этого ключа.
проблема должна быть решена к настоящему времени.
причина:
при разработке приложения, которое записывает что-либо в журнал событий, ему потребуется ключ для него в реестре Eventlog, если этот ключ не найден, он попытается создать его, что затем не удастся из-за отсутствия разрешений на это. Описанный выше процесс аналогичен развертыванию приложение (вручную), в то время как мы создаем это сами, и не нужно иметь головную боль, так как вы не настраиваете реестр, добавляя разрешения для всех, что является риском безопасности на производственных серверах.
Я надеюсь, что это поможет решить ее.
была аналогичная проблема со всеми нашими серверами 2008 года. Журнал безопасности вообще перестал работать из-за объекта групповой политики, который забрал группу аутентифицированных пользователей и разрешение на чтение из ключа
HKLM\System\CurrentControlSet\Services\EventLog\securityположив это обратно в рекомендации Microsoft Исправлена проблема. Я подозреваю, что предоставление всем аутентифицированным пользователям чтения на более высоком уровне также исправит вашу проблему.
Я ударил аналогичную проблему - в моем случае источник содержал
<,>символы. 64-битные машины используют новую базу even log-xml, я бы сказал, и эти символы (набор из строки) создают недопустимый xml, который вызывает исключение. Возможно, это следует рассматривать как проблему Microsoft - не правильно обрабатывать источник (имя/строку).
хотя ответ установщика является хорошим ответом, он не всегда практичен при работе с программным обеспечением, которое вы не писали. Простой ответ-создать журнал и источник событий с помощью команды PowerShell New-EventLog (http://technet.microsoft.com/en-us/library/hh849768.aspx)
запустить PowerShell от имени администратора и выполните следующую команду, изменив имя журнала и источник, который вам нужен.
New-EventLog-LogName приложение источник TFSAggregator
Я использовал его для решения исключение журнала событий при запуске агрегатора выпуск из codeplex.
Кажется, что есть вопиюще очевидное решение для этого, что я еще не вижу огромного недостатка, по крайней мере, там, где нецелесообразно получать административные права для создания собственного источника событий: используйте тот, который уже есть.
два, которые я начал использовать, - это ".Net Runtime" и "ошибка приложения", оба из которых, похоже, будут присутствовать на большинстве машин.
основные недостатки-невозможность сгруппироваться по этому событию, и что вероятно, у вас нет связанного идентификатора события, что означает, что запись журнала может быть очень хорошо префикс с чем-то вроде "описание для идентификатора события 0 из исходной среды выполнения .Net не может быть найдено...."если вы опустите его, но журнал входит, и выход выглядит в целом разумным.
результирующий код выглядит следующим образом:
EventLog.WriteEntry( ".Net Runtime", "Some message text here, maybe an exception you want to log", EventLogEntryType.Error );конечно, поскольку всегда есть шанс, что вы находитесь на машине, у которой нет этих источников событий по какой-либо причине, вы наверное, хочу
try {} catch{}оберните его в случае сбоя и ухудшения ситуации, но события теперь можно сохранить.
мое приложение устанавливается на веб-серверах клиента. Вместо того, чтобы возиться с разрешениями сетевых служб и реестра, я решил проверить
SourceExistsи работатьCreateEventSourceв моем установщике.Я также добавил попробовать/поймать вокруг
log.source = "xx"в приложении, чтобы установить его на известный источник, если мой источник событий не был создан (это произойдет только в том случае, если я hot swapped a .dll вместо переустановки).
У меня была эта проблема при запуске приложения В против. Мне нужно было запустить программу от имени администратора один раз, тогда я мог бы запустить из против.
Запуск от имени администратора, просто перейдите в папку debug в проводнике Windows. Щелкните правой кнопкой мыши на программе и выбираем Запуск от имени администратора.
Comments