Estou tentando instalar um serviço usando o InstallUtil.exe, mas invocado Process.Start
. Aqui está o código:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
onde m_strInstallUtil
é o caminho completo e exe para "InstallUtil.exe" e strExePath
é o caminho / nome completo para o meu serviço.
A execução da sintaxe da linha de comando em um prompt de comando elevado funciona; a execução do meu aplicativo (usando o código acima) não. Suponho que estou lidando com algum problema de elevação de processo, então como eu executaria meu processo em um estado elevado? Preciso olhar ShellExecute
para isso?
Isso é tudo no Windows Vista. Estou executando o processo no depurador VS2008 elevado ao privilégio de administrador.
Eu também tentei configurar, startInfo.Verb = "runas";
mas não parecia resolver o problema.
fonte
startInfo.UseShellExecute = true;
, além dissostartInfo.Verb = "runas";
, funcionou bem para mim.Respostas:
Você pode indicar que o novo processo deve ser iniciado com permissões elevadas, definindo a propriedade Verb do seu objeto startInfo como 'runas', da seguinte maneira:
Isso fará com que o Windows se comporte como se o processo tivesse sido iniciado no Explorer com o comando de menu "Executar como Administrador".
Isso significa que o prompt do UAC será exibido e precisará ser reconhecido pelo usuário: se isso for indesejável (por exemplo, porque isso aconteceria no meio de um processo demorado), você precisará executar todo o processo do host com permissões elevadas por Criar e incorporar um UAC (Manifesto de aplicativo) para exigir o nível de execução 'maximumAvailable': isso fará com que o prompt do UAC apareça assim que o aplicativo for iniciado e fará com que todos os processos filhos sejam executados com permissões elevadas sem aviso adicional .
Editar: vejo que você acabou de editar sua pergunta para declarar que "runas" não funcionaram para você. Isso é realmente estranho, como deveria (e faz por mim em vários aplicativos de produção). Exigir que o processo pai seja executado com direitos elevados incorporando o manifesto definitivamente deve funcionar.
fonte
startInfo.ShellExecute=true
também para que isso funcione ... também não consegui fazer esse método funcionar com arquivos executáveis que estão em um compartilhamento de rede (é necessário copiá-los para o diretório temporário local antes de executar). ..Este código reúne tudo isso e reinicia o aplicativo wpf atual com admin privs:
Atualização: a maneira de manifesto do aplicativo é preferida:
Clique com o botão direito do mouse no projeto no visual studio, adicione um novo arquivo de manifesto do aplicativo, altere o arquivo para que você exija o administrador definido como mostrado acima.
Um problema com a maneira original: se você colocar o código de reinicialização no app.xaml.cs OnStartup, ele ainda poderá iniciar a janela principal brevemente, mesmo que o desligamento tenha sido chamado. Minha janela principal explodiu se init app.xaml.cs não foi executado e, em determinadas condições de corrida, ele faria isso.
fonte
string[] args
para o processo reaparecido.De acordo com o artigo Chris Corio: Ensine seus aplicativos a jogar bem com o controle de conta de usuário do Windows Vista, a MSDN Magazine, janeiro de 2007 ,
ShellExecute
verifica apenas o manifesto incorporado e solicita elevação, se necessário, enquantoCreateProcess
outras APIs não o fazem. Espero que ajude.Veja também: o mesmo artigo que .chm .
fonte
Isso será feito sem o UAC - não é necessário iniciar um novo processo. Se o usuário em execução for membro do grupo Admin, como no meu caso.
fonte
Você deve usar a representação para elevar o estado.
Não se esqueça de desfazer o contexto representado quando terminar.
fonte