IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Delphi-FMX_ Start a Windows service


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Delphi-FMX_ Start a Windows service
    Hello everyone,

    Somebody help me ...

    I am working on a function in Delphi 10.3 to start a service on Windows (10 to be more precise).

    My function is as follows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    use 
     Winapi.WinSvc, System.SysUtils;
     
    //=========================
    function StartWindowsService(const SceName: string): Boolean;
    var
      hSCM, hService: SC_Handle;
    begin
      Result := False;
      hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
      if hSCM <> 0 then
      begin
        hService := OpenService(hSCM, PChar(SceName), SERVICE_START or
          SERVICE_QUERY_STATUS);
        if hService <> 0 then
        begin
          if StartService(hService, 0, nil) then
            Result := True;
          CloseServiceHandle(hService);
        end;
        CloseServiceHandle(hSCM);
      end;
    end;

    At running I get this issue :
    [dcc32 Error] fn_Services.pas(78): E2033 The types of the original and formal VAR parameters must be identical
    .

    Please I need help to resolve this. thanks

  2. #2
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 109
    Points : 5 715
    Points
    5 715
    Par défaut
    Citation Envoyé par Steprawl Voir le message
    Hello everyone,

    Somebody help me ...

    I am working on a function in Delphi 10.3 to start a service on Windows (10 to be more precise).

    My function is as follows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    use 
     Winapi.WinSvc, System.SysUtils;
     
    //=========================
    function StartWindowsService(const SceName: string): Boolean;
    var
      hSCM, hService: SC_Handle;
    begin
      Result := False;
      hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
      if hSCM <> 0 then
      begin
        hService := OpenService(hSCM, PChar(SceName), SERVICE_START or
          SERVICE_QUERY_STATUS);
        if hService <> 0 then
        begin
          if StartService(hService, 0, nil) then
            Result := True;
          CloseServiceHandle(hService);
        end;
        CloseServiceHandle(hSCM);
      end;
    end;
    At running I get this issue :
    .

    Please I need help to resolve this. thanks
    Hi Steprawl it's not common to have question in english in this french forum, but you're wellcome

    Try this :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    function ServiceStart(const Name : string) : Boolean;
    var
        Handle  :   Cardinal;
        Service :   Cardinal;
        Temp    :   PChar;
    begin
        Result:=False;
        Handle:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
        Service:=OpenService(Handle,PChar(Name),SERVICE_ALL_ACCESS);
        if Service>0 then
        begin
            ControlService(Service,SERVICE_CONTROL_INTERROGATE,Status);
            if Status.dwCurrentState=SERVICE_PAUSED then
            begin
                ControlService(Service,SERVICE_CONTROL_CONTINUE,Status);
                Result:=True;
            end
            else if Status.dwCurrentState=SERVICE_STOPPED then
            begin
                Temp:='';
                StartService(Service,0,Temp);
                ControlService(Service,SERVICE_CONTROL_INTERROGATE,Status);
                Result:=True;
            end;
            CloseServiceHandle(Service);
        end;
        CloseServiceHandle(Handle);
    end;
    if your code compiles on 64 bits platform you must change Handle and Service from Cardinal to Int64

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Démarrer un service Windows
    Thank you very much sergio_is_back...

    J'ai carrément oublié que c'est un forum francophone. Toutes mes excuses.

    Jai éssayé ton code, ça ne marche toujour pas.

    Quand j'éssaie de récupérer les différentes sorties de ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Handle:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
        Service:=OpenService(Handle,PChar(Name),SERVICE_ALL_ACCESS);
    la sortie est toujours 0.

    j'ai utilisé ceci :
    SysErrorMessage(GetLastError);
    pour récupérer le dernier message d'erreur et voici ce que j'ai obtenue :
    La syntaxe du nom du fichier, du répertoire ou du volume est incorrecte
    Pourtant quand j'essaie de récupérer l'état du service avec le même nom de service, je n'ai pas de soucis.

    Je crois que le problème vient de Handle du Service qui retourne 0. Maintenant comment le résoudre ??
    J'ai essayé les différents droits d'accès sans succès...

    Je suis suspendu à vous les gars...

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 085
    Points : 41 044
    Points
    41 044
    Billets dans le blog
    62
    Par défaut
    Le tout est de savoir s'il s'agit d'une version moderne (>2008) de Delphi ou pas. Je pense que le PChar est coupable, j'y mettrais bien un PAnsiChar à la place
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Le tout est de savoir s'il s'agit d'une version moderne (>2008) de Delphi ou pas. Je pense que le PChar est coupable, j'y mettrais bien un PAnsiChar à la place
    Bonjour, SergioMaster. Merci pour l'aide apportée.

    Effectivement ma version est 10.3 (Rio).

    Toutefois avec le PChar en PAnsiChar retrourne une erreur d'incompatibilité de type PWideChar et PAnsiChar.
    Même quand j'utilise le PWideChar j'ai toujours l'erreur initiale qui est :
    La syntaxe du nom du fichier, du répertoire ou du volume est incorrecte

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 736
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 736
    Points : 13 268
    Points
    13 268
    Par défaut
    Citation Envoyé par Steprawl Voir le message
    [dcc32 Error] fn_Services.pas(78): E2033 The types of the original and formal VAR parameters must be identical
    Delphi traduit quasiment toujours les APIs qui attendent un pointeur par un paramètre var, ce qui rend impossible un appel avec nil et nous oblige à déclarer inutilement une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var Vectors :PChar := nil;
    if StartService(hService, 0, Vectors) then
    Citation Envoyé par Steprawl Voir le message
    la sortie est toujours 0.
    Ce qui n'est pas surprenant en ALL_ACCESS à moins que tu aies clairement fixé les droits (DACL) pour autoriser tous les utilisateurs à interagir avec le service, sinon access denied. Tu peux lancer l'app en admin pour contrôler.

    Citation Envoyé par Steprawl Voir le message
    La syntaxe du nom du fichier, du répertoire ou du volume est incorrecte
    C'est bien le nom du service et non le chemin vers l'exe, n'est-ce-pas ? / et \ ne sont pas autorisés.

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Delphi traduit quasiment toujours les APIs qui attendent un pointeur par un paramètre var, ce qui rend impossible un appel avec nil et nous oblige à déclarer inutilement une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var Vectors :PChar := nil;
    if StartService(hService, 0, Vectors) then

    Ce qui n'est pas surprenant en ALL_ACCESS à moins que tu aies clairement fixé les droits (DACL) pour autoriser tous les utilisateurs à interagir avec le service, sinon access denied. Tu peux lancer l'app en admin pour contrôler.


    C'est bien le nom du service et non le chemin vers l'exe, n'est-ce-pas ? / et \ ne sont pas autorisés.


    Merci Andnotor pour l'intervention.

    J'ai essayé différent mode d'accès au niveau des droits sans succès. J'ai lancé l'app en mode admin mais le problème reste le même.

    C'est bien le nom du service qui est passé en paramètre. Comme je l'ai dit plus haut avec le même nom du service j'arrive à récupérer le status du service.

    avec ce code je récupère facilement le status du service.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    function IsServiceRunning(const SceName: string): Boolean;
    var
      hSCM, hSvc: SC_Handle;
      SvcStatus: TServiceStatus;
    begin
      Result := False;
     
      hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
      if hSCM <> 0 then
      begin
        hSvc := OpenService(hSCM, PChar(SceName), SERVICE_QUERY_STATUS);
        tstError := IntToStr(hSvc); // ---------------
        if hSvc <> 0 then
        begin
          if QueryServiceStatus(hSvc, SvcStatus) then
          begin
            Result := (SvcStatus.dwCurrentState = SERVICE_RUNNING);
          end;
          CloseServiceHandle(hSvc);
        end;
     
        CloseServiceHandle(hSCM);
      end;
    end;
    j'ai essayé avec AnyDesk et MySQL80 avec succès. Mais démarrer un service arrêté c'est quasi impossible.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 736
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 736
    Points : 13 268
    Points
    13 268
    Par défaut
    Citation Envoyé par Steprawl Voir le message
    J'ai essayé différent mode d'accès au niveau des droits sans succès. J'ai lancé l'app en mode admin mais le problème reste le même.
    Plus surprenant au niveau admin même si ça peut lui être interdit aussi. Il faut vraiment contrôler les ACLs par sc.exe sdshow LeNomDuService. Tu trouveras ici une brève introduction sur le sujet.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 085
    Points : 41 044
    Points
    41 044
    Billets dans le blog
    62
    Par défaut
    Je ne sais si cela peut aider, mais j'ai vu un peu de 'littérature' sur le sujet d'un certain Muminjon sur le site Embarcadero.
    Son article démarrer/stopper etc. un service ne semble pas acessible directement, mais voici un point de départ.

    J'y ai découvert, sur les diverses images écrans de ce billet, qu'en VCL, il y avait une unité VCL.SvcMgr
    J'ai bien noté le FMX du titre, mais pas cherché à voir où elle pouvait être en FMX
    N.B. un handle FMX est différent d'un handle VCL ça joue peut-être

    Bonnes recherches
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 109
    Points : 5 715
    Points
    5 715
    Par défaut
    Citation Envoyé par Steprawl Voir le message
    Mais démarrer un service arrêté c'est quasi impossible.
    Non, le code que je t'ai passé fonctionne très bien, d'ailleurs je m'en sers dans plusieurs projets

    Si tu obtient 0 au niveau des variables Handle ou Service c'est que tu n'a pas les privilèges suffisants pour te connecter au Service Controler ou pour prendre le contrôle du service, voir le problème d'ACL évoqué par Andnotor plus haut

    Les ACL Windows sont un moyen pour empêcher l'utilisateur Lambda de faire n'importe quoi, par exemple d'arrêter ou démarrer des services qui sont vitaux pour le système
    De plus certains services systèmes ne sont pas directement accessibles dans une session même administrateur

    Il faudrait déjà nous dire quel service tu veux démarrer (son nom) et est ce que c'est un service que tu as développé toi même ?

    De plus si selon que le service est paramétré en "localsystem" ou pour un autre compte utilisateur les droits d'accès peuvent être différents également, il te faudra peut être demander une élévation de privilèges dans ton code avant de pouvoir accéder au Service Controler

    Il faut aussi nous indiquer comment il est paramétré : compte localsystem ou autre, démarrage auto ou manuel, ou auto différé, dépendances à d'autres services, etc...


    Concernant le problème du THandle évoqué par SergioMaster plus haut, sous Windows si l'on compile en 32 bits le THandle n'est plus ni moins qu'un Integer (entier 32 bits signé) et un Int64 si l'on compile en 64 bits...

    Selon ta plateforme cible tu peux choisir la bonne définition via une directive de compilation

  11. #11
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour à la communauté.

    merci pour vos diverses réactions et approche de solution qui me sont de grand intérêt.

    voici mon projet :
    Je fais un développement avec Delphi 10.3 FMX sous Windows 10.
    Mon objectif est de récupérer des informations depuis Arduino et le stocker sur la machine local.
    Je créerai plus tard des services personnalisés pour vérifier des états de mon IoT qui sera afficher dans un dashboard.
    La partie qui actuellement me cause problème est précisément la gestion des services de windows.
    j'ai une unité qui regroupe tout ce qui est fonction ou procédure devant traiter des services windows.
    avec le code suivant je récupère sans difficulté l'état (SERVICE_RUNNING) de n'importe quel service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    uses Winapi.WinSvc;
     
    function IsServiceRunning(const SceName: string): Boolean;
    var
      hSCM, hSvc: SC_Handle;
      SvcStatus: TServiceStatus;
    begin
      Result := False;
     
      hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
      if hSCM <> 0 then
      begin
        hSvc := OpenService(hSCM, PChar(SceName), SERVICE_QUERY_STATUS);
        tstError := IntToStr(hSvc); // ---------------
        if hSvc <> 0 then
        begin
          if QueryServiceStatus(hSvc, SvcStatus) then
          begin
            Result := (SvcStatus.dwCurrentState = SERVICE_RUNNING);
          end;
          CloseServiceHandle(hSvc);
        end;
     
        CloseServiceHandle(hSCM);
      end;
    end;

    J'ai testé ce code avec les services suivants : AnyDesk, MySQL80, Netlogon, Dnscache et d'autre encore.

    A la dernière modification, j'utilise le code ci pour essayer le démarrage du service (les mêmes où j'avais tester l'état).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    function ServiceStart(const Name: string): Boolean;
    var
      Handle, Service: Cardinal;
      Temp: PChar;
      Status: TServiceStatus;
    begin
      Result := False;
      // SC_MANAGER_ALL_ACCESS  SERVICE_ALL_ACCESS   or SERVICE_QUERY_STATUS
      Handle := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
      Service := OpenService(Handle, PChar(Name), SERVICE_START or
        SERVICE_QUERY_STATUS);
     
      tstvaleur := IntToStr(Service); // Get Service Handle info (Global var)
      tstvaleur2 := IntToStr(Handle); // Get SCManager Handle info
     
      if Service > 0 then
      begin
        ControlService(Service, SERVICE_CONTROL_INTERROGATE, Status);
        if Status.dwCurrentState = SERVICE_PAUSED then
        begin
          ControlService(Service, SERVICE_CONTROL_CONTINUE, Status);
          Result := True;
        end
        else if Status.dwCurrentState = SERVICE_STOPPED then
        begin
          Temp := '';
          StartService(Service, 0, Temp);
          ControlService(Service, SERVICE_CONTROL_INTERROGATE, Status);
          Result := True;
        end;
        CloseServiceHandle(Service);
      end
      else
      begin
        tstError := SysErrorMessage(GetLastError);
      end;
      CloseServiceHandle(Handle);
    end;
    Toutefois, je vais continuer par explorer vos sources et vous revenir dès que j'ai du nouveau.

  12. #12
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Plus surprenant au niveau admin même si ça peut lui être interdit aussi. Il faut vraiment contrôler les ACLs par sc.exe sdshow LeNomDuService. Tu trouveras ici une brève introduction sur le sujet.
    Merci Andnotor pour ton aide.

    Voici ce que j'ai eu pour le service AnyDesk et MySQL80
    D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 736
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 736
    Points : 13 268
    Points
    13 268
    Par défaut
    Donc tu as la réponse à ta question : l'utilisateur (IU) n'a pas les droits suffisants pour démarrer/arrêter ces services. tstError doit retourner accès refusé.

    De là tu as deux possibilités :

    • soit modifier les droits sur tous ces services. Pas top puisqu'ils seront peut-être resetés à leur prochaine mise à jour ;
    • soit créer ton propre service (qui tournera sous le compte SYSTEM) auquel tu enverras des commandes et qui se chargera de ces actions.

  14. #14
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 73
    Points : 130
    Points
    130
    Par défaut
    j'ai essayé avec AnyDesk et MySQL80 avec succès. Mais démarrer un service arrêté c'est quasi impossible
    Il faut activer le service avant de le lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    procedure ServiceCheckConfig(HService: THandle);
    var
      Sz:DWORD;
      Buff: array of byte;
      P: PQueryServiceConfig;
    begin
         Sz:= 0;
         QueryServiceConfig(HService, nil, 0, Sz) ;
         Setlength(Buff, Sz);
         P := @Buff[0];
         if QueryServiceConfig(HService,  P, Sz, Sz) then
          if P.dwStartType = SERVICE_DISABLED then
          begin
            ChangeServiceConfig(
            HService,
            SERVICE_NO_CHANGE,
            SERVICE_DEMAND_START,
            SERVICE_NO_CHANGE,
            0, 0, 0, 0, 0, 0, 0) ;
         end;
    end;
     
    function ServiceStart(Name: string): Boolean;
    var
      H,  Service: THandle;
      Status: TServiceStatus;
    begin
      Result := False;
      H := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      Service := OpenService(H , PChar(Name), SERVICE_ALL_ACCESS);
      if Service > 0 then
      begin
          ServiceCheckConfig(Service); // passage de désactivé à manuel
          StartService(Service, 0, PChar(nil^));
          CloseServiceHandle(Service);
      end;
      CloseServiceHandle(H);
    end;

  15. #15
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 109
    Points : 5 715
    Points
    5 715
    Par défaut
    Citation Envoyé par Volid Voir le message
    Il faut activer le service avant de le lancer
    Normalement, sauf cas exceptionnel (mon service WsUpdate par exemple) les services sont activés et sont soit en manuel, en automatique ou automatique différé

    Désactiver un service n'a de sens que si l'on ne veut plus l'utiliser
    D'autre part il n'a pas les droit d'accès au service, donc même s'il était désactivé, il n'aura pas les droits pour le réactiver, sans réclamer dans son code une élévation de privilèges

    Voir un sujet qui traite de ce problème ici avec Delphi : https://stackoverflow.com/questions/...on-when-needed

Discussions similaires

  1. Windows Service Demarre et Arrête sans rien faire
    Par Bobafett dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/02/2007, 17h32
  2. [Aide][Delphi 7] Initiation aux WEB Services
    Par diden138 dans le forum Delphi
    Réponses: 9
    Dernier message: 25/02/2007, 20h21
  3. problème avec BDE delphi 3 et serveur windows 2003
    Par korntex5 dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/07/2006, 22h58
  4. [Delphi 2005 Personal] Créer un service NT
    Par dorian833 dans le forum EDI
    Réponses: 26
    Dernier message: 29/08/2005, 14h15
  5. [C#] [Windows service] Rendre Word Visible ?
    Par chris92 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/07/2004, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo