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:

  1. Copie um aplicativo de gerenciador de instalação (c#, .net 2.0) para o diretório temp. Chame isso de 'gerente'
  2. Gerente é executado com Privs elevado por este artigo.
  3. O aplicativo original sai.
  4. O gerente gera o instalador do MSI (com Privs elevado, já que a cópia é elevada)
  5. 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)

  1. Copie o gerente de instalação para o diretório temp
  2. Execute o gerenciador de instalação com o usuário padrão Privs. Vamos chamar esta instância de 'LowlyManager'.
  3. Saídas originais do aplicativo.
  4. LowlyManager gera o aplicativo novamente, desta vez com privs elevados. Vamos nomear esta instância 'UpperManagement'
  5. UpperManagement gera o instalador
  6. UpperManagement sai graciosamente, retornando o código de saída do instalador.
  7. 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).
Foi útil?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top