Como posso obter permissões elevadas (UAC) por representação em um logon não interativo?

Eu tenho uma biblioteca de classes que mantém os dados de configuração em todo o sistema no registro (HKLM \ Software \ XXX). Essa biblioteca é usada em vários aplicativos (serviços, formulários do Windows, aplicativos Web, aplicativos de console) em várias versões do Windows (XP, 2003, 7, 2008 R2). Por esse motivo, a identidade do aplicativo não é consistente e pode nem ser membro do grupo Administradores da máquina. Então, eu criei um usuário administrador de domínio do AD e faço a representação para obter acesso de gravação ao registro. Isso funciona perfeitamente no XP / 2003, mas não nos sistemas habilitados para UAC (7 / 2008R2). Entendo que apenas logons interativos dividem os tokens, o que implicaria que logons não interativos (identidades de serviço, identidades de pool de aplicativos etc.) não. Não consigo encontrar nada para confirmar isso, mas, trabalhando com essa suposição, a representação que estou fazendo deve funcionar.

Eu escrevi uma classe de wrapper para fazer a representação usando LogonUser nativo (tipo de logon de rede, provedor padrão) e DuplicateTokenEx (representação, token primário) e depois WindowsIdentity.Impersonate (). Eu recebo uma referência à minha chave raiz:

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

De acordo comMSDN, usando ReadWriteSubTree, deve ser o ÚNICO momento em que uma verificação de segurança é feita. Posso escrever valores nessa chave, criar subchaves (também usando ReadWriteSubTree) e escrever valores nessas subchaves sem precisar de outra verificação de segurança. Então pensei que só precisaria fazer a representação cara uma vez - obtendo a referência à minha chave raiz.

Posso escrever valores para minha chave raiz:

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

mas quando eu crio / abro uma subchave com ReadWriteSubTree:

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

bombardeia comAccess to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\XXX\XXX' is denied.

Embora eu esteja curioso para saber por que uma verificação de segurança é feita quando o MSDN diz que não deveria, minha pergunta é como posso obter permissões elevadas por representação de aplicativos que podem não estar em execução sob um logon interativo?

questionAnswers(2)

yourAnswerToTheQuestion