SERVICE NT | TOUS CE QUE VOUS DEVEZ SAVOIR | INCLU DOC, ZIP ET SOURCE

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 4 avril 2004 à 10:54
cs_krzysiu Messages postés 22 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 3 septembre 2011 - 4 juil. 2012 à 21:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21678-service-nt-tous-ce-que-vous-devez-savoir-inclu-doc-zip-et-source

cs_krzysiu Messages postés 22 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 3 septembre 2011
4 juil. 2012 à 21:19
Ben oui mais, ça cours pas les rues comme dit Mauricio, j'ai bien un palliatif, mais c'est du bricolage.

d'ou cette exhumation .
cs_PascalZ Messages postés 13 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 4 juillet 2012
4 juil. 2012 à 20:29
Fichtre ! ca c'est du déterrage de topic ! :)
cs_krzysiu Messages postés 22 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 3 septembre 2011
4 juil. 2012 à 20:04
Bonjour a tous,

Je me suis inspiré de ton code pour creer un service qui envoie des mails. tout va bien quand je le teste sur mon poste (W7 Pro).
Par contre lorsque je l'installe sur un autre PC W7 Pro, là j'ai : Erreur 2 : le fichier spécifier est introuvable.

Je suis en train de chercher sur internet, mais pour le moment rien.

Si quelqu'un à une idée... Merci
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
10 janv. 2008 à 19:01
Arg, le tray icon n' apparait pas après reinicialsation du PC ...
Si quelqu' un connait la solution, je suis preneur!
A+
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
10 janv. 2008 à 18:49
Salut GaudeTM,

faut dire que les sources sur les services, ça court pas les rues!
Vu que j' en ai besoin pour un programme de mails qui importe les mails de plusieurs comptes (il marche en ce moment comme exe normal).

J' apporte un petit suplément à cette source, comment insérer un TrayIcon avec un PopMenu :

const
WM_TASKBAREVENT = WM_USER + 1;

type
TService1 = class(TService)
Timer1: TTimer;
Timer2: TTimer;
PopMenu: TPopupMenu;
MIMainWindow: TMenuItem;
MIPause: TMenuItem;
N1: TMenuItem;
MIClose: TMenuItem;
procedure ServiceExecute(Sender: TService);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
private
{ Private declarations }
procedure HandleIconMessage(var Msg: TMessage);
procedure WMTaskBarEvent(var Msg: TMessage); message WM_TASKBAREVENT;
public
FHandle: HWND; // On va créer un HWND juste pour capturer le click de la souris ...
IconData : TNotifyIconData;
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Service1: TService1;

procedure TService1.WMTaskBarEvent(var Msg: TMessage);
var pt: TPoint;
begin
if msg.LParam = WM_RBUTTONDOWN
then begin
GetCursorPos(pt);
PopMenu.Popup(pt.x, pt.y);
PostMessage(aHWND, WM_NULL, 0, 0);
end;
end;

procedure TService1.HandleIconMessage(var Msg: TMessage);
begin
if Msg.Msg = WM_TASKBAREVENT
then WMTaskBarEvent(Msg);
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
FHandle := Classes.AllocateHWnd(HandleIconMessage);

// Tray Icon :
IconData.cbSize := sizeof(IconData);
IconData.Wnd := FHandle;

IconData.uID := 100;
IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage := WM_TASKBAREVENT;
IconData.hIcon := Forms.Application.Icon.Handle;
StrPCopy(IconData.szTip, Service1.DisplayName);
Shell_NotifyIcon(NIM_ADD, @IconData);
end;

procedure TService1.ServiceDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @IconData);
Classes.DeallocateHWnd(FHandle);
end;

A+
MikoLePepe Messages postés 1 Date d'inscription vendredi 5 octobre 2001 Statut Membre Dernière intervention 15 avril 2006
15 avril 2006 à 14:33
Très clair et hautement utile....
Merci!!!
raimbow64 Messages postés 1 Date d'inscription vendredi 20 juin 2003 Statut Membre Dernière intervention 19 novembre 2005
19 nov. 2005 à 12:36
Bonjour, merci pour ces informations. Une question peut on gerer les execptions ?
car j'ai essayé de faire ceci (qui fonctionne dans une appli normale)
dans le oncreate j'ajoute
application.onexception := mafonctionaexecuter;
mais lors de la compilation il me dit que onexception est un identificateur non déclaré. Je ne vois d'où cela peut provenir.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
27 oct. 2005 à 11:42
@thierrylp

c'est normal
que ca soit plutot avec des guillemets:
PChar('"C:\Program Files\Micap\Administration\miAdmin.exe"')

car dans "Program Files" il ya d'espace...
assez clair je pense ;)
cs_thierrylp Messages postés 8 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 18 janvier 2010 1
27 oct. 2005 à 05:27
La suite...
maintenant mon service se lance, la connexion à la bdd se fait correctement.
mon service recoit les evenements postés par la bdd firebird.
Sur un evenement je desire lancer un executable developpé en delphi (aussi).
J'utilise la mm commande que dans la source ci dessus.:
WinExec(PChar('C:\Program Files\Micap\Administration\miAdmin.exe'), SW_SHOWNORMAL);
Lors du lancement de cette ligne de commande j'ai un message d'erreur Unnamed:
----------------------------------------------------------------------------------
C:/Documents and Setting\LocalService\Bureau fait référence à un emplacement non disponible. Il peut s'agir d'un emplacement situé sur un disque dur de cet ordinateur ou sur un reseau. Vérifier que le disque est insérer correctement, ou que vous êtes connecté(e) à Internet ou à un réseau domestique, puis essayer à nouveau. Si vous ne trouvez toujours pas l'information, elle a peut être été déplacée vers un emplacement différent.
--------------------------------------------------------------------------------------
Désolé pour la longueur. Une fois le message acquité, mon executable est lancé mais cé bien dommage pour une application qui doit se gerer sans intervenant.
Des suggestions ? elles seront bienvenues.
cs_thierrylp Messages postés 8 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 18 janvier 2010 1
27 oct. 2005 à 04:53
Trouvé l'explication, je la donne cela peut toujours servir.
Pour installer un service, on doit se situer dans le repertoire de l'executable et en ligne de commande taper : MonAppliService.exe /install
Si l'on se trouve dans un repertoire interne de mes documents <---ca marche pas et il se produit l'erreur citée plus haut.
A bon entendeur...
cs_thierrylp Messages postés 8 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 18 janvier 2010 1
21 oct. 2005 à 02:18
Bonjour,
Je developpe egalement un service Delphi permettant de scruter un trigger sur un Bdd Firebird 1.5 (projet Phoenix basé sur interbase 6.0).
lors du lancement de mon service j'ai une erreur qui se produit : Erreur 193 0xC1
J'ai respecté les recommandations en lancant cette connection bdd au bout de 5 s.
Rien n'y fait , je dois passer à coté de qq chose.
Merci pour toute info.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
20 oct. 2005 à 12:03
@Didier44

je pense que ton probleme etait un probleme d'authorisation (droits d'utilisateur) et/ou de securité (parfeu)
ca fait quelques mois que t'as ce probleme, t'aurais due bien regarder en dehors de ton service ;)

en tout cas, ta remarque est bonne a savoir, et surtout cruciale a eviter :)

merci
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
19 oct. 2005 à 16:35
J'ai enfin trouvé l'explication : je ne pouvais tout simplement pas accéder à ma base de données (Interbase) dans mon apllication service parceque le serveur Interbase éatit lancé comme apllication standard et non comme service (Je ne peux dire pourquoi cela ne fonctionnait pas ; en revanche je sais que depuis que je l'ai lancé en tant que service je n'ai plus aucun pb!) Peut-être auras-tu une explication
Merci encore pour ton exemple qui m'a permis de m'appuyer sur quelque chose d'éprouvé et qui m'a permis de faire des tests par ailleurs.
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
17 oct. 2005 à 16:42
Bonjour à tous,
après un break de quelques mois je reprends mon projet de transformer mon apllication classique en service windows xp(je travaille avec c++Builder 5 pro ou delphi 5 et Interbase 6.0 monoposte);j'ai donc repris texto ton projet qui fonctionne parfaitement ; maintenant j'ai rajouté un composant TDatabase sur la fiche et rallongé la tempo avant la fermeture du programme calculatrice (j'ai mis 10s) dans le timer 1 je me connecte à la Base (connected->true) puis me déconnecte dans le timer 2 :lorsque mon composant tdatabse pointe sur une table paradox je n'ai pas de soucis, en revanche lorsqu'il pointe sur une table interbase cela plante ; je ne comprends vraiment pas pourquoi (mon mot de passe et identifiant sont évidemment valides et j'ai mis loginprompt à false) en mode conception je me connecte et déconnecte normalement : aurais-tu une petite idée,un début d'explication,une adresse,un lien qui me permette de comprendre ce phénomène.
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
8 sept. 2005 à 16:48
nikel, merci PascalZ !
cs_PascalZ Messages postés 13 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 4 juillet 2012
8 sept. 2005 à 16:33
salut,

moi pour la description, je la change directement dans la base de registre :

Reg := TRegIniFile.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('SYSTEM\CurrentControlSet\Services',False);
Reg.WriteString('LE_NOM_DE_MON_SERVICE','Description','la description de mon service');
Reg.CloseKey;
finally
FreeAndNil(Reg);
end;
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
8 sept. 2005 à 16:22
Salut tout le monde !
Merci GAUDETM pour ta source et ton explication :o)
c'est tout simplement génial. Petite question au sujet du service toujours, est t'il possible de mettre une description ?

Car tu dis comment changer le Nom, le StartType, mais pas la Description. Et j'avoue avoir cherché dans l'appli, puis sur le net, à croire que c'est toi qui a inventé le service windows. Je t'implore oohhh grand GAUDETM livre nous le secret de ton savoir lol. Et encore merci ....
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
21 juil. 2005 à 09:10
@Didier44

encore une chose, pour te faciliter la vie, cree un programme win32 et execute dedans ce ke tu veux, puis une application service qui demarrera ton application principale en arriere plan, beaucoup de programmes fonctionnent de cette facon.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
21 juil. 2005 à 09:07
@Didier44

mettre ton code dans OnStart peut causer des problemes avec un service...
regarde bien mon code, tu verras que le 1er timer commence a s'executer apres 3 secondes du demarrage du service (pour etre sure que le service a demarré)
essaye de faire pareil. faut bidouiller, car la tu ne travailles pas dans une application win32 normale!

tu poses trop de questions sans vouloir savoir le pourquoi, tu veux juste savoir le comment.
je te conseil de documenter et de savoir comment windows fonctionne, t'auras toutes les reponses que tu cherches.
je ne pense pas etre un pro windows, donc je ne me permet pas de t'expliquer.
du coup, pourquoi mon code fonctionne et pas le tient?

perso j'ai reussi a me connecter a des bases externes et des bases via ODBC, et jamais eu de probleme.
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
20 juil. 2005 à 18:43
j'ai repris ton projet et ai simplemnt ajourté un objet TDatabase sur la fiche Tservice et dans ton instruction j'ai rajouté l'instruction:
DataBase1.Connected:=true;
Et là j'obtiens l'erreur 1067(le processus s'est arreté inopinément: en fait il n'arrive pas à "ouvrir" la base) lorsque je lance le Service !! Le code ne peut pas être plus court mais je ne comprends pas pourquoi j'obtiens cette erreur
L'objet TDataBase pointe sur une base interbase (version 7.5) en monoposte ; la propriété connecte est à false en conception (j'ai essayé de la passer à true pour vérifier le bon parametrage de mon Objet.)
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
19 juil. 2005 à 20:31
bonjour ,
je n'arrive toujours pas à trouver ma solution pour l'utilisation d'une database dans une apllication service ;est-ce que tu peux jeter un coup d'oeil sur mon micro-projet; je sais qiue ton temps est compté mais là vraiment je craque et ne voit pas d'issue ; j'ai essayé de contacter team-b qui me mène en bateau (avez-vous essayé ceci,cela et au bout du compte je n'avance pas).le projet est vraiment très très court (je tente d'ouvrir un composant TDataBase dasn l'instruction onstart du Tservice ,j'ajoute que je manipule les composants TdataBase depouis pas mal de temps et n'ai jamis rencontré ce type de problème.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
14 juil. 2005 à 09:40
@Didier44

ben je dirai qu'il y'a un probleme dans ton code...
essaye avec une application normale pour voir, si le probleme perciste revois ton code
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
13 juil. 2005 à 19:45
Encore merci GAUDETM de m'accorder un peu de temps
mais je n'arrive décidément pas à me connecter à une database dans mon application service
J'ai essayé de passer la propriété interactive à true et cela n'a rien changé; tout se passe comme si la base n"était pas ouverte et pourtant je l'ai effectué dans la routine afterinstall (j'ai également essayé beforeinstall sans résultart)
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
13 juil. 2005 à 09:02
@Didier44

verifie que ton application service:
Interactive => TRUE pour communiquer avec le bureau

je pense ke ton probleme vient de la
cs_Didier44 Messages postés 6 Date d'inscription mardi 5 juillet 2005 Statut Membre Dernière intervention 19 octobre 2005
12 juil. 2005 à 14:30
Bonjour,
Tout d'abord félicitation pour cet exemple qui a le mérite de nous mettre rapidement le pied à l'étrier dans l'apprentissage et la manipulation d'une application service. Je rencontre toutefois une difficulté lorsque j'essaie dans cette application d'accéder à une base Interbase , je m'explique:
Dans l'application Service j'ai programmé une interruption toutes les 3 secondes dans laquelle je déclenche un bip me permettant de vérifier que mon appli tourne ; dans cette interruption j'ouvre une table et je la referme aussi sec ; j'ai donc utilisé un composant TDataBase et TTable ; je me connecte à ma database apres l'install de l'application service . Que se passe-t-il ? lors de l'installation de l'appli (appli /install) celle-ci tourne normalement jusqu'à ce que je valide par Ok ; ensuite je fait dans la gestion des service et je démarre mon service et la tout se passe normalement , j'obtiens un bip et puis plus rien alors que je devrai retrouver ce bip toutes les 3 secondes ?WHYYYYY ; j'ajoute que si j'arrete ce service cela répons apparemment correctement el lorsque je desinstalle l'appli se met à refonctionner normalement jusqu'à ce que j'appuie sur la touche OK
cdetre Messages postés 6 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 7 octobre 2013
9 avril 2005 à 15:05
Je te rassure tout de suite, ce n'est pas un service de flicage ou quoi que ce soit d'autre, mais bien une aide aux utilisateurs du reseau que je souhaite mettre en place. J'explique,

Il s'agit d'envoyer par mail des fichiers PDF fabriqués par les utilisateurs, pour le moment ils doivent les envoyer eux mêmes après les avoir fabriqué, ils se trompent régulièrement dans les adresses ou en oublient. A présent ils suffira de les copier dans un dossier pour qu'ils soient traités correctement.

Pour résoudre mon souci, j'ai utilisé un array comme tu le préconisais, ça fonctionne.
Merci
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
9 avril 2005 à 12:05
@cdetre

ya pa de koi

concernant ta question, avant toute chose, le service doit demarrer avec les droits asequats pour kil puisse naviguer sur un systeme de fichier NTFS.
l'ideal c'est de demarrer le service avec les droits system.
pour le composant, utilise plutot un listarray ou un array carremen
je ne t'aiderai pa d'avantage car j'ai l'impression ke ton service a un but pa trop amical...

@++
cdetre Messages postés 6 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 7 octobre 2013
8 avril 2005 à 17:07
Bonjour à tous,

Grace à ce source, j'ai enfin compris quelque chose aux services sous Delphi, merci.
Je cherche à developper un service qui permettrait de scruter un repertoire, de detecter la présence de fichiers dans ce repertoire et de les envoyer par mail.
Je comptais utliser un Tfilelistbox mais cenu-ci ne sont pas admis dans un TService.
Comment faire ? Quel composant utiliser ?

Merci d'avance
Christophe
falves Messages postés 1 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 9 janvier 2005
9 janv. 2005 à 12:04
Hello,

Super, ça marche très bien.
Quelqu'un sait-il comment, via un service, obtenir, sous XP :
* Le nom de la session en cours ?
* l'évenement d'ouverture de session ?
* l'évenement d'ouverture de session ?

merci d'avance.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
14 déc. 2004 à 22:01
@wismerhill40

peut etre c'est à cause des sockets...
je ne connais pas ce code d'erreur donc je ne pourrai pas te dire

sinon verifie bien que tes connections sont fermées avant que le service se termine
et si t'utilise un accès base de donnée, deconnecte toi de la base à l'avance...

enfin, fo faire des tests quoi
wismerhill40 Messages postés 11 Date d'inscription mardi 14 janvier 2003 Statut Membre Dernière intervention 10 mai 2007 1
14 déc. 2004 à 16:09
je viens de lire tout ce qui est ecrit sur cette page et moi j'ai autre probleme (comme beaucoup d'autre je pense) a savoir que lorsque j'arrete ma machine j'ai un message d'erreur du type
"nom_du_service" erreur d'application exception logiciel inconnue blablabla 0x77e7e592".
sachant que dans mon service j'ai un client TCP. J'ai essaye de voir avec l'appartenance au groupe tcp mais ca ne change rien. Je me demande si le service ne s'arrete pas apres le service TCP. Mais jai essaye de l'arrete avant. Soit il s'arrete avant mais cela n'a rien change, soit il s'arrete toujours quand il veut. Si quelqu'un a une solution quelquonque cela m'aiderai car ca fait 6 mois que je suis dessus sans rien regler !!!
Pitier ...
Deufr Messages postés 4 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 1 novembre 2004
1 nov. 2004 à 22:48
:p
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
1 nov. 2004 à 21:26
@Deufr

biensure que tu peux
t'achetes la version pro ou entreprise de Delphi ;)
Deufr Messages postés 4 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 1 novembre 2004
29 oct. 2004 à 00:15
Ben ouai mais si je suis "competent" et que je veux ecrire un freeware utilisant un service, j'ai pas le droit à Delphi ?

Bon... si une âme charitable peut m'envoyer le .pas et le .dcu ça me ferait bien plaisir (demander mon mail en perso)
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
29 oct. 2004 à 00:00
@ Deufr

je ne suis pas certain que la version perso de Delphi a le support Services NT...

et ce n'est pas des rats chez Borland, ils estiment tout simplement que la personne ayant la version perso n'est pas un developpeur professionel, et donc la création de Services NT n'est pas censé etre à sa portée.

biensure, le sens de "developpeur professionel" ne veut en aucun cas dire que la personne est incompetente, mais plutot que la personne ne fait pas partie qu'une societé (et donc n'est pas censé avoir le besoin de creer des Services NT, car ce genre d'applications sont reservées aux logiciels à utilisation spécifique et orientées entreprises...)
Deufr Messages postés 4 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 1 novembre 2004
28 oct. 2004 à 18:30
Heu... ça compile pas... manque svcmgr.dcu

Ne me dites pas que ces rats de chez Borland on viré ça de l'edition perso ?
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
13 sept. 2004 à 18:26
@aknoth

ben peut etre tout simplement le programe attend la fermeture des sockets (fo voir o nivo de ton code)

ça ne vient pas du service lui meme mais des composants INDY.
tu dois avoir des fonctions thread pour le TCP, et essaye de forcer la fermeture des connections manuellement

à part ça je ne suis pas dans ton code, donc je suis celui qui est le moin qualifié à te répondre ;)
aknoth Messages postés 2 Date d'inscription jeudi 9 septembre 2004 Statut Membre Dernière intervention 13 septembre 2004
13 sept. 2004 à 15:16
Merci pour ta réponse. Voici quelques précisions: le service démarre bien en tant que sytem et je n'ai aucun code dans OnCloseQuery. J'ai du code dans OnClose mais rien qui empêche la fermeture du programme.

La raison pour laquelle je demandais si ça pouvais être les sockets est que j'ai testé en créant seulement une connexion entre un client et mon serveur et ça bloque.

Les connexions entre le serveur et les clients ne doivent PAS être coupées. Alors je me disais peut-être que windows essais de fermer ces connexions alors qu'elles sont toujours actives...

J'ai remarqué que quand on quitte une session, OnCloseQuery est appelé deux fois. Lorsque je n'ai auncun client, windows ferme la session normalement. Si j'ai un client connecté, OnCloseQuery n'est appelé qu'une fois...

Merci pour ton aide encore une fois c'est très apprécié!
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
9 sept. 2004 à 23:45
@aknoth

si j'ai bien comprit, windows bloque ou se met en attente à la fermeture de session...

à priori le probleme vient de ton application service (fo voir au nivo OnCloseQuery ça peut bloquer la fermeture du programe de là...)

puis verifies que ton service demarre en tand que SYSTEM et non pas un user normal de l'ordi

sinon fo regarder ds ton code (ça ne vient surrement pas des sockets car windows sait les fermer comme un grand ;) )
aknoth Messages postés 2 Date d'inscription jeudi 9 septembre 2004 Statut Membre Dernière intervention 13 septembre 2004
9 sept. 2004 à 21:07
Bonjour! Merci pour les explications, l'astuce mentionnée dans l'exemple m'a permis de régler un problème. J'aurais cependant une question qui ne porte pas sur l'exemple mais sur les services en général.

J'ai une application serveur qui a été modifiée en service puisque nous voulons que notre serveur soit disponible en tout temps, même si l'utilisateur change de session sur l'ordinateur où le programme est installé.

Ça fonctionne bien tant qu'aucun client n'est connecté, mais dès qu'un client se connecte au serveur, on ne peut plus changer la session. Est-ce à cause des sockets? De la connexion à la base de données? Bref qu'est-ce qui peut empêcher la fermeture d'une session?
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
1 juin 2004 à 20:29
@ PascalZ

ce né pa possible de le lancer avec l'utilisateur en cours, et ça pour des raisons de sécurité...

pour lancer un service Delphi avec un user et pass d'un compte NT, suffit de remplir les 2 champs proprietés du service:
"ServiceStartName" et "Password"

ds le 1er tu mets ".\Pascal" (si Pascal est le user en question)
ds le 2nd le pass de Pascal

PS: sans les guillemets, et noublie pas le .\ qui signifie le user sur cet ordi et non pas sur un domaine...
cs_PascalZ Messages postés 13 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 4 juillet 2012
1 juin 2004 à 07:57
Salut,
Moi j'ai un probleme que j'ai du mal a résoudre avec un Service.
Mon service doit me lancer le client mail (outlook dans mon cas) mais il me le lance depuis le compte system, donc je n'ai pas les boites aux lettres de l'utilisateur de la session en cours :(
J'ai regardé du coté de CreateProcessAsUser pour lancer le client mail, mais il faut fournir le mot de passe ! Est ce qu'il y a un moyen d'executer un processus depuis un service avec l'utilisateur de la session en cours ?
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
17 avril 2004 à 05:29
pour le faire en manuel, suffit ds Delphi, de choisir ds la section Proprieté du service, StartType = MANUAL
tu le mets à MANUAL, et donc au redemarrage le service ne demarrera pas automatiquement (tout seul)
à ce moment là pour le demarrer fo faire NET START...
et pour le tuer c'est NET STOP...

voili voilou ;)
Encore1ben Messages postés 68 Date d'inscription jeudi 19 septembre 2002 Statut Membre Dernière intervention 22 février 2008
17 avril 2004 à 02:56
vi vi, j'ai bien compris, amis j'ai du mal m'exprimer !
En fait, grâce à ta source, j'ai décidé de faire un chtit bout de programme (un exe) qui permet soit d'arrêter ou de démarrer le service d'affichage des messages (au lieu d'aller dans le panneau de config > outils d'admin> service>etc...) !! Mais voilà, quand la bécane, va rédémarrer le service va se relancer, donc il faut que je puisse passer le démarrage en manuel, et ce depuis mon ex (pour eviter que la personne le fasse de façon manuel) ! Donc, il faut que je le fasse par ligne de commande, comme je l'ai fais pour arrêter ou démarrer le service...

Je sais pas si je suis encore clair là ??? Ou alors, j'ai rien compris à ce que tu viens de me dire ?? (ce qui es fort possible aussi lol )

Merci pour ta réponse aussii rapide d'ailleurs ;)
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
17 avril 2004 à 02:27
@ Encore1ben

c'est dans les proprietés du service qu'il faut changer:

StartType => AUTO/MANUAL... (pour demarrer automatiquement avec l'ordi)...

la proprieté StartType du Service sous delphi te permet de choisir le mode de demarrage lors de son installe ;)

voila
Encore1ben Messages postés 68 Date d'inscription jeudi 19 septembre 2002 Statut Membre Dernière intervention 22 février 2008
17 avril 2004 à 02:03
Salut,

Tout d'abord, Bravo car :
- ta source est extrêment bien expliquée
- et parce que le sujet est très très peu traité sur internet.

Mais voilà, j'ai quand même une peite question, j'ai tout bien compris, mais je n'arrive malheureusement pas à changer les options des services. Par exemple, avec un bouton, je lance un service en utilisant la commande "Net Start 'nom du service", mais je n'arrive pas à changer son 'starttype' pour le mettre par exemple en 'manuel'.. j'ai pourtant tout essayé, genre net start service /startype=auto, ou net /starttype=auto service... Bref, si tu pouvais m'aider ???

Sinon, Bravo et encore Merci (allez un chtit Dix, parce que c vraiment du bon boulot!)
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
5 avril 2004 à 23:30
@ ffert
ton problème est en qcq sorte classique, surtout sur les serveurs NT4.
en effet c'est un defaut dans l'heritage ds NT4, par contre comprehensible aussi, pour empecher l'execution de codes "malicieux" indirectement?
car à priori quand on est loggé en user, l'administrateur aurait établie au préalable la gestion de la sécurité locale, et donc si la sécurité des users a bien etait faite, un user normal ne pourrait pas lancer des actions qui touchent l'OS...

par defaut le service crée par Delphi, à son installation, s'attribue les droit du user SYSTEM (privilèges supérieurs à admin) et s'execute sous le user SYSTEM pour effectué ses taches (et donc a les droits absolues, meme pour detruire l'OS, que d'ailleur admin ne peut pas faire directement)

PS: le service Delphi peut etre configuré pour utiliser un nom d'utilisateur et un mot de passe pour son installation (voir proprietés du service)

maintenant concernant ton problème, essaye de le créer comme j'ai indiqué (je travail sour Delphi 7, et donc je ne sais pas si les version antérieurs possèdent les meme proprietés) et essaye d'executer tes actions.
je viens de tester sous XP et 2000 Advanced Server le meme service pour effectuer des actions sur le OS (install et désinstall d'un pilote système) et ça ne m'a pas causé de problème de droits ou de privilèges.
je n'ai pas NT d'installé pour tester, donc je ne pourrai pas prédire.
mais logiquement si sous NT le service demarre en tand que SYSTEM, je ne pense pas que l'OS refusera ces actions.

Cordialement,
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
5 avril 2004 à 21:53
Encore merci pour cette source trés pertinente....

Je la trouve claire et détaillée. J'ai toutefois un petit bémol à rajouté car j'ai déjà réalisé des services.... Ils m'ont posé pas mal de problèmes. C'était sous Windows NT4. Le service tournait donc en permanence. Mais j'avais un problème de droits. Je lui demandais d'exécuter une action. Si on étais loggé en admin : pas de problème, si l'on étais loggé en User : pas d'action !!!! Alors qu'on arrivait bien à lancer l'action manuellement sous les 2 log ????

Je pense qu'il y a un problème d'héritage des droits utilisateurs. Mais je ne suis pas arrivé à résoudre ce problème... Si quelqu'un connaît la solution... Si quelqu'un de compétent pouvais m'expliquer... ça me permettrait de me coucher moins bête ce soir...

Merci...
à+
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
5 avril 2004 à 09:23
Merci à toi ;)
Je suis hyper occupé dans mon travail, et surtout que je travail en freelance pour la créations de site, donc mon temps est en or :)
si je travail, je vis pas lol
n'est-ce pas la vie est belle? lol

sinon j'ai une chose à rajoutter concernant le demarrage du service, au lieu d'aller ds le gestionnaire de service et de l'installer, on peut le faire via le shell de winNT (invite de commande).
donc il suffit d'utiliser la syntaxe suivante:
NET START "NOM DE VOTRE SERVICE"

pour arreter un service:
NET STOP "NOM DE VOTRE SERVICE"

dans le cas de la source que j'ai fourni, le service s'apelle:
"DELPHI FR SERVICE"
donc pour le demarrer:
NET START "DELPHI FR SERVICE"

voili voilou
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
4 avril 2004 à 10:54
Félicitations pour ce premier article !
Voilà un sujet qui semble mystérieux pour beaucoup et que tu rends abordable avec une grande limpidité.

Que cet article soit le premier d'une longue lignée !
Merci beaucoup.
Rejoignez-nous