C # e .NET 3.5 - Como iniciar um processo usando credenciais diferentes, com uma janela oculta, e ser capaz de capturar o código de saída e de saída padrão?

StackOverflow https://stackoverflow.com/questions/643723

Pergunta

Eu tenho um serviço do Windows desenvolvido em C # e .NET 3.5 para executar várias tarefas administrativas durante toda a 3 domínios. Eu tenho uma conta de administrador em cada domínio que tem os direitos necessários / permissões para que este serviço está fazendo.

Para todas as interações AD, eu posso ligar a AD usando o nome de usuário / senha correta para o domínio e tudo é bom. No entanto, eu tenho uma necessidade agora para lançar um processo externo (robocopy) para realizar algum trabalho e não consigo encontrar qualquer exemplos de código em qualquer lugar para fazer isso no .NET 3.5.

O que eu preciso fazer é lançamento robocopy usando credenciais alternativas em uma janela oculta, capturar a saída padrão, por isso tenho um registro do que realmente foi feito, e capturar o código de saída para que eu possa dizer se ele foi bem sucedido.

Eu encontrei algum código .NET 1.1 velho de K. blog de Scott Allen (ver últimos comentários para um código de boa lista) que estende o objeto System.Diagnostics.Process e chama a função API Win32 CreateProcessAsUserW. No entanto, o código não funciona devido a algumas mudanças na API em .NET 2.0. Usando o trecho de código a partir do último comentário no blog referenciada onde ele está usando reflexão para chamar a função SetProcessHandle privada do objecto de processo de acesso causas erros negado quando tento interagir com o processo (para matá-lo ou obter o código de saída).

Alguém tem um bom exemplo de como fazer isso?

EDIT: A built-in .NET Processo e ProcessStartInfo API lhe permite especificar credenciais alternativas, mas quando o fizer, ele quer criar uma janela visível (mesmo se você especificar CreateNoWindow ou WindowStyle Oculto) que falha quando executado como um Serviço do Windows. Portanto, aqueles não são uma opção para esta aplicação. A representação não quer trabalhar desde quando o processo externo é lançado, ele usa as credenciais do processo pai e não as credenciais representado.

SOLUÇÃO: Como Reed apontou abaixo, P / Invoke utilizando uma das funções da API Win32 deve permitir que você para fazer isso acontecer. Eu acabei indo uma rota ligeiramente diferente usando um gratuito utilidade NT4 velho chamado RunProcess que permite que você especifique um nome de usuário / senha na linha de comando. Ele trabalhou no Vista e 2k3 e também trabalhou corretamente quando lançado por um serviço de janelas em execução como sistema local.

Foi útil?

Solução

Eu acho que você quer olhar em:

ProcessStartInfo

Isso fornece uma .NET única maneira de iniciar um processo sob um usuário diferente com credenciais diferentes. Não há mais necessidade para a API Win32.

--- EDIT ---

Outras alternativas poderia ser a de usar o P / Invoke conforme especificado aqui (veja a nota na parte inferior primeiro) ou, mais provavelmente, usando P / Invoke com CreateProcessWithLogonW .

Outras dicas

Apenas um pensamento não verificado, mas não está usando dinâmica Representar válida para todo o bloco de código em .NET 2+? Então representar o usuário necessário e, em seguida, fazer o que você precisa dentro do contexto representada / escopo, como começar um processo de uma forma normal? Acho que fizemos algo parecido para integrar mstsc.exe lançamento usando credenciais já fornecidos.

StartInfo tem uma propriedade chamada CreateNoWindow que podem tornar o trabalho sugestão de Reed para você.

Se você quiser ver esses códigos de saída efectivamente utilizadas, ter um olhar para www.robocopyplus.com. ele age como um robocopy invólucro em torno de acrescentar swicthes para a notificação de e-mail e filtragem de relatório. Isso já pode fazer algumas das coisas que você está tentando alcançar.

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