Question

Je me demandais s'il y a un moyen simple pour un service pour créer un processus en session utilisateur?

Mon service est en cours d'exécution en tant qu'utilisateur (administrateur) compte et non pas comme un acount LocalSystem, je ne peux donc pas utiliser la fonction WTSQueryUserToken.

J'ai essayé d'appeler

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

mais quand j'utilise ce jeton pour exécuter

 CreateProcessAsUser(TokenHandle,.....)

mon processus est toujours en cours en session 0. Comment puis-je résoudre ce problème?

J'utilise une automatisation Ole donc je ne se soucient pas vraiment de quelle session le processus sera exécuté, tant il est pas la session 0 - parce que la carrière de quelque raison ne crée pas ses processus (winword .exe par exemple) en session 0, mais il les crée dans d'autres sessions utilisateur.

Toutes les suggestions seront les bienvenues. Merci à l'avance.

Était-ce utile?

La solution

J'ai été en mesure de résoudre ce problème moi-même, merci pour tous ceux qui se sont penchés sur cette question.

Ok, donc comme je l'ai mentionné ci-dessus - le jeton appartient à un processus qui exécute en session 0 ...

ce que je l'ai fait ... est recherché un jeton d'un processus qui ne fonctionne pas en session 0. lorsque vous prenez est l'identifiant du processus comme paramètre pour OpenProcessToken. que le CreateProcessAsUser va créer le processus dans la même session (et probablement avec les mêmes cridentals que le processus que vous avez choisi);

Le problème était que je ne pouvais pas obtenir des détails sur la plupart des processus en utilisant la fonction: QueryFullProcessImageName - car il a un bug, et il ne fonctionne pas sur proccesses qui sont créés à partir d'un chemin qui contient des espaces ( comme C: \ Program Files par exemple) et un autre problème avec cette fonction, je suppose que parce que je suis en cours d'exécution du processus original en utilisant un cridentals utilisateur je ne peux pas accéder aux informations d'un processus qui exécute en utilisant le compte système local. ce qui est assez mal parce que je voulais prendre le winlogon.exe que mon processus (parce qu'il indique une nouvelle session ouverte).

aussi pour succeeed dans cette astuce, vous devez jouer un peu avec la sécurité du système, afin de permettre au processus de demande de sécurité élevée: ce que j'ai choisi de faire élevé pour est: SeDebugPrivilege - pour trouver des informations sur les processus en cours d'exécution SeAssignPrimaryTokenPrivilege - afin de lancer un nouveau processus avec le jeton i extrait du processus de session de l'utilisateur (à savoir explorer.exe) Secreatetokenprivilege - je ne sais pas si elle est nécessaire, mais je l'ai fait quand même parce que cela semble lié

.

pour réussir à élever ces privilèges - vous devez ajouter l'utilisateur d'exécuter le processus aux utilisateurs concernés dans tous ces privilèges dans run-> gpedit.msc ou run-> secpol.msc (sous Local Computer Policy \ Configuration ordinateur \ paramètres Windows \ paramètres de sécurité \ LocalPolicies \ Attribution des droits utilisateur)

ajouter votre compte aux droits suivants (compaitable les previleges ci-dessus):
Créer un objet jeton
Programmes de débogage
Remplacer un jeton de niveau de processus

et est-ce! :) il a été fonctionne bien! BTW, vous pouvez désactiver toutes les choses ... je ne UAC sais pas si elle est liée ou non, mais il a fait le travail avec 2008 moins douloureux -. Pas de popups plus ennuyeux

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