System.Security.SecurityException під час запису до Журналу подій


189

Я працюю над спробою перенести додаток ASP.NET з Server 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

[сніп]

Це те, що я зробив, щоб спробувати вирішити:

  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's та Nicole Calinoiu's .

Я використовую функцію 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 є типовим) або замість цього ви можете створити нового користувача за пулом додатків та встановити дозволи на цей "Спеціальний обліковий запис". див.
Вказання

5
Зміни набувають чинності лише після того, як ви перезапустите заявку на IIS
Zé Carlos

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

1
duck9 я скорегувати IIS8, дивіться тут для більш докладної інформації: stackoverflow.com/questions/712203 / ...
thedrs

1
Також подивіться на сервер defaultfault.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\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]

1
Це саме те, що я роблю для всіх своїх послуг. Я вважаю, що це правильно зробити. У кожному сервісі, де я використовую журнал подій, у мене є файл .reg, як описаний вище. Одну маленьку примітку файл потрібно зберегти як Unicode-32 (cp 1200.)
Valo,

Ця відповідь описує реальну причину помилки. Чек існує, намагається перерахувати весь ключ. якщо він існує, checkExists працює добре.
DanO

EventLog \ Security Це ключ для функціонування, переконайтеся, що у вас є дозвіл на це.
Princa

45

Рішення полягало в наданні дозволу на читання облікового запису "Служба мережі" за допомогою ключа EventLog / Security.


1
Я бачу подібні рішення навколо. Але мені просто цікаво, чому це так. Тому що я можу бачити, що багато сервісів увійшли в систему як NetworkService, і вони повинні мати можливість читати журнал подій / безпеку. То чому ж потрібно додати дозвіл на NetworkService?
h - n

11
Для тих, хто зазвичай не проходить через реєстр, це посилання може бути корисним: social.msdn.microsoft.com/forums/en-US/…
Аллан

Гарна посилання Аллан. Пункт №3 прийнятої відповіді важливий і вже один раз мене покусав. тобто надання дозволу на батьківський ключ реєстру EventLog НЕ поширюється на "недоступні журнали", такі як безпека та віртуальний сервер, навіть якщо вони є дочірніми ключами в реєстрі. Якщо ви хочете отримати повний доступ до журналу подій, ви повинні надати дозвіл НАЗАД, рівень журналу батьківських подій та рівень безпеки дитини.
Бен Баррет

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лише для кореня.
Рууд Гельдерман

6

Я намагаюся майже все, що тут, щоб вирішити цю проблему ... Я ділюсь тут відповіддю, яка мені допомагає:

Ще один спосіб вирішити проблему:

  • у консолі IIS перейдіть до пулу програм, що керує вашим сайтом, і відмітьте особу, на якій він працює (зазвичай мережевий сервіс)
  • переконайтеся, що ця особа може читати KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Eventlog (rigth-click, авторизація)
  • тепер змініть ідентичність цього пулу додатків на локальну систему, застосуйте та поверніться назад до мережевої служби

Повноважні дані будуть завантажені та EventLog доступні

в http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx , дякую Майклу Фрейджіму


Зміна пулу додатків з "ApplicationPoolIdentity" на "LocalSystem" вирішила проблему створення / читання журналів подій для мене.
majestzim

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 та виберіть Дозволи ... опція 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

FYI ... моя проблема полягала в тому, що випадково вибрано "Local Service" як Обліковий запис про властивості ProcessInstaller замість "Local System". Згадаю лише всіх, хто дотримувався навчального посібника MSDN, як перший показав вибір місцевих служб, і я не звертав пильної уваги ....


3

Це, очевидно, є очевидним рішенням цього, що я ще не бачив величезного недоліку, принаймні там, де не практично отримати адміністративні права для створення власного джерела подій: Використовуйте таке, яке вже є.

Два, якими я почав користуватися, - це ".Net Runtime" та "Помилка програми", обидва з яких здаються, що вони будуть присутні на більшості машин.

Основними недоліками є неможливість групування за цією подією та те, що ви, ймовірно, не має асоційованого ідентифікатора події, а це означає, що запис журналу може бути дуже префіксованим чимось у ефект "Опис ідентифікатора події 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 \ Мій новий додаток

Примітка2: Залежно від того, в який журнал події ви пишете, ви можете знайти у своєму вікні DEV, \ Application \ (як зазначено вище), а також (\ System) або (\ Security), залежно від того, в яку подію пишеться ваша програма , (\ Застосування) має бути прекрасним постійно.

2) Перебуваючи на клавіші вище, у меню; Виберіть "ФАЙЛ" -> "Експорт", а потім збережіть файл. (Примітка. Це створить ваші необхідні параметри реєстру, коли програмі потрібно буде отримати доступ до цього ключа, щоб записати його в переглядач подій). Новим файлом буде файл .REG, для аргументу назвіть його "My New App.REG "

3) Під час розгортання в PRODuction зверніться до адміністратора системи Сервера (SA), передайте файл "My New App.REG" разом із програмою та попросіть SA встановити цей файл REG, як тільки це буде зроблено (як адміністратор), це буде створити ключ для вашої програми.

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

Проблему слід вирішити вже зараз.

Причина:

Під час розробки програми, яка що-небудь записує у EventLog, вона вимагатиме для неї KEY у реєстрі Eventlog, якщо цей ключ не знайдеться, він спробує створити його, який потім не може мати дозволу на це. Наведений вище процес схожий на розгортання програми (вручну), тоді як ми створюємо це самостійно, і немає необхідності боліти головою, оскільки ви не налаштовуєте реєстр, додаючи дозволи до кожного, що є ризиком безпеки на виробничих серверах.

Я сподіваюся, що це допомагає вирішити це.


2

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

Запустіть PowerShell як адміністратор та виконайте наступну команду, змінивши ім’я журналу та джерело, які вам потрібні.

New-EventLog- Application -LogName -Source -Source TFSAggregator

Я використовував його для вирішення винятку з журналу подій, коли Aggregator запускає проблему з codeplex.


1

Мав подібну проблему з усіма нашими серверами 2008 року. Журнал безпеки перестав взагалі працювати через GPO, який забрав групу аутентифікованих користувачів та прочитав дозвіл подалі від ключаHKLM\System\CurrentControlSet\Services\EventLog\security

Повернення цього рішення за рекомендацією Microsoft виправило проблему. Я підозрюю, що надання всім аутентифікованим користувачам читання на більш високому рівні також виправить вашу проблему.


1

Я потрапив у подібну проблему - у моєму випадку міститься джерело <, >символи. 64-бітні машини використовують нову рівну систему log - xml, я б сказав, і ці символи (встановлені з рядка) створюють недійсні xml, що викликає виняток. Можливо, це має враховувати проблема Microsoft - неправильна обробка джерела (ім'я / рядок).


1

Рішення дуже просте - запускайте програму Visual Studio в режимі адміністратора!


Під час усунення несправностей у VS і отримав цю помилку, це все виправило для мене
wruckie

Це може помилитися, оскільки це виклик не VS, це програма, яка, ймовірно, працює в іншому контексті безпеки.
CodeMonkey1313

0

Мій додаток встановлюється на веб-серверах клієнта. Замість того, щоб замінюватись дозволами на мережеві послуги та реєстром, я вирішив перевірити SourceExistsта запуститиCreateEventSource свій інсталятор.

Я також додав спробу / ловлю log.source = "xx"в додатку, щоб встановити його на відоме джерело, якщо джерело моїх подій не буде створено (це з’явиться лише в тому випадку, якщо я замінюю .dll замість перевстановлення).



-1

У мене виникла ця проблема під час запуску програми в межах VS. Все, що я повинен був зробити, це запустити програму як адміністратор один раз, тоді я міг запускатися зсередини VS.

Щоб запуститись як адміністратор, просто перейдіть до папки налагодження у Windows Explorer. Клацніть правою кнопкою миші на програмі та виберіть Запустити як адміністратор.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.