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?