Pergunta

Fui encarregado de escrever um instalador com um aplicativo Silverlight fora do navegador. Preciso.

  1. Tire a versão de um exe local
  2. Verifique um serviço da web para ver que é a versão mais recente
  3. Baixe um zip se não
  4. Desembale o zip
  5. substitua o antigo exe
  6. Comece o exe

Este aplicativo do instalador está escrito no .NET WinForms agora, mas a estrutura .NET é um obstáculo para as pessoas baixarem.

A solução recomendada é usar um sloob, mas não tenho certeza de como atribuir confiança total. Se eu atribuir confiança total, posso iniciar um processo.

Obrigado

Foi útil?

Solução

Olhando para isso, suspeito que você terá que criar o processo usando o WMI através da interface COM. No final do dia, isso torna essa uma opção muito difícil e muito sujeita a falha devido a uma série de razões (o WMI sendo desativado ou garantido, o usuário não dará total confiança etc.) Eu suspeito que você seria muito melhor Fora de criar um pacote de implantação .msi ou algo semelhante que conseguiu sair e baixar a estrutura, se necessário. Existem muitos modelos de implantação disponíveis, quase todos parecem superiores a este.

Dito isto, se você vai fazer isso:

Para obter o objeto COM, você vai querer usar o AutomationFactory.CreateObject(...) API. Tim Heuer fornece uma amostra aqui.

Para realmente fazer o script do WMI, você vai querer criar o WbemScripting.SWbemLocator objeto como a raiz. De lá, use o ConnectServer Método para obter um serviço WMI na máquina nomeada. Você pode então interrogar o Win32_Process módulo para criar novos processos.

EDIT: Passei um pouco de tempo trabalhando nisso e, mesmo na minha máquina local como administrador, estou enfrentando problemas de segurança. O código correto seria algo semelhante a:

        dynamic locatorService = AutomationFactory.CreateObject("WbemScripting.SWbemLocator");
        dynamic wmiService = locatorService.ConnectServer("winmgmts:{impersonationLevel=impersonate,authentationLevel=Pkt}//./root/cimv2");

        dynamic process = wmiService.Get("Win32_Process");

        dynamic createParameters = process.Methods_["Create"].InParameters.SpawnInstance_;

        createParameters.CommandLine = "cmd.exe";

        wmiService.ExecMethod("Win32_Process", "Create", createParameters);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top