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

Langage Delphi Discussion :

Obtenir le statut d'un service


Sujet :

Langage Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut Obtenir le statut d'un service
    Bonjour

    Grâce à l’excellent Tuto https://delphi.developpez.com/faq/?p...es-services-NT je suis parvenu à trouver le statut d'un services sur Windows Seven (pas encore testé sur un autre OS).

    L'ennui est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConnectToServicesManager
    ne fonctionne que si l'application est exécutée en mode administrateur.

    Existe-t-il un moyen d’obtenir cette info sans élévation de privilège ?

    La raison est que dans certains cas, l'installeur d'une application qui contient Firebird installe bien le moteur de FB mais ne lance pas les services attenant. Je voudrais donc détecter ce cas pour informer clairement l'utilisateur de l'origine du problème.

    J'utilise Delphi 7.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 081
    Points
    41 081
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour une question de ce genre j'aurai tendance à utiliser les WMI. Impression renforcée par l'excellent WMI Delphi Code Creator
    Nom : Capture.PNG
Affichages : 217
Taille : 85,4 Ko

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    //-----------------------------------------------------------------------------------------------------
    //     This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.482
    //     http://code.google.com/p/wmi-delphi-code-creator/
    //     Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
    //     Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015 
    //----------------------------------------------------------------------------------------------------- 
    //
    //     LIABILITY DISCLAIMER
    //     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
    //     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
    //     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
    //
    //----------------------------------------------------------------------------------------------------
    program GetWMI_Info;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
     
     
     
    // CIM_Service est un élément logique qui contient les informations nécessaires 
    // pour représenter et gérer la fonctionnalité fournie par un périphérique et/ou 
    // une fonctionnalité logicielle. Un service est un objet de fonction général pour 
    // configurer et gérer l’implémentation de la fonctionnalité. Ce n’est pas une 
    // fonctionnalité en lui-même.
     
    procedure  GetCIM_ServiceInfo;
    const
      WbemUser            ='';
      WbemPassword        ='';
      WbemComputer        ='localhost';
      wbemFlagForwardOnly = $00000020;
      WQuery='Select Name,Started,StartMode,Status from CIM_Service Where started=true AND Name LIKE ''%Firebird%''';
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery(wQuery,'WQL',wbemFlagForwardOnly) ; 
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        Writeln(Format('Name         %s',[String(FWbemObject.Name)]));// String
        Writeln(Format('Started      %s',[String(FWbemObject.Started)]));// Boolean
        Writeln(Format('StartMode    %s',[String(FWbemObject.StartMode)]));// String
        Writeln(Format('Status       %s',[String(FWbemObject.Status)]));// String
     
        Writeln('');
        FWbemObject:=Unassigned;
      end;
    end;
     
     
    begin
     try
        CoInitialize(nil);
        try
          GetCIM_ServiceInfo;
        finally
          CoUninitialize;
        end;
     except
        on E:EOleException do
            Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
        on E:Exception do
            Writeln(E.Classname, ':', E.Message);
     end;
     Writeln('Press Enter to exit');
     Readln;      
    end.
    J'ai modifié le SQL dans le programme généré pour n'obtenir que la partie Firebird
    Reste quelques bémols :
    - Je ne sais pas si cette requête nécessite le privilège administrateur ou non
    - le WSQL est pauvre, je n'ai pas trouvé moyen de chercher dans une partie de valeur (dommage mettre juste quelque chose comme "Name CONTAINS 'Firebird'" aurait été plus facile

    [EDIT] j'avais oublié l'opérateur LIKE
    donc WQuery='Select Caption,Description,Name,Started,StartMode from CIM_Service Where started=true AND Name LIKE ''Firebird%'''; devrait répondre à mon bémol N°2

    [REDIT] J'ai testé le programme console (avec la 10.4), ne demande pas de privilège administrateur, le temps de réponse est long (mais c'est généralment le cas avec WSQL) mais c'est ok, comme sur ce poste j'ai la possibilité de lancer manuellement une version 4 de Firebird en sus, j'ai pu obtenir le résultat suivant
    Citation Envoyé par résultat
    Name FirebirdGuardianDefaultInstance
    Started True
    StartMode Auto
    Status OK

    Name FirebirdServerDefaultInstance
    Started True
    StartMode Manual
    Status OK

    Name FirebirdServerFirebird 4
    Started True
    StartMode Manual
    Status OK

    Press Enter to exit
    Ce qui lève le bémol n° 1

    YAPLUKA tester avec D7 (non installé sur ce poste), retirer la substantifique moëlle pour obtenir un code dans un programme VCL (en profiter pour mettre ça dans un thread ...)

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 336
    Points
    13 336
    Par défaut
    Et démarrer ce service par net start depuis l'installateur n'est pas envisageable ?

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Merci de vos contributions.
    Je testerai ça dans les jours qui viennent.
    Pour Andnotor : il s'agit plus de vérifier que l'installeur a effectivement installé les services que de démarrer le serveur FB.

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    si mon souvenir est bon, tu peux très bien interroger l'état d'un service sans être admin, car il suffit d'avoir l'accès SERVICE_QUERY_STATUS qui ne réclame pas les droits admin (contrairement à SERVICE_ALL_ACCESS utilisé dans la FAQ)

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 370
    Points : 3 144
    Points
    3 144
    Par défaut
    Bonjour frantzgac

    Est ce que tu pourrais me passer un morceau de ton code, car moi quand je veux utiliser la FAQ pour vérifier l'état d'un service, j'ai l'identificateur Handle_SCM non déclaré.
    et ça ne compile pas !

    j'ai pourtant WinSvc dans la clause Uses

    je suis sous W10 avec D7

    Merci
    A+
    Charly

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Bonjour Charly910

    Désolé je suis sorti du sujet ... et l'été est passé par là.

    J'ai développé mon test sous Delphi XE8 (je ne sais plus pourquoi au juste)
    Mais à l'exception d'un nom de variable accentué, il devrait compiler ou tout au moins, inspirer pour le reproduire sous D7.

    Tu peux le télécharger ici http://www.makhno.fr/temp/Services.zip

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 370
    Points : 3 144
    Points
    3 144
    Par défaut
    Merci Frantzgac

    A+
    Charly

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 081
    Points
    41 081
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par frantzgac Voir le message
    Désolé je suis sorti du sujet ... et l'été est passé par là.
    Moi aussi, j'avais complètement oublié. Avais-tu finalement utilisé les WMI ?

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    si mon souvenir est bon, tu peux très bien interroger l'état d'un service sans être admin, car il suffit d'avoir l'accès SERVICE_QUERY_STATUS qui ne réclame pas les droits admin (contrairement à SERVICE_ALL_ACCESS utilisé dans la FAQ)
    Bonjour

    En réalité c'est la fonction ConnectToServicesManager qui retourne false si l'application n'est pas exécutée en mode administrateur.

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Moi aussi, j'avais complètement oublié. Avais-tu finalement utilisé les WMI ?
    Non. J'en suis resté au tuto que j'ai cité en tête de sujet.
    Mais je ne connais pas WMI.
    J'ai trouvé ce tuto https://delphi.developpez.com/faq/?p...oduction-a-WMI
    Mais il me semble devoir déployer un peu de travail avant d'utiliser cet outil. De plus il devrait être exploité sur des postes de client qu'il faudrait donc configurer préalablement.

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 081
    Points
    41 081
    Billets dans le blog
    62
    Par défaut
    Quel déploiement ? non pas besoin.

    Je viens de retester une compilation avec Delphi 7 de mon code.

    Le seul reproche que je ferai c'est que WMI c'est lourd, le "SGBD du matériel" façon Microsoft c'est pas le pied (quand je pense qu'ils annonçaient le passage de tout ça en SQLite, il y a déjà 3 ou 4 ans )
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [AXIS] Obtenir le WSDL d'un service depuis le code ...
    Par webspeak dans le forum Services Web
    Réponses: 29
    Dernier message: 06/03/2011, 13h10
  2. obtenir le statut de chargement d'une page html
    Par deubelte dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/09/2008, 14h25
  3. probleme de remonter de statut d'un service
    Par balthior dans le forum VBScript
    Réponses: 6
    Dernier message: 18/12/2006, 08h56
  4. Connaitre le statut d'un service
    Par clementv dans le forum Administration système
    Réponses: 8
    Dernier message: 08/06/2006, 08h47
  5. [API] Comment obtenir le statut d'un lecteur de cdrom ?
    Par istice dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 07/02/2005, 19h02

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