C# et .NET 3.5 - Comment lancer un processus en utilisant les informations d'identification différentes, avec une fenêtre masquée, et d'être en mesure de capturer la sortie standard et la sortie de code?

J'ai un Windows Service développé en C# et .NET 3.5 pour effectuer diverses tâches administratives tout au long de nos 3 domaines. J'ai un compte admin dans chaque domaine qui en a les droits/permissions pour que ce service est en train de faire.

Pour toutes les interactions sur une ANNONCE, je peux lier à l'ANNONCE en utilisant le bon nom d'utilisateur/mot de passe pour le nom de domaine et tout est bon. Cependant, j'ai besoin maintenant de lancer un processus externe (robocopy) pour effectuer un peu de travail et je ne trouve pas d'exemples de code n'importe où pour faire cela .NET 3.5.

Ce que je dois faire est de lancer le robocopy à l'aide d'autres informations d'identification dans une fenêtre masquée, la capture de la sortie standard, donc j'ai un journal de ce qui a été fait, et de capturer le code de sortie pour que je puisse dire si elle a réussi.

J'ai trouvé quelques vieux .NET 1.1 code de K. Scott Allen blog (voir les derniers commentaires pour un bon exemple de code) qui s'étend le Système.Diagnostics.Objet de processus et les appels de l'API Win32 fonction CreateProcessAsUserW. Cependant, le code ne fonctionne pas en raison de certains changements de l'API .NET 2.0. À l'aide de l'extrait de code dans le dernier commentaire sur le blog référencé où il est à l'aide de la réflexion pour appeler le privé SetProcessHandle fonction de l'objet de Processus provoque des erreurs d'Accès Refusé lorsque j'essaie d'interagir avec le processus (pour le tuer ou obtenir le code de sortie).

Quelqu'un aurait-il un bon exemple de comment procéder?

EDIT: L'intégré .NET Processus et ProcessStartInfo API ne vous permettent de spécifier d'autres informations d'identification, mais quand vous faites, il veut créer une fenêtre visible (même si vous spécifiez CreateNoWindow ou WindowStyle Caché) qui échoue lors de l'exécution en tant que Service Windows. Ce ne sont donc pas une option pour cette application. L'usurpation d'identité ne fonctionne pas non plus depuis quand le processus externe est lancé, il utilise les informations d'identification du processus parent, de ne pas l'identité de pouvoirs.

SOLUTION: Que Reed a souligné ci-dessous, P/Invoke à l'aide de l'une des fonctions de l'API Win32 devrait vous permettre de faire cela. J'ai fini par aller un itinéraire légèrement différent à l'aide d'un vieux freeware NT4 utilitaire appelé RunProcess qui vous permet de spécifier un nom d'utilisateur/mot de passe sur la ligne de commande. Il a travaillé sur Vista et 2k3 et a également travaillé correctement lorsqu'il est lancé par un service windows s'exécutant en tant que Système Local.

David - j'ai ajouté un peu de P/Invoke options. Fonctionnent-ils?

OriginalL'auteur David Archer | 2009-03-13