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

C++Builder Discussion :

Arrêter un service Windows


Sujet :

C++Builder

  1. #1
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut Arrêter un service Windows
    Je souhaite arrêter un service avec le code trouvé sur ce site
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SERVICE_STATUS OpenServStatus;
    SC_HANDLE  schandle, Fservice;
    // Arrête le service "Mises à jour automatiques"
    	schandle=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    CodeErreur = GetLastError();
    	Fservice=OpenService(schandle, "\"Mises à jour automatiques\"", SERVICE_QUERY_STATUS|SERVICE_START|SERVICE_STOP);
    CodeErreur = GetLastError();
    Le premier CodeErreur renvoie bien 0 mais le dernier CodeErreur renvoie 1060 c'est-à-dire "Le service spécifié n'existe pas en tant que service installé".
    Vous vous doutez bien que si je pose la question, c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Net Stop "Mises à jour automatiques"
    dans une fenêtre de commandes fonctionne tout a fait correctement.

    Quelqu'un peut-il m'expliquer ? Ou y aurait-il dans BC2006 quelque chose de plus simple ?

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Altau
    Je ne sais pas si tu a vu ce tuto de CGI sur le site

  3. #3
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Oui, oui, Blondelle, c'est bien pour ça que je pose la question : qu'y a-t-il de particulier pour que mon code ne fonctionne pas ?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Le code de CGI pour desinstaller un 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
     
    Voyons brièvement sa désinstallation. Elle s'effectue avec la fonction DeleteService après avoir ouvert le service avec OpenService. 
    #include "Windows.h"
    #include "Winsvc.h"
    int main()
    {
        SC_HANDLE hSCManager;
        SC_HANDLE hServ;
        hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
     
        hServ=OpenService(hSCManager,"MonService",SERVICE_ALL_ACCESS);
        DeleteService(hServ);
        CloseServiceHandle(hServ);
        CloseServiceHandle(hSCManager);
        return 0;
    }
    ton code differe a partir d'ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fservice=OpenService(schandle, "\"Mises à jour automatiques\"", SERVICE_QUERY_STATUS|SERVICE_START|SERVICE_STOP);
    CodeErreur = GetLastError();
    j'ai aussi trouve un lien sur un site asiatique

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    L'arreter temporairement ou définitivement ou le désinstaller ?

  6. #6
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Il s'agit ici de l'arrêter, et, après avoir exécuté une action particulière, le redémarrer.
    Il n'est pas question de le désinstaller.
    Ce qui m'interpelle, c'est qu'avant-même que je fasse quoi que ce soit, la fonction OpenService échoue (dès la 4ème ligne de code que Blondelle nous montre). Bien sûr, j'ai aussi bien essayé le paramètre "\"Mises à jour automatiques\"" que "Mises à jour automatiques".

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Le service dont je crois que tu parles se nomme : wuauserv

    "Mises à jour automatiques" est son nom complet mais pas le nom du service.

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour Altau,

    l'api OpenService n'accepte pas les backslash
    essaie simplement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fservice=OpenService(schandle, "Mises à jour automatiques", SERVICE_QUERY_STATUS|SERVICE_START|SERVICE_STOP
    vérifie également que le nom de l'executable de ton service soit
    égal à "Mises à jour automatiques.exe"

    l'utilisation de "net" fonctionne avec le nom complet du service qui est souvent différent du nom du service

    exemple:

    Nom complet :Atheros Configuration Service
    Nom du service :ACS
    Exe: ACS.exe

    L'api OpenService demande en paramètre le nom du service et non le nom complet


    cordialement

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut DjmSoftware
    Je vais poser une question peut etre bete, peut on recuperer le nom d'un service avec un utilitaire tel que " WinSight de BCB " ou " Spy++ de Visual C++ "

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut Blondelle,
    Winsigth ou Spy ne donne des indiquations que sur les messages windows échangés par les différentes applications
    il est plus simple d'utiliser le service control Manager ou d'utiliser la fonction "net start "
    cordialement

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    cmd

    tasklist /svc

    à droite tu auras les noms exacts des services

    net stop AudioSrv pour stopper le service audio

  12. #12
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    J'ai bien essayé aussi avec "wuauserv" comme paramètre mais ça ne lui plaît pas non plus.
    Toutefois le message est différent (mais n'étant pas devant la machine, je ne me rappelle pas ni son numéro ni son libellé). Je crois qu'il était question d'un problème de "class".

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par DjmSoftware
    vérifie également que le nom de l'executable de ton service soit égal à "Mises à jour automatiques.exe"
    Le nom d'un service n'est pas le nom de l'executable

    Citation Envoyé par Altau
    J'ai bien essayé aussi avec "wuauserv" comme paramètre mais ça ne lui plaît pas non plus.
    Il faudrait éffectivement un peu plus de précision.

  14. #14
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Le service Mises à jour automatiques est un service tout ce qu'il y a de plus standard dans Windows.

    - Mises à jour automatiques est le "nom complet"
    - wuauserv est le "nom du service"
    - C:\WINDOWS\system32\svchost.exe -k netsvcs est le "chemin d'accès des fichiers exécutables"

    Voilà, j'ai tout dit !

  15. #15
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    J'ai réussi à faire tourner le code suivant dans BCB 5 :
    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
    DWORD CodeErreur;
    SERVICE_STATUS OpenServStatus;
    SC_HANDLE  schandle, Fservice;
    // Arrête le service "Mises à jour automatiques"
      schandle=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
      Fservice=OpenService(schandle, "wuauserv",
                                    SERVICE_QUERY_STATUS|SERVICE_START|SERVICE_STOP);
    CodeErreur = GetLastError();
      ControlService(Fservice, SERVICE_CONTROL_STOP, &OpenServStatus);
     
    // Exécute le MSI
      ShellExecute(Application->Handle, "open", "msiexec.exe", parametres, NULL, SW_SHOWDEFAULT);
     
    // Démarre le service "Mises à jour automatiques"
      StartService(Fservice,NULL,NULL);
    Je retenterai ce soir avec BCB 2006 mais quelque chose m'échappe.

    En tout cas, merci à tous pour vos conseils.

  16. #16
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour Altau,
    ton code est parfaitement fonctionnel n'oublie pas de fermer les handles ouverts à l'aide de l'API CloseServiceHandle(Handle);
    cordialement

  17. #17
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    si tu veut avoir aussi des renseignements sur les services, tu peut regarder dans la BDR.
    Il doit bien y en avoir d'autres mais j'ai pas chercher.

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root

    la valeur "DeviceDesc" sont les commentaire dans "services.msc" etc..

    A++

  18. #18
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour Altau
    Le code ci-dessous te permettra de travailler directement avec le nom complet 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     void  __fastcall TForm10::ProcessServices(char* szDisplayServiceName)
     {
       SERVICE_STATUS OpenServStatus;
       SC_HANDLE  schandle=NULL, Fservice=NULL;
       bool resu=false;
       const MaxLen=255;
       char szDisplayName[MaxLen];
       char szServiceName[MaxLen];
       strcpy(szDisplayName,szDisplayServiceName);
       DWORD cchBuffer=MaxLen;
    // Arrête le service "Mises à jour automatiques"
      schandle=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
      if(schandle)
      {
    	   resu=GetServiceKeyName(schandle,
    							  szDisplayName,
    							  szServiceName,
    							  &cchBuffer);
    	  if(resu)
    	  {
    		Fservice=OpenService(schandle,
    							 szServiceName,
    							 SERVICE_QUERY_STATUS|SERVICE_START|SERVICE_STOP);
    		if (Fservice)
    		{
    		   ControlService(Fservice, SERVICE_CONTROL_STOP, &OpenServStatus);
    		  // Exécute le MSI
    		  //  ShellExecute(Application->Handle, "open", "msiexec.exe", parametres, NULL, SW_SHOWDEFAULT);
    		  // Démarre le service "Mises à jour automatiques"
    		 if(!StartService(Fservice,NULL,NULL))
    		 {
    		  CloseServiceHandle(Fservice);
    		  CloseServiceHandle(schandle);
    		  RaiseLastOSError();
    		 }
    		 else
    		   CloseServiceHandle(Fservice);
    		}
    		else
    		 {
    		  CloseServiceHandle(schandle);
    		  RaiseLastOSError();
    		 }
    	   }
       CloseServiceHandle(schandle);
      }
     }
    ce service est contrôlé par le process svchost il est par contre possible que la demande d'arrêt du service provoque une erreur, lors d'un accès concurrent entre ton application et svchost

    Cordialement

  19. #19
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut [Résolu]Arrêter un service Windows
    Eh bien ça tourne nickel après compil sous BCB 2006.
    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/12/2006, 22h41
  2. Arrêter un service Windows XP et le redémarrer chaque matin
    Par beegees dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 30/09/2005, 11h25
  3. Démarrer et arrêter un service windows
    Par dvarrel dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 28/05/2005, 22h02
  4. [VB6]Arreter un service windows
    Par bouboussjunior dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/10/2004, 17h03
  5. [C#] Icône, barre des tâches et Service Windows
    Par SErhio dans le forum Windows Forms
    Réponses: 17
    Dernier message: 03/09/2004, 12h56

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