Detectando a virtualização do registro
Eu tenho um conjunto de aplicativos C # (v2) e estou lutando com a virtualização do registro no Win7 (e, em menor grau, o Vista).
Eu tenho uma área de configuração de registro compartilhada que meus aplicativos precisam acessar em HKLM \ Software \ Company ... Antes do Vista, tudo foi gravado e lido a partir desse local, conforme necessário.
O código detectou apropriadamente falhas para gravar nessa chave de registro e retornaria apropriadamente (escrevendo para HKCU e notificando o usuário de que as configurações aplicadas afetariam apenas o usuário atual).
No Vista, a virtualização do registro quebrou tudo isso porque a verificação de acesso que estávamos usando para a gravação do HKLM iria "ter sucesso" silenciosamente e virtualizar para HKCR \ VirtualStore \ Machine ... em vez disso. Nesse caso, o usuário pensaria que salvou a configuração de toda a máquina, mas apenas gravou na loja virtual.
Infelizmente, até mesmo tentar enumerar as permissões na chave reg HKLM explicitamente retorna resultados indicando que o usuário tem acesso, independentemente de fazer ou não.
Quando adicionamos o suporte ao Vista, a solução que usamos foi executar uma análise de gravação no HKLM ... e, em seguida, verificar em HKCR \ VirtualStore \ Machine ... o mesmo valor e observar que a virtualização ocorreu se o valor foi encontrado.
O Win7 parece ter quebrado isso (novamente) porque consultas contra o local virtual explícito (HKCR) agora mostram resultados mesclados do local do HKLM, mesmo se a gravação não foi virtualizada.
Alguém tem alguma sugestão para trabalhar em torno disso?
Restrições: - Eu preciso de uma solução que funcione sem a necessidade de elevação (quando não tenho permissões de nível de administrador, vou retornar a uma configuração por usuário no HKCU, mas preciso detectar esse caso de forma confiável).
Ele precisa trabalhar com um aplicativo v2 C # (Uma opção que eu já vi para o código C ++ é incorporar um manifesto que desativa a virtualização para o .exe, mas eu não fui capaz de fazer isso em C # V2.desabilitar virtualização de pasta no windows).
Ele precisa funcionar sem um "instalador" (isso impede a capacidade de desabilitar a virtualização na chave de registro que precisamos do comando REG FLAGS ...).