OVH Cloud OVH Cloud

Lancement d'une application depuis un Service

10 réponses
Avatar
Jean-Yves
Bonjour,

J'ai crée un service pour Win2k. Lorsque je lance une application par un
CreateProcess à partir de ce service, l'application ainsi lancée apparait
bien dans le gestionnaire de taches mais ne s'affiche pas et semble ne pas
avoir de file de message alors que si je la lance par l'explorateur tout
fonctionne normalement.

Je me demandais si je n'avais pas fait une betise lors de l'appel du
CreateProcess. Voilà comment j'initialise la structure STARTUPINFO :

ZeroMemory(&startInfo, sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
startInfo.lpReserved = NULL;
startInfo.lpTitle = NULL;
startInfo.lpDesktop = NULL;
startInfo.dwX = 0;
startInfo.dwY = 0;
startInfo.dwXSize = 540;
startInfo.dwYSize = 256;
startInfo.dwXCountChars = 0;
startInfo.dwYCountChars = 0;
startInfo.dwFillAttribute = FOREGROUND_RED | BACKGROUND_RED
| BACKGROUND_GREEN | BACKGROUND_BLUE ;
startInfo.dwFlags = STARTF_USESIZE | STARTF_USEFILLATTRIBUTE;
startInfo.wShowWindow = SW_SHOWMINIMIZED;
startInfo.lpReserved2 = NULL;
startInfo.cbReserved2 = 0;
startInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);

Avez-vous fait quelque chose de similaire ? Merci pour votre aide.

Jean-Yves

10 réponses

Avatar
LoloSoft
ShellExecute ?

--

Laurent.
Avatar
Lo
"Jean-Yves" a écrit
Bonjour,



J'ai crée un service pour Win2k. Lorsque je lance une application par un
CreateProcess à partir de ce service, l'application ainsi lancée apparait
bien dans le gestionnaire de taches mais ne s'affiche pas et semble ne pas
avoir de file de message alors que si je la lance par l'explorateur tout
fonctionne normalement.



Normal.

Je me demandais si je n'avais pas fait une betise lors de l'appel du
CreateProcess. Voilà comment j'initialise la structure STARTUPINFO :



Le probleme ne vient pas de là.

Je pencherai plutot pour un probleme lors du CreateService ( voir flag
SERVICE_INTERACTIVE_PROCESS, notion de LocalSystem Account, Interactive
Services etc.). En gros ton appli apparait dans le gestionnaire des taches
parce qu'elle s'execute bien, mais elle s'execute sur un autre bureau ( voir
Window Stations and Desktops ).

Loic.
Avatar
Jean-Yves
Je cree le service avec un compte utilisateur (et non un compte système)
pour avoir les droits reseau sur le domaine (l'application à executer se
trouve sur le disque d'un ordinateur distant.
Je fait le service avec le flag "SERVICE_INTERACTIVE_PROCESS", mais j'ai
aussi essayé sans et le resultat est le même.

Jean-Yves

"Lo" a écrit dans le message de
news:bqf10t$11d$
"Jean-Yves" a écrit
> Bonjour,

> J'ai crée un service pour Win2k. Lorsque je lance une application par un
> CreateProcess à partir de ce service, l'application ainsi lancée


apparait
> bien dans le gestionnaire de taches mais ne s'affiche pas et semble ne


pas
> avoir de file de message alors que si je la lance par l'explorateur tout
> fonctionne normalement.

Normal.

> Je me demandais si je n'avais pas fait une betise lors de l'appel du
> CreateProcess. Voilà comment j'initialise la structure STARTUPINFO :

Le probleme ne vient pas de là.

Je pencherai plutot pour un probleme lors du CreateService ( voir flag
SERVICE_INTERACTIVE_PROCESS, notion de LocalSystem Account, Interactive
Services etc.). En gros ton appli apparait dans le gestionnaire des taches
parce qu'elle s'execute bien, mais elle s'execute sur un autre bureau (


voir
Window Stations and Desktops ).

Loic.




Avatar
Thierry
Bonjour,

Jean-Yves a écrit :

Je fait le service avec le flag "SERVICE_INTERACTIVE_PROCESS", mais j'ai
aussi essayé sans et le resultat est le même.



T'as un autre bug alors, mais garde ce flag de toute façon.

(t'es bien sur qui y est le flag ?? verifie dans la BDR que y'a bien 0x100
dans le mask ConfigFlags).

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
Avatar
Jean-Yves
Bonne idée.

Effectivement quand je modifie le compte système (pour mettre un compte
utilisateur), le flag "interagir avec l'utilisateur" disparait. Comment
faire pour avoir ce flag et des droits reseau ?

"Thierry" a écrit dans le message de
news:
Bonjour,

Jean-Yves a écrit :

> Je fait le service avec le flag "SERVICE_INTERACTIVE_PROCESS", mais j'ai
> aussi essayé sans et le resultat est le même.

T'as un autre bug alors, mais garde ce flag de toute façon.

(t'es bien sur qui y est le flag ?? verifie dans la BDR que y'a bien 0x100
dans le mask ConfigFlags).

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"


Avatar
Lo
"Jean-Yves" a écrit

Effectivement quand je modifie le compte système (pour mettre un compte
utilisateur), le flag "interagir avec l'utilisateur" disparait. Comment
faire pour avoir ce flag et des droits reseau ?

> > Je fait le service avec le flag "SERVICE_INTERACTIVE_PROCESS", mais


j'ai
> > aussi essayé sans et le resultat est le même.
>
> T'as un autre bug alors, mais garde ce flag de toute façon.
>
> (t'es bien sur qui y est le flag ?? verifie dans la BDR que y'a bien


0x100
> dans le mask ConfigFlags).




MSDN :

SERVICE_INTERACTIVE_PROCESS : This value is valid only if lpServiceStartName
is the LocalSystem account.


Voir "Interacting with the User in a Service" dans le MSDN. Ca peut
peut-etre aider. ( sinon va falloir se resoudre à ce que le service ne soit
pas interactif .. )

Loic.
Avatar
Jean-Yves
Ben en fait c'est pas vraiment le service qui doit être interactif (lui le
seul truc qu'il fait c'est ecouter sur un port une requete socket pour
lancer un executable qui peut être situé en local ou sur le reseau).
Par contre l'application lancée doit elle être interactive.

"Lo" a écrit dans le message de
news:bqf3bg$2gi$

"Jean-Yves" a écrit

> Effectivement quand je modifie le compte système (pour mettre un compte
> utilisateur), le flag "interagir avec l'utilisateur" disparait. Comment
> faire pour avoir ce flag et des droits reseau ?
>
> > > Je fait le service avec le flag "SERVICE_INTERACTIVE_PROCESS", mais
j'ai
> > > aussi essayé sans et le resultat est le même.
> >
> > T'as un autre bug alors, mais garde ce flag de toute façon.
> >
> > (t'es bien sur qui y est le flag ?? verifie dans la BDR que y'a bien
0x100
> > dans le mask ConfigFlags).


MSDN :

SERVICE_INTERACTIVE_PROCESS : This value is valid only if


lpServiceStartName
is the LocalSystem account.


Voir "Interacting with the User in a Service" dans le MSDN. Ca peut
peut-etre aider. ( sinon va falloir se resoudre à ce que le service ne


soit
pas interactif .. )

Loic.




Avatar
Lo
"Jean-Yves" a écrit dans le message de news:
bqf3lr$2mm$
Ben en fait c'est pas vraiment le service qui doit être interactif (lui le
seul truc qu'il fait c'est ecouter sur un port une requete socket pour
lancer un executable qui peut être situé en local ou sur le reseau).
Par contre l'application lancée doit elle être interactive.



Dans CreateProcess :
startInfo.lpDesktop = NULL ;

-> If lpDesktop is NULL, the new process inherits the desktop and window
station of its parent process. If lpDesktop is an empty string, the process
does not inherit the desktop and window station of its parent process;
instead, the system determines if a new desktop and window station need to
be created. If the impersonated user already has a desktop, the system will
use the existing desktop.


Donc essayer de mettre une chaine vide à la place. Et sinon il faut
recuperer le desktop/station de l'utilisateur loggué et passer le bon
parametres ( il y'a sans doute des questions de droit ). m'enfin j'en sais
pas beaucoup plus.

Loic.
Avatar
adebaene
"Jean-Yves" wrote in message news:<bqeubf$va3$...
Bonjour,


Bonjour.


J'ai crée un service pour Win2k. Lorsque je lance une application par un
CreateProcess à partir de ce service, l'application ainsi lancée apparait
bien dans le gestionnaire de taches mais ne s'affiche pas et semble ne pas
avoir de file de message alors que si je la lance par l'explorateur tout
fonctionne normalement.



Normal :
- ton service est lancé dans le contexte de sécurité système ou le
contexte d'un compte "réseau", mais en tout cas pas sous le compte de
la personne qui est loggée sur la machine.
- ton service tourne dans une windows station et un desktop autre que
la windows station et le desktop interactifs.

Ce qu'il faut faire :
- ImpersonnateLoggedOnUser
- CreateProcessAsUser en spécifiant lpDesktop="winsta0default" dans
le STARTUPINFO.
- RevertToSelf.

Toute la question étant ensuite de savoir comment tu récupères le
handle passé à ImpersonnateLoggedOnUser. Ca dépend de ce que tu veux
faire et de ton environnement. Est-ce que, par exemple, tu as réfléchi
a ce que dois faire si personne n'est loggé sur la machine? Et sur un
serveur TerminalServices, c'est dans l'environnement de quel
utilisateur que l'application doit se lancer?

Dans tous les cas, l'article "Starting an Interactive Client Process"
dans MSDN pourrait te mettre sur la piste

Arnaud
Avatar
Jean-Yves
Merci beaucoup pour toutes ces infos.

"Lo" a écrit dans le message de
news:bqfkqf$ds4$
"Jean-Yves" a écrit dans le message de news:
bqf3lr$2mm$
> Ben en fait c'est pas vraiment le service qui doit être interactif (lui


le
> seul truc qu'il fait c'est ecouter sur un port une requete socket pour
> lancer un executable qui peut être situé en local ou sur le reseau).
> Par contre l'application lancée doit elle être interactive.

Dans CreateProcess :
startInfo.lpDesktop = NULL ;

-> If lpDesktop is NULL, the new process inherits the desktop and window
station of its parent process. If lpDesktop is an empty string, the


process
does not inherit the desktop and window station of its parent process;
instead, the system determines if a new desktop and window station need to
be created. If the impersonated user already has a desktop, the system


will
use the existing desktop.


Donc essayer de mettre une chaine vide à la place. Et sinon il faut
recuperer le desktop/station de l'utilisateur loggué et passer le bon
parametres ( il y'a sans doute des questions de droit ). m'enfin j'en sais
pas beaucoup plus.

Loic.