Ответ 1
Решение заключалось в предоставлении разрешения на чтение учетной записи "Сетевая служба" на ключ EventLog/Security.
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 выше).
Решение заключалось в предоставлении разрешения на чтение учетной записи "Сетевая служба" на ключ 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
, доступ к которому разрешен только для администратора.
Общим примером для входа в программу С# 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]
У меня была очень похожая проблема с консольной программой, которую я разрабатывал под VS2010 (обновлен от VS2008 под XP) Моя программа использует EnLib для выполнения некоторых протоколов. Ошибка была уволена, поскольку у EntLib не было права регистрировать новый источник событий.
Итак, я начал с того, что скомпилировал prog в качестве администратора: он зарегистрировал источник события. Затем я вернулся к разработке и отладке изнутри VS без проблем.
(вы также можете обратиться к http://www.blackwasp.co.uk/EventLog_3.aspx, это помогло мне
Для меня было предоставлено разрешение "Чтение" для "NetworkService" для всей ветки "EventLog".
Это исключение произошло для меня из консольного приложения .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\key вместо того, чтобы перейти к безопасности, что позволило решить проблему для меня.
Я пытаюсь почти все здесь решить эту проблему... Я разделяю здесь ответ, который помогает мне:
Другой способ решить проблему:
- в консоли 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
FYI... моя проблема заключалась в том, что случайно выбрана "Локальная служба" в качестве учетной записи свойств свойств ProcessInstaller вместо "Local System". Просто упомянуть для всех, кто следил за учебником MSDN, так как сначала выбирается выбор Local Service, и я не обращал пристального внимания....
Я не работаю над IIS, но у меня есть приложение, которое выдает ту же ошибку в поле 2K8. Он отлично работает на коробке 2K3, идите на фигуру.
Мое решение состояло в том, чтобы "Запуск от имени администратора", чтобы предоставить приложению повышенные права, и все работает с радостью. Надеюсь, это поможет вам в правильном направлении.
Windows 2008 - права/разрешения/возвышение, действительно отличные от Windows 2003, gar.
Такая же проблема для Windows 7 64bit. Запуск от имени администратора был решен.
Привет, я столкнулся с той же проблемой, когда я разрабатывал приложение и хотел установить его на удаленном ПК, я исправил его, выполнив следующие действия:
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, который представляет собой риск безопасности на рабочих серверах.
Я надеюсь, что это поможет разрешить его.
При использовании System.Diagnostics.EventLog.WriteEntry( "SourceName", "ErrorMessage" ) необходимо создать новый ключ с используемым именем источника в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application в regEdit, EventLogEntryType.Error);
Таким образом, у вашего пользователя нет разрешения на создание ключа. В зависимости от пользователя, который вы используете, из значения Identity в дополнительных пулах приложений, можно сделать следующее:
Щелкните правой кнопкой мыши ключ 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".
Я сталкиваюсь с аналогичной проблемой - в моем случае Source содержал символы <
, >
. 64-разрядные машины используют новую четную базу данных log-xml, которую я бы сказал, и эти символы (заданные из строки) создают недопустимый xml, который вызывает исключение. Возможно, это должно рассматриваться как проблема Microsoft - не правильно обрабатывать Source (имя/строка).
У нас была аналогичная проблема со всеми нашими серверами 2008 года. Журнал безопасности полностью перестает работать из-за объекта групповой политики, который взял группу Authenticated Users и прочитал разрешение от ключа HKLM\System\CurrentControlSet\Services\EventLog\security
Повторение этой рекомендации по Microsoft исправило проблему. Я подозреваю, что все прошедшие проверку подлинности пользователи, читающие на более высоком уровне, также исправят вашу проблему.
Хотя ответ установщика является хорошим ответом, он не всегда практичен при работе с программным обеспечением, которое вы не пишете. Простым ответом является создание журнала и источника событий с помощью команды PowerShell New-EventLog (http://technet.microsoft.com/en-us/library/hh849768.aspx)
Запустите PowerShell в качестве администратора и выполните следующую команду, изменив имя журнала и источник, который вам нужен.
Новое-EventLog -LogName Приложение -Source TFSAggregator
Я использовал его для решения Исключение журнала событий при запуске агрегатора из кода.
Кажется, что это очевидное решение, что я еще не вижу огромного недостатка, по крайней мере там, где нецелесообразно получать административные права, чтобы создать собственный источник событий: используйте тот, который уже существует.
Два из них, которые я начал использовать, это ".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{}
обернуть ее, если она терпит неудачу, и усугубит ситуацию, но события теперь можно сохранить.
Мое приложение устанавливается на клиентских веб-серверах. Вместо того, чтобы возиться с разрешениями сетевой службы и реестром, я решил проверить SourceExists
и запустить CreateEventSource
в моем установщике.
Я также добавил try/catch вокруг log.source = "xx"
в приложении, чтобы установить его в известный источник, если мой источник событий не был создан (это только придет, если я горячая замена .dll вместо повторной установки).
Решение очень просто - Запустите приложение Visual Studio в режиме администратора!
попробуйте ниже в web.config
<system.web>
<trust level="Full"/>
</system.web>
У меня была эта проблема при запуске приложения в VS. Все, что мне нужно было сделать, это запустить программу как Администратор один раз, затем я мог бы работать из VS.
Для запуска в качестве администратора просто перейдите в папку отладки в проводнике Windows. Щелкните правой кнопкой мыши программу и выберите "Запуск от имени администратора".
Восстановление решения для меня