¿Cómo puedo obtener permisos elevados (UAC) mediante la suplantación bajo un inicio de sesión no interactivo?

Tengo una biblioteca de clases que mantiene los datos de configuración de todo el sistema en el registro (HKLM \ Software \ XXX). Esta biblioteca se usa en varias aplicaciones (servicios, formularios de Windows, aplicaciones web, aplicaciones de consola) en varias versiones de Windows (XP, 2003, 7, 2008 R2). Debido a esto, la identidad de la aplicación no es coherente y es posible que ni siquiera sea miembro del grupo de Administradores de la máquina. Así que he creado un usuario administrador de dominio AD y hago suplantación para obtener acceso de escritura al registro. Esto funciona perfectamente en XP / 2003, pero no en sistemas habilitados para UAC (7 / 2008R2). Tengo entendido que solo los inicios de sesión interactivos dividen los tokens, lo que implicaría que los inicios de sesión no interactivos (identidades de servicio, identidades de grupo de aplicaciones, etc.) no lo hacen. No puedo encontrar nada que lo confirme, pero trabajando desde esa suposición, la suplantación que estoy haciendo debería funcionar.

Escribí una clase de contenedor para hacer la suplantación utilizando LogonUser nativo (tipo de inicio de sesión de red, proveedor predeterminado) y DuplicateTokenEx (suplantación, token primario) y luego WindowsIdentity.Impersonate (). Recibo una referencia a mi clave raíz:

using (ECR.Impersonator imp = new ECR.Impersonator("XXX", "XXX", "XXX"))
{
    _root = Registry.LocalMachine.CreateSubKey("SOFTWARE\\XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);
}

De acuerdo a MSDN, al usar ReadWriteSubTree, esta debería ser la ÚNICA vez que se realiza un control de seguridad. Puedo escribir valores en esa clave, crear subclaves (también usando ReadWriteSubTree) y escribir valores en esas subclaves sin necesidad de otra verificación de seguridad. Así que pensé que solo tendría que hacer la suplantación costosa una vez: obtener la referencia a mi clave raíz.

Puedo escribir valores en mi clave raíz muy bien:

_root.SetValue("cachedDate", value.ToBinary(), RegistryValueKind.QWord); }

pero cuando creo / abro una subclave con ReadWriteSubTree:

RegistryKey key = _root.CreateSubKey("XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);

Bombas conAccess to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\XXX\XXX' is denied.

Aunque tengo curiosidad de por qué se realiza una verificación de seguridad cuando MSDN dice que no debería hacerlo, mi pregunta es ¿cómo puedo obtener permisos elevados a través de la suplantación para aplicaciones que pueden no ejecutarse bajo un inicio de sesión interactivo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta