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.
OriginalL'auteur David Archer | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
Je pense que vous voulez regarder:
ProcessStartInfo
Qui fournit un .NET seul moyen de démarrer un processus en vertu d'un autre utilisateur avec les informations d'identification différentes. N'a plus besoin de l'API Win32.
--- EDIT ---
D'autres solutions pourrait être d'utiliser le P/Invoke, comme spécifié ici (voir la note au bas de la première) ou, plus probablement, à l'aide de P/Invoke avec CreateProcessWithLogonW.
OK, cette question est susceptible d'invalider ma réponse plus ou moins... 🙂
David: j'ai ajouté 2 autres possibilités.
Retomber sur l'API Win32 l'aide de P/Invoke fonctionnerait donc je vais accepter cette réponse. J'ai fini par aller un itinéraire légèrement différent comme indiqué dans la question.
David: Jolie trouvaille sur le RunProcess utilitaire.
OriginalL'auteur Reed Copsey
Juste un non vérifiés de la pensée, mais n'est pas à l'aide de dynamic Usurper l'identité valable pour l'ensemble du bloc de code .net 2+? Donc emprunter l'identité de l'utilisateur requis et ensuite faire tout ce que vous avez besoin dans le contexte représenté/domaine d'application, comme le début d'un processus "normal"? Pense que nous avons fait quelque chose de similaire pour intégrer mstsc.exe le lancement de l'aide déjà fourni des informations d'identification.
Ah bien, je me souviens de le faire fonctionner à l'intérieur de la impersonationcontext avec mstsc était possible... mais, ça aurait été plus compliqué que je le rappeler - ont pour revérifier la mise en œuvre, après le week-end de la bière 😉
OriginalL'auteur Oskar Duveborn
Cela devrait bien fonctionner avec le
Process
classe etProcessStartInfo
.Les informations d'identification différentes:
De rediriger la sortie standard:
Code de sortie:
J'espère que cette aide.
Matthias
OriginalL'auteur Matthias Meid
StartInfo a une propriété appelée CreateNoWindow que peut faire Reed la suggestion de travailler pour vous.
Vous fournissez un nom d'utilisateur et mot de passe si, n'êtes-vous pas? Vous avez dit que vous étiez en fournissant autre utilisateur des informations d'identification. Peut-être que j'ai raté quelque chose.
Oui, je suis en fournissant d'autres informations d'identification. Les docs disent que si vous fournissez des informations d'identification, il ignore la CreateNoWindow de la propriété.
OriginalL'auteur Chris Holmes
Si vous voulez voir ces codes de sortie utilisé en réalité, jeter un oeil à http://www.robocopyplus.com.
il agit comme un wrapper autour de robocopy pour ajouter swicthes pour les e-mails de notification et de rapport de filtrage.
Cela peut déjà faire certaines des choses que vous essayez d'atteindre.
OriginalL'auteur