У меня есть библиотека классов, в которой хранятся системные данные конфигурации в реестре (HKLM\Software\XXX). Эта библиотека используется в различных приложениях (сервисах, формах окон, веб-приложениях, консольных приложениях) в различных версиях Windows (XP, 2003, 7, 2008 R2). Из-за этого личность приложения несовместима и даже не может быть членом группы администраторов компьютеров. Таким образом, я создал администратора домена домена AD и выполняю олицетворение, чтобы получить доступ на запись в реестр. Это отлично работает в XP/2003, но не в системах с поддержкой UAC (7/2008R2). Насколько я понимаю, только интерактивные логины разделяли токены, что означало бы, что неинтерактивные логины (идентификаторы сервисов, идентификаторы пула приложений и т.д.) Этого не делают. Я не могу найти что-либо, чтобы подтвердить это, но работая с этим предположением, работа, которую я делаю, должна работать.
Я написал класс-оболочку для выполнения олицетворения с использованием собственного LogonUser (сетевой logontype, поставщика по умолчанию) и DuplicateTokenEx (олицетворение, первичный токен), а затем WindowsIdentity.Impersonate(). Я получаю ссылку на мой корневой ключ:
using (ECR.Impersonator imp = new ECR.Impersonator("XXX", "XXX", "XXX"))
{
_root = Registry.LocalMachine.CreateSubKey("SOFTWARE\\XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);
}
В соответствии с MSDN, используя ReadWriteSubTree, это должно быть ТОЛЬКО во время проверки безопасности. Я могу писать значения для этого ключа, создавать под-ключи (также используя ReadWriteSubTree) и записывать значения в эти под-ключи, не требуя повторной проверки безопасности. Поэтому я подумал, что мне нужно будет только сделать дорогостоящее олицетворение один раз - получить ссылку на мой корневой ключ.
Я могу написать значения для моего корневого ключа просто отлично:
_root.SetValue("cachedDate", value.ToBinary(), RegistryValueKind.QWord); }
но когда я создаю/открываю под-ключ с помощью ReadWriteSubTree:
RegistryKey key = _root.CreateSubKey("XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);
он бомбит с помощью Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\XXX\XXX' is denied
.
В то время как мне любопытно, почему проверка безопасности выполняется, когда MSDN говорит, что этого не должно быть, мой вопрос в том, как я могу получить повышенные разрешения с помощью олицетворения для приложений, которые могут не выполняться под интерактивным входом?