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

Windows Discussion :

Comment récupérer le code de sortie d'un service ?


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Par défaut Comment récupérer le code de sortie d'un service ?
    Bonjour, et meilleurs vœux pour cette nouvelle année.

    Je développe un service à l'aide de Visual Studio 2008, en VB.net.

    Il s'agit d'un service qui exécute diverses actions sur lancement avec passage de paramètres. J'utilise pour celà, par le biais d'un formulaire tier également développé en VB.net, la classe ServiceController, qui me permet de lancer mon service en lui passant des arguments via un tableau ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public ServiceAlias As New System.ServiceProcess.ServiceController
    TabArgs(0) = "verifie"
    TabArgs(1) = "quelquechose"
    ServiceAlias.MachineName = "."
    ServiceAlias.ServiceName = "Alias"
    ServiceAlias.Start(TabArgs)
    Mon service, avec un Select Case, fait des tests, et je souhaite renvoyer un code de sortie selon le résultat de mon test. Pour celà, j'utilise la procédure OnStop() du service.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Protected Overrides Sub OnStop()
            Me.ExitCode = 1250
        End Sub
    Ma question est la suivante : comment faire pour obtenir ce code de sortie depuis mon application qui a lancé le service, sachant que la classe ServiceController n'inclut pas la propriété ExitCode ?

    Pour information, lorsque je lance mon service à l'aide de SC, ça me retourne ceci :
    ---------------------
    SERVICE_NAME: alias
    TYPE : 10 WIN32_OWN_PROCESS
    STATE : 2 START_PENDING
    (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE : 0 (0x0)
    SERVICE_EXIT_CODE : 0 (0x0)

    CHECKPOINT : 0x0
    WAIT_HINT : 0x7d0
    PID : 1444
    FLAGS :
    ---------------------


    Je vous remercie par avance de vos réponses.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ce que tu veux faire n'a pas de sens car la philosophie d'un service est qu'il ne s'arrête jamais (sauf crash, action utilisateur et arrêt de la machine) donc c'est probablement pour cela qu'il n'existe pas de moyen pour récupérer le code de fin de service.

    Il va falloir trouver un autre moyen.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Par défaut
    En effet, j'aurais préféré que le service reste lancé perpétuellement, mais le lancement avec paramètres est le seul moyen que j'ai trouvé pour transmettre des données au service.

    Par exemple, si je souhaite vérifier l'existence d'un fichier dans %WINDIR%\system32, répertoire auquel l'utilisateur lambda n'a pas les droits d'accès, je souhaite faire faire cette vérification par mon service fonctionnant sous le compte SYSTEM.

    Concrètement, j'envoie à mon service deux arguments :
    1) Quelle action ? => Tester l'existence
    2) Quelle donnée ? => Le fichier C:\WINDOWS\system32\calc.exe

    Le seul moyen que j'ai trouvé est donc le lancement avec paramètres, via la classe ServiceController.

    Il existe bien une méthode ExecuteCommands dans ctete même classe, mais on ne peut transmettre qu'un seul entier en paramètre.

    Je suis donc preneur d'une solution alternative pour pallier ce problème, sachant que mon application faisant appel au service est restreinte par les droits très limités de l'utilisateur qui la lance (pas le droit d'écrire dans le registre par exemple).

    Cordialement.

    Edit : j'ai consulté ça
    http://www.developpez.net/forums/d53...rvice-windows/
    et ça
    http://www.developpez.net/forums/d46...laircissement/
    sans succès :-(

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Une idée comme cela :
    Un service lancé en permanence qui écoute sur un pipe nommé et qui ne s'arrête jamais.
    Un programme utilisateur qui communique avec le service par le biais du pipe nommé et envoie des commandes au service.
    Le service reçoit les commandes, les exécute et retourne le résultat dans le pipe
    Le client reçoit le résultat dans le pipe et affiche/traite le résultat.

    A toi de définir maintenant le protocole entre le client et le service porté par le pipe.

    Attention aux droits sur le pipe, ils doivent être compatibles entre le service qui a des privilèges systeme et le client qui a priori a des droits restreints.

    Attention aussi à la sécurité, ce que tu veux faire permet à un utilisateur lambda d'e faire faire des choses avec des droits étendus et ce n'est pas forcémment une bonne idée, c'est comme cela qu'un utilisateur lambda peut devenir administrateur de la machine.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 19
    Par défaut
    Merci pour cette piste qui va me diriger vers de belles recherches, car j'ignore complètement ce concept de pipe (disons que je sais que c'est un tunnel bidirectionnel mais je l'ai toujours utilisé en environnement Linux pour faire communiquer deux programmes, par exemple ps aux | grep unprocessus, mais en développement, aucune idée !).

    Pour la sécurité, j'imagine effectivement que le risque est grand mais mon service a vraiment des fonctionnalités limitées, lesquelles sont de toutes façons imbriquées dans un Select Case.

    Je m'en vais rechercher un tuto pour les pipes :-)

    Merci !

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par CleM_71 Voir le message
    [...]Je m'en vais rechercher un tuto pour les pipes :-)
    Oui, les named pipes sont certainement adaptés à votre problématique. Un tutoriel vous aidera sans doute à démarrer rapidement.

    Vous avez aussi cette ressource Microsoft qu'il peut être utile de lire, si vous êtes en framework 3.x :

    http://msdn.microsoft.com/fr-fr/library/ms752253.aspx

    Bonne suite.

    'HTH

Discussions similaires

  1. [VB 2005] Comment récupérer un code dans une release
    Par Herlece dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/10/2007, 19h02
  2. Comment récupérer un code retour SFTP ?
    Par hervé94 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 28/08/2007, 20h45
  3. [C#]Comment récupérer le code d'une Exception ?
    Par joujoukinder dans le forum C#
    Réponses: 18
    Dernier message: 30/07/2007, 01h47
  4. Comment récupérer le code ASCII d'un caractère?
    Par Blue_Strike dans le forum Delphi
    Réponses: 6
    Dernier message: 04/05/2007, 00h38
  5. Réponses: 5
    Dernier message: 21/12/2004, 18h12

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