Projeto de instalação do Visual Studio - configurações de registro por usuário
-
08-06-2019 - |
Pergunta
Estou tentando manter um projeto de configuração em Visual Studio 2003
(sim, é um aplicativo legado).O problema que temos no momento é que precisamos escrever entradas de registro para HKCU
para cada usuário no computador.Eles precisam estar no HKCU
em vez de HKLM
porque são as configurações padrão do usuário e mudam por usuário.Meu sentimento é que
- Isso não é possível
- Isso não é algo que o instalador deveria fazer, mas algo que o aplicativo deveria fazer (afinal, o que acontece quando um perfil de usuário é criado após a instalação?).
Pensando nisso, ainda quero alterar o mínimo possível no aplicativo, então minha dúvida é: é possível adicionar entradas de registro para cada usuário em um Visual Studio 2003
projeto de configuração?
E, no momento, o projeto lista cinco chaves raiz de registro (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER
, HKEY_LOCAL_MACHINE
, HKEY_USERS
, e Hive de usuário/máquina).Eu realmente não sei nada sobre a chave raiz dos usuários e não vi o User/Machine Hive.Alguém pode me esclarecer sobre o que são?Talvez eles pudessem resolver meu problema acima.
Solução
Primeiro:Sim, isso é algo que pertence ao Aplicativo exatamente pelo motivo que você especificou:O que acontece depois que novos perfis de usuário são criados?Claro, se você estiver usando um domínio, é possível colocar algumas coisas no registro durante a criação, mas esse não é realmente um caso de uso.O aplicativo deve verificar se há seetings e usar as configurações padrão caso não haja.
Dito isto, é possível alterar as chaves de outros usuários através do Hive HKEY_USERS.
Não tenho experiência com o Projeto de Instalação do Visual Studio 2003, então aqui está um pouco de código VBScript (totalmente não relacionado) que pode lhe dar uma ideia de onde procurar:
const HKEY_USERS = &H80000003
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = ""
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys
strKeyPath = "\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing"
For Each subkey In arrSubKeys
objReg.SetDWORDValue HKEY_USERS, subkey & strKeyPath, "State", 146944
Next
(Código cortesia de Jeroen Ritmeijer)
Outras dicas
Suponho que, porque você deseja configurá-lo para todos os usuários, você está em algum tipo de computador compartilhado, que provavelmente está sendo executado em um domínio.
AQUI ESTÃO DRAGÕES
Digamos que Joe e Jane façam login regularmente no computador, então cada um deles terá 'registros'.
Em seguida, você instalará seu aplicativo e o instalador empregará hacks gigantes e coisas nojentas para definir itens no HKCU para eles.
ENTÃO, Bob virá e fará logon (ele e outras 500 pessoas têm contas no domínio e podem fazer isso).Ele nunca usou este computador antes, então não tem registro.Na primeira vez que ele faz login, o Windows cria uma para ele, mas ele não terá sua configuração.
Seu aplicativo então falha ou se comporta incorretamente, e Bob reclama em voz alta sobre os produtos de baixa qualidade da Raynixon incorporados.
A resposta correta é ter apenas algumas configurações padrão em seu aplicativo, que podem gravá-las no registro se não as encontrar.É uma boa prática geral que seu aplicativo nunca dependa do registro e crie coisas conforme necessário, para qualquer entrada de registro, não apenas HKCU, de qualquer maneira
Apesar do que Artigo MSDN Arquivo de artigo do MSDN diz sobre User/Machine Hive, ele não grava em HKEY_USERS.Em vez disso, ele grava no HKCU se você selecionar Just Me e no HKLM se você selecionar todos.
Então minha solução será usar o User/Machine Hive, e depois na aplicação ele verifica se as entradas do registro estão no HKCU e se não, copia-as do HKLM.Eu sei que esta provavelmente não é a maneira ideal de fazer isso, mas tem menos alterações.
Estou no meio da minha solução com esta entrada no MSDN (não sei como não consegui encontrá-la antes).
Hive de usuário/máquina
As subchaves e os valores inseridos nesta seção serão instalados na seção HKEY_CURRENT_USER quando um usuário escolher "Just Me" ou na seção HKEY_USERS ou quando um usuário escolher "Todos" durante a instalação.