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

[Надрез]

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

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

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

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

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

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

13.08.2009 19:15:50
Я получал это при попытке записи в пользовательский источник в .Net-сервисе, который работал как NetworkService. Я просто изменил источник журнала событий, чтобы он соответствовал имени службы, которое было установлено с помощью пакета .Net Service Setup, и оно работало без установки разрешений реестра. Я заметил это, увидев имя службы в качестве ключа уже в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application
Jon Adams 31.03.2011 18:10:36
Chris S 5.04.2015 18:06:48
Другой возможный ответ: щелкните правой кнопкой мыши на exe и выберите «Запуск от имени администратора»
MacGyver 21.01.2016 08:15:23
22 ОТВЕТА

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

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

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

2
20.08.2009 17:10:42
РЕШЕНИЕ

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

45
22.06.2016 18:34:14
Я вижу похожие решения вокруг. Но мне просто интересно, почему это так. Потому что я вижу, что многие сервисы вошли в систему как NetworkService, и они должны иметь возможность читать журнал событий / безопасность. Так почему же нужно добавить разрешение для NetworkService?
h--n 14.04.2011 11:04:18
Для тех из нас, кто обычно не сканирует
Allan 21.07.2011 17:30:48
Хорошая ссылка Аллан. Пункт № 3 по принятому ответу важен и уже укусил меня однажды. т.е. предоставление разрешения в родительском разделе реестра EventLog НЕ распространяется на «недоступные журналы», такие как Security и Virtual Server, даже если они являются дочерними ключами в реестре. Если вам нужен полный доступ к журналу событий, вы должны предоставить разрешение на ОБА уровне родительского журнала событий и дочерних уровней безопасности.
Ben Barreth 13.03.2012 20:47:16
Изменения вступают в силу только после перезапуска приложения в IIS
Zé Carlos 1.04.2013 19:13:32
Для тех, кто пытался скопировать / вставить, убедитесь, что между словами «Сетевой сервис» есть пробел.
Chris Fremgen 16.05.2016 16:24:19

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

7
3.12.2009 12:22:16
это не очень важно, потому что для подключей, таких как «Безопасность» или «Виртуальный сервер», необходимо предоставить доступ на чтение индивидуально, так как были установлены разрешения не наследовать от родительского ключа.
Serge 14.10.2014 12:06:48

Чтобы дать 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 и Николь Калиною .

Я использую функцию 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")
            }
    }
}
169
23.05.2017 12:02:53
В IIS7 вы можете назначить «СЕТЬ СЕТИ» в качестве идентификатора для пула приложений (вы можете обнаружить, что ApplicationPoolIdentity используется по умолчанию) или вместо этого вы можете создать нового пользователя для каждого пула приложений и установить разрешения для этой «пользовательской учетной записи». см. Укажите идентификатор для пула приложений (IIS 7)
Grokodile 4.03.2013 23:25:57
Изменения вступают в силу только после перезапуска приложения в IIS
Zé Carlos 1.04.2013 19:12:24
Я дал IIS_IUSRS разрешение на чтение / запись ключа журнала событий и чтение ключа безопасности. Моему продукту требовался доступ на запись для ключа журнала событий, поскольку он создает собственный источник событий.
duck9 5.04.2013 04:34:20
duck9 я исправляю для IIS8, см. здесь для получения более подробной информации: stackoverflow.com/questions/712203/…
thedrs 7.07.2014 11:10:03
Также посмотрите на serverfault.com/a/81246/219898 относительно пользователей пула приложений и соответствующих разрешений - для этого решения. Спасибо @Michael Freidgeim - была большая помощь.
Anthony Horne 23.10.2015 10:28:15

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

1
1.08.2012 18:30:35

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

4
25.05.2011 21:14:35
Также попробуйте настроить приложение для запуска в качестве LocalSystem, чтобы был создан раздел реестра, а затем вы можете вернуться к NetworkService.
demoncodemonkey 13.06.2013 21:46:29

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

4
8.06.2011 15:40:00

Это исключение произошло для меня из консольного приложения .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
15.12.2011 16:20:39
Ты спас мой день. Кстати, разрешение на чтение было достаточно на eventlog\Applicationи eventlog\Security; полный контроль требуется eventlogтолько для пользователя root.
Ruud Helderman 19.09.2014 10:28:28

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

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
24.03.2012 21:37:13

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

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

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

7
18.10.2011 17:02:08

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

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

1
11.11.2011 03:53:38

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

-3
9.12.2011 11:24:39

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

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

-1
13.12.2011 15:08:57

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

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

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

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

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

6
30.01.2012 16:41:54
Изменение пула приложений с «ApplicationPoolIdentity» на «LocalSystem» решило проблему создания / чтения журналов событий для меня.
majestzim 18.08.2016 15:54:05

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

3
8.02.2012 21:54:23

Проблема в том, что 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]
57
6.06.2016 10:40:39
Это именно то, что я делаю для всех моих услуг. Я считаю, что это правильно. В каждом сервисе, где я использую журнал событий, у меня есть файл .reg, подобный приведенному выше. Одно маленькое примечание, файл должен быть сохранен как Unicode-32 (cp 1200.)
Valo 25.06.2015 04:35:47
Этот ответ описывает реальную причину ошибки. Проверка существует, пытается перечислить весь ключ. если он существует, checkExists работает нормально.
DanO 29.07.2015 16:40:49
EventLog \ Security - это ключ к работе, убедитесь, что у вас есть разрешение на это.
Princa 31.08.2016 18:28:19

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

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

0
22.07.2013 14:31:04

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

1
26.08.2013 05:18:44
При устранении неполадок в VS и получил эту ошибку, это все
wruckie 1.02.2015 00:16:15
Это приведет к ошибке, потому что не VS вызывает этот вызов, а приложение, которое, вероятно, работает в другом контексте безопасности.
CodeMonkey1313 12.03.2015 12:25:51

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

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

New-EventLog -LogName Application -Source TFSAggregator

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

2
12.12.2014 23:23:29

Новый ключ с именем источника должен быть создан в 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».

4
7.07.2016 15:41:26

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

 <system.web>

<trust level="Full"/>

</system.web>
0
10.05.2016 09:55:24

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

Два, которые я начал использовать, это «.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{}обернуть ее в случае сбоя и ухудшения ситуации, но события теперь можно сохранить.

3
19.04.2017 17:10:51