Pergunta

Eu estou tentando instalar um serviço usando InstallUtil.exe mas invocado através Process.Start. Aqui está o código:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

onde m_strInstallUtil é o caminho totalmente qualificado e exe para "InstallUtil.exe" e strExePath é o caminho / nome totalmente qualificado para o meu serviço.

Running a sintaxe de linha de comando a partir de um comando elevado obras imediatas; correndo do meu aplicativo (usando o código acima) não. Eu suponho que eu estou lidando com algum problema de elevação processo, então como é que eu executar o meu processo em um estado elevado? Preciso olhar para ShellExecute para isso?

Isso é tudo no Windows Vista. Estou executando o processo no depurador VS2008 elevado a privilégios de administrador.

Eu também tentei definindo startInfo.Verb = "runas"; mas não parece resolver o problema.

Foi útil?

Solução

Você pode indicar o novo processo deve ser iniciado com permissões elevadas, definindo a propriedade verbo de seu objeto startInfo para 'runas', como se segue:

startInfo.Verb = "runas";

Isto fará com que o Windows a se comportar como se o processo foi iniciado a partir do Explorer com o "Executar como Administrador" comando de menu.

Este significa que o UAC prompt de virá-se e terá de ser reconhecido pelo usuário: se isso é indesejável (por exemplo, porque isso iria acontecer no meio de um processo demorado), você vai precisar para executar o seu inteiro processo hospedeiro com permissões elevadas por criar e incorporar um manifesto de aplicativo (UAC) para exigir nível de execução do 'highestAvailable':. isso fará com que o UAC prompt para aparecer assim que seu aplicativo é iniciado, e fazer com que todos os processos filhos para executar com permissões elevadas sem avisar adicional

Edit: Eu vejo que você acabou de editar a sua pergunta para afirmar que "runas" não funcionou para você. Isso é realmente estranho, como deveria (e faz por mim em vários aplicativos de produção). Exigindo que o processo pai para ser executado com direitos elevados, incorporando o manifesto deve definitivamente trabalho, no entanto.

Outras dicas

Esse código coloca o acima todos juntos e reinicia o aplicativo WPF atual com privs de administração:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

Update: é o preferido A maneira manifesto do aplicativo:

projeto Botão direito do mouse no estúdio visual, add, novo arquivo de manifesto do aplicativo, altere o arquivo para que você tenha set requireAdministrator como mostrado no exemplo acima.

Um problema com a forma original: Se você colocar o código reinício em App.xaml.cs OnStartup, ele ainda pode iniciar a janela principal brevemente embora Shutdown foi chamado. Minha janela principal explodiu se App.xaml.cs de inicialização não foi executado e, em determinadas condições de corrida que iria fazer isso.

De acordo com o artigo Chris Corio: Teach Your Apps para jogar bem com o Controle de Conta de Usuário do Windows Vista, MSDN Magazine, janeiro de 2007 , verifica apenas ShellExecute os embutidos de manifesto e solicita ao usuário para a elevação se necessário, enquanto CreateProcess e outras APIs não. Espero que ajude.

Veja também: mesmo artigo como .chm .

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

Isso vai fazê-lo sem UAC - não há necessidade de iniciar um novo processo. Se o usuário executar seja membro do grupo Admin como para o meu caso.

Você deve usar representação para elevar o estado.

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

Não se esqueça de desfazer o contexto representado quando você está feito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top