Question

Je suis en cours d'exécution d'un processus à l'intérieur d'un service Windows en utilisant

ProcessStartInfo processStartInfo = new ....
Process.Start(processStartInfo);

Le problème est, si je lance le service sous le compte système local, il fonctionne bien, mais il ne montre pas la fenêtre des programmes. J'ai essayé de mettre les informations d'identification de l'utilisateur dans les propriétés de service, mais « Autoriser le service à interagir avec le bureau » case à cocher devient désactiver.

J'ai vraiment besoin d'exécuter l'application appelant du service, et je vraiment besoin de voir la fenêtre de l'application.

Aidez-moi s'il vous plaît.

UPD. Eh bien, vous utilisez la version surchargée de Process.Start ce qui se passe le nom d'utilisateur, mot de passe et domaine - il va tirer le programme sur le bureau. Mais maintenant, il commence l'application sous une des informations d'identification, mais montre que sur le bureau d'un autre utilisateur. Comment ça se fait?

UPD2: J'ai une idée! Je peux utiliser psexec.exe de Sysinternals Suite. Mais le problème est que je dois commencer cette chose en silence « en tant qu'administrateur ». Et je ne sais pas comment. Je veux dire, même si vous êtes déjà des droits d'administrateur, vous devez parfois dire manuellement « Exécuter en tant qu'administrateur », confirmer UAC et seulement après que vous êtes prêt à partir. Je ne sais pas comment courir en silence quelque chose sans faire chose .... UAC

UPD3: Cher Seigneur. Je dois cette chose! Enfin.

Ok. Au début, le problème était en effet dans la session 0 chose d'isolement. Il me fallait donc construire une application moyenne qui peut être démarré à partir du service puis, cette application à son tour supposé commencer ma demande par RPC et l'amener à un ordinateur de bureau. Au lieu de construire l'application de la couche intermédiaire, j'ai décidé d'utiliser l'outil psexec (de toute façon, il fonctionne exactement de la façon dont je besoin - via RPC). Et quand j'ai essayé d'utiliser cet outil dans le compte système local, il ne fonctionne pas pour une raison quelconque. Et puis je me suis rendu - la raison est dialogue pop-up CLUF damn que MS a mis en chaque pstool, et il était impossible de cliquer sur le bouton pour confirmer dialogue sous le compte système local. Donc, la solution est de créer une clé dans le Registre HKU.DEFAULT \ Software \ Sysinternals \ PsExec avec la valeur DWORD EulaAccepted = 1

Hourra, maintenant ça marche! MAIS! Maintenant, je dois apporter le programme à l'écran de l'utilisateur connecté. Pour ce faire, je vais avoir besoin de l'identifiant de session!

La question est: Comment se a ouvert une session ID de session de l'utilisateur? Et ce qui se passe s'il n'y a personne encore connecté? Que id session qui serait?

UPD4: Ca y est! Je suis celui-là!

[DllImport ( "Kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId")]  WTSGetActiveConsoleSessionId () extern static int;

Merci les gars!

Était-ce utile?

La solution

Une solution serait d'avoir un troisième acte de processus d'intermédiaire, et lui dire lancer des applications via RPC / canaux nommés.

Processus:

  • service Windows
  • Application intermédiaire
  • L'application que vous voulez exécuter

La cale crée un point de terminaison de communication (canal nommé, point final de WCF) et écoute sur elle. Quand il reçoit un message d'aller de l'avant, il lance l'application que vous souhaitez exécuter.

Ensuite, lorsque le service Windows veut lancer une application, il trouve et ouvre le point final (appelé pipe, point final WCF) et envoie le message pour lancer l'application. Ensuite, l'application intermédiaire prend en charge l'activité de lancement de processus, et ne pas les limites que le service Windows a.

Faire de ce processus intermédiaire commence par l'ouverture de session, et vous êtes bon pour aller.

Ceci est similaire à la façon dont le travail agent de test Microsoft / contrôleur lorsque vous devez exécuter des tests qui interagissent avec le bureau.

Autres conseils

Vous pouvez obtenir l'ID de session de console active à l'aide WTSGetActiveConsoleSessionId (de l'API des services Terminal Server). Vous ne pouvez l'utiliser pour Windows XP / Win2K3 ou plus, mais cela devrait être bien, comme vous pouvez coder en dur 0 pour l'identifiant de session sur Win2K ou plus tôt. Voici la signature PInvoke pour elle:

[DllImport("Kernel32.dll", SetLastError = true)]
[return:MarshalAs(UnmanagedType.U4)]
public static extern int WTSGetActiveConsoleSessionId ( );

En ce qui concerne le lancement d'un processus pour la réponse que je donnais la session de l'utilisateur, vous pouvez vous référer ici . Il consiste essentiellement à quatre callling API; WTSGEtConsoleSessionId, WTSQueryUserToken, DuplicateTokenEx, puis CreateProcessAsUser, et il le fera. Travailler sur une machine exécutant Windows XP / Win2K3 ou supérieur

Cela peut se faire sans un processus intermédiaire, mais il a besoin de plus de 500 lignes de code à faire. En gros, vous voulez lancer votre deuxième processus que le courant utilisateur connecté. Pour Vista / 7, cet utilisateur aura son propre processus de winlogon, alors que pour XP, ils auront un processus d'explorateur. Vous devez obtenir le jeton primaire, bloc d'environnement, les attributs de sécurité, et la sécurité des attributs de thread de ce processus en cours d'exécution puis appeler la fonction API Windows CreateProcessAsUser avec toutes ces informations, en vous assurant de sélectionner la station de fenêtre correcte et (généralement « WinSta0 \ Default « ). Tout cela est faisable, mais vous pourriez avoir un meilleur moment avec l'autre suggestion d'un deuxième processus et IPC.

Si vous essayez ceci sur quoi que ce soit plus récent que WindowsXP cela ne fonctionnera pas. En effet, d'une nouvelle fonctionnalité introduite dans l'isolement Vista / Windows 7 appelé Session 0. http://msdn.microsoft.com/en-us/library/bb756986. ASPX Vous ne pourrez pas obtenir une application lancée par un service pour afficher sur le bureau des utilisateurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top