iniciando um processo elevado do UAC a partir de um serviço não interativo (win32 / .net / powershell)

Estou usando um serviço Windows de terceiros que lida com algumas tarefas de automação executando scripts e executáveis usando CreateProcessAsUser (). Estou com problemas no Windows Server 2008 devido ao UAC e à maneira como a elevação da LUA é tratada pelas APIs.

O serviço é executado como LocalSystem e não tem "Interagir com a área de trabalho" ativado. Os processos estão sendo executados como usuários no grupo Administradores, mas não na conta Administrador (que está isenta de muitas restrições de UAC). Todas as configurações padrão do UAC em vigor.

Posso passar comandos arbitrários ou código do PowerShell para o serviço, mas não consigo "interromper" o processo não elevado e não interativo que é iniciado pelo serviço.

O ponto crucial da questão parece ser que a única opção de API (pública) para iniciar um processo elevado é ShellExecute () com o verbo 'runas', mas, tanto quanto eu sei, isso não pode ser chamado de um não-interativo serviço ou erros como "Esta operação requer uma estação de janela interativa".

A única solução alternativa que encontrei é mencionada aqui:http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

No Vista, a maneira oficial documentada de elevar um processo é usar apenas a API do shell ShellExecute (Ex) (não CreateProcess ou CreateProcessAsUser). Portanto, seu aplicativo deve chamar ShellExecute (Ex) para iniciar um auxiliar elevado para chamar SendInput. Além disso, devido ao isolamento da Sessão 0, um serviço pode usar apenas CreateProcessAsUser ou CreateProcessWithLogonW (não pode usar ShellExecute (Ex)) para especificar a área de trabalho interativa.

.. Acho que não há maneira direta de gerar um processo elevado a partir de um serviço do Windows. Só podemos usar primeiro CreateProcessAsUser ou CreateProcessWithLogonW para gerar um processo não elevado na sessão do usuário (área de trabalho interativa). Em seguida, no processo não elevado, ele pode usar ShellExecute (Ex) para gerar um processo elevado para a tarefa real.

Para fazer isso a partir do código .net / powershell, parece que eu teria que fazer algumas coisas elaboradas da P / Invoke para chamar CreateProcessAsUser ou CreateProcessWithLogonW, pois o .Net System.Diagnostics.ProcessStartInfo não tem um equivalente de lpDesktop que eu poderia definido como "winsta0 \ default". E não estou claro se o LocalSystem tem o direito de chamar CreateProcessAsUser ou CreateProcessWithLogonW.

Eu também olheihttp://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx eProcess.Start com credenciais diferentes com o UAC em

Com base nisso, estou chegando à conclusão de que não há uma maneira direta de fazer isso. Estou esquecendo de algo? Isso realmente não parece que deve ser tão difícil. Parece que o UAC nunca foi projetado para lidar com casos de uso não interativos.

E se algum pessoal da Microsoft acabar lendo isso, notei que a maneira como o ShellExecute lida internamente com a elevação é chamando o Application Information Service (AIS). Por que a mesma chamada para o AIS não está disponível por meio de alguma API Win32 ou .NET?http://msdn.microsoft.com/en-us/library/bb756945.aspx

Desculpe, isso demorou um pouco. Obrigado por todas as idéias.

questionAnswers(2)

yourAnswerToTheQuestion