2010-04-06 7 views
2

J'ai un service Windows fonctionnant sous le compte "SYSTEM" qui vérifie si une application spécifique est en cours d'exécution pour chaque utilisateur connecté. Si l'application n'est pas en cours d'exécution, le service la démarre (sous le nom d'utilisateur correspondant).
J'essaie d'atteindre mon objectif en utilisant CreateProcessAsUser(). Le service démarre l'application sous le nom d'utilisateur correspondant, mais l'interface graphique n'est pas dessinée. (Oui, je m'assure que la case à cocher "Autoriser le service à interagir avec le bureau" est activée).CreateProcessAsUser ne dessine pas l'interface graphique

Système: XP SP3, langue: C#

Voici un code qui pourrait intéresser:

PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION(); 
startInfo.cb = Marshal.SizeOf(startInfo); 
startInfo.lpDesktop = "winsta0\\default"; 
bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo); 

Pour autant que je comprends, la mise en startInfo.lpDesktop = "winsta0 \ default"; aurait dû utiliser le bureau de l'utilisateur correspondant.
Même contrairement à ce qui est indiqué ici: http://support.microsoft.com/kb/165194, j'ai essayé de définir lpDesktop à null, ou pas du tout, tous les deux donnant le même résultat: processus a été démarré dans le nom de l'utilisateur attendu et je pouvais voir une partie du titre de la fenêtre bar. La fenêtre "invisible" intercepte les événements de clic de souris, les gère comme prévu. Il ne se dessine tout simplement pas.

Quelqu'un connaît-il un tel problème et sait ce que je fais mal?

+0

Je suis confronté au même problème, avez-vous trouvé une solution? –

Répondre

1

MSDN a un échantillon de la façon de créer un processus comme un autre utilisateur définissant des autorisations explicites sur la station de la fenêtre et des objets du bureau:

CreateProcessAsUser() windowstations and desktops

Vous pouvez porter le code C# en utilisant P/Invoke ou vous pouvez utiliser un assemblage C++/CLI.

Cependant, sachez que votre scénario est pas pris en charge et susceptible de rompre avec Vista (et de Windows 7 de) Session-0 isolation (télécharger le livre blanc à droite).

Questions connexes