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 ...).

questionAnswers(4)

yourAnswerToTheQuestion