Основная причина:
Улей '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 не очень разборчива в этом), я нашел способ исправить это.
Решение:
интерактивное решение с использованием REGEDIT:
a) запустить REGEDIT в качестве SYSTEM с помощью «PSexec» и б) с помощью пользовательского интерфейсаREGEDIT, предоставьте разрешения на чтение кусту «State» для IIS_IUSRS или любой произвольной учетной записи, с которой работает ваша служба или пул приложений IIS с использованием сценария
с использованием 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
Теперь ваше приложение должно иметь возможность перечислять все источники событий на компьютере, на котором оно работает, и создавать источник событий, если перечисление не находит его.