Сбой EventLog.SourceExists на Windows Server 2019 - PullRequest
0 голосов
/ 26 февраля 2019

Я тестирую приложение ASP.NET на Windows Server 2019 с .Net Framework 4.7.2.Приложение IIS настроено для олицетворения пользователя, который НЕ имеет прав администратора.

Приложение вызывает EventLog.SourceExists, чтобы проверить, существует ли источник журнала событий, прежде чем пытаться создать новый источник.Я понимаю, что этот метод требует административных привилегий для поиска в существующих журналах событий источника [1].Другим способом для этого является явное предоставление своим пользователям прав на чтение для ключа реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog и всех дочерних элементов.

Это работает в версиях, предшествующих Windows Server 2019 (2016, 2012 R2, 2018).

При тестировании этого же приложения происходит сбой на Windows Server 2019, за исключением.

Источник не найден, но не удалось найти некоторые или все журналы событий.Недоступные журналы: Состояние.

При запуске procmon при попытке открыть раздел реестра для журнала событий «Состояние» появляется сообщение «Отказано в доступе» HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\State

Раздел реестра «Состояние»новый для Windows Server 2019. Он также защищен - он принадлежит SYSTEM, а администраторы ограничены только для чтения.Я получаю Отказ в доступе, когда пытаюсь дать моему пользователю права на чтение.В результате мое приложение, работающее как мой пользователь без прав администратора, завершается с ошибкой Inaccessible logs: State при вызове EventLog.SourceExists.

Я понимаю, что могу взять на себя владение ключом реестра State и добавить своего пользователя.Однако прежде чем я сделаю это, я хотел бы узнать, знает ли кто-нибудь об этом новом ключе реестра (журнал событий) в Windows Server 2019.

Спасибо.

[1] https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventlog.sourceexists?view=netframework-4.7.2

1 Ответ

0 голосов
/ 30 июля 2019

Основная причина:

Улей 'State' в дереве HKLM \ SYSTEM \ CCS \ Services \ EventLog имеет странную конфигурацию безопасности.Из-за этого любое приложение, пытающееся перечислить источники событий, в конечном итоге получит исключение «Отказано в доступе» и завершит работу.

Разрешения по умолчанию:

  • SYSTEM (полный контроль)
  • EventLog (полный контроль)
  • Администраторы (ключ чтения)

Они НЕ наследуются, как, например, для куста «Безопасность».Напротив, второй новый куст с именем «Параметры» наследует разрешения.

Перечисления обычно выполняются в таких приложениях:

[System.Diagnostics.EventLog]::SourceExists("Source Name")

Даже при попытке перечисления с помощью PowerShell вы нажмете«Отказано в доступе»

PS C:\> (gci -Recurse HKLM:\System\CurrentControlSet\services\eventlog).Name

Хотя я не знаю, что именно делает улей «State» (Microsoft не очень разборчива в этом), я нашел способ исправить это.

Решение:

  1. интерактивное решение с использованием REGEDIT:

    a) запустить REGEDIT в качестве SYSTEM с помощью «PSexec» и б) с помощью пользовательского интерфейсаREGEDIT, предоставьте разрешения на чтение кусту «State» для IIS_IUSRS или любой произвольной учетной записи, с которой работает ваша служба или пул приложений IIS с использованием сценария

  2. с использованием PowerShell:

    a) запустить PowerShell как SYSTEM с помощью «PSexec» и б) с помощью командлетов «Get-ACL» / «Set-ACL», предоставить разрешения на чтение кусту «State» для IIS_IUSRS или любой произвольной учетной записи, используемой вашей службой или пулом приложений IISработает с

Запуск приложения от имени пользователя SYSTEM лучше всего достигается с помощью PSexec, который можно бесплатно загрузить с сайта Microsoft SysInternals (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec)

PS C:\> PSexec.exe -accepteula -d -i -s powershell.exe

Это открываетокно PowerShell, работающее как NT AUTHORITY \ System.Отсюда, либо используйте REGEDIT, чтобы изменить разрешения для своей учетной записи пользователя службы, либо пользователя пула приложений IIS в кусте «State».Либо используйте командлеты Get-ACL / Set-ACL, чтобы сделать то же самое в сценарии.Разрешение «чтение ключа» достаточно;не требуется «полный контроль».

PS C:\> $hive = HKLM:\System\CurrentControlSet\services\eventlog\state; $acl = Get-ACL $hive; $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("IIS_IUSRS","ReadKey","ContainerInherit","None","Allow"); $acl.SetAccessRule($rule); $acl |Set-ACL $hive

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...