.NET 2.0 Elevação do processo para instalação de aplicativos
-
23-09-2019 - |
Pergunta
Temos um aplicativo escrito em C ++ e .NET que instala para todos os usuários na pasta Arquivos de Programas. Este aplicativo baixa novas versões de si (como instaladores do MSI) e gera o novo processo do instalador para se substituir.
O processo de instalação como existe hoje:
- Copie um aplicativo de gerenciador de instalação (c#, .net 2.0) para o diretório temp. Chame isso de 'gerente'
- Gerente é executado com Privs elevado por este artigo.
- O aplicativo original sai.
- O gerente gera o instalador do MSI (com Privs elevado, já que a cópia é elevada)
- O gerente gera a nova versão do aplicativo.
O inseto:
O aplicativo recém -instalado está em execução em um estado elevado. Isso causa problemas que não vou enumerar aqui.
Idealmente, o lançamento do aplicativo recém -instalado seria executado com as permissões do usuário original.
Não consigo descobrir como rebaixar o aplicativo de volta a ser o usuário padrão após a elevação.
Um hack deselegante:
(Sim, sim, todo esse processo é deselegante de qualquer maneira)
- Copie o gerente de instalação para o diretório temp
- Execute o gerenciador de instalação com o usuário padrão Privs. Vamos chamar esta instância de 'LowlyManager'.
- Saídas originais do aplicativo.
- LowlyManager gera o aplicativo novamente, desta vez com privs elevados. Vamos nomear esta instância 'UpperManagement'
- UpperManagement gera o instalador
- UpperManagement sai graciosamente, retornando o código de saída do instalador.
- LowlyManager interpreta o código de erro do UpperManagement e gera o aplicativo recém -instalado. Desta vez como o invocador original.
Existe uma maneira melhor de fazer isso?
(Eu deixei de fora vários outros detalhes antes e depois dessas etapas que tornam o processo mais suave para o usuário, mas isso deve ser suficiente para entender o núcleo do problema que estou tentando resolver.)
Outros requerimentos:
- Não podemos instalar como um aplicativo por usuário
- O usuário não deve receber uma caixa de diálogo de autenticação se o UAC simplesmente perguntaria "Você tem certeza de que deseja permitir isso?". Eu acho que isso pode matar uma solução usando o WindowsMisesonationContext, mas não tenho certeza.
- O sistema precisa funcionar no XP, Vista e Windows 7 (mesmo que haja um processo separado para XP).
Solução
Mão única: http://www.codeproject.com/kb/vista-security/vistaabevator.aspx
Outra maneira (mencionada no comentário mais recente do artigo anterior): http://brandonlive.com/2008/04/27/getting-the-shell-to-drun-an-application-for-you-part-2-how/