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

API, COM et SDKs Delphi Discussion :

Problèmes avec les services NT/Windows 2000


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 31
    Points : 23
    Points
    23
    Par défaut Problèmes avec les services NT/Windows 2000
    Bonjour,

    Cela fait 2 jours que j'essaye de trouver la solution à mon problème !

    J'ai un service NT/Windows 2000 développé avec Delphi. Tant que que j'utilise des ressources fichiers en local pour la lecture et l'écriture tout se passe bien. Mais dès que j'accède au réseau, j'ai des problèmes. Même si je mets à la conception dans le "ServiceStartName" et le "password" du service un login et un mot de passe valides pour accéder au réseau, ça ne marche pas.

    De plus mon objectif est de pourvoir installer le service en tant que compte local et le démarrer ensuite avec un compte accédant au réseau à partir du gestionnaire de services Windows NT.

    Mon programme repose sur l'exemple fourni par l'aide Delphi avec le lancement à partir du gestionnaire OnStart du service, d'un thread avec une boucle et un sleepex au sein de celle ci et une procédure qui va interroger périodiquement un chemin réseau pour détecter la présence de nouveaux fichiers.

    J'ai diverses erreurs telles que la boucle du thread qui ne tourne qu'une fois (probablement la variable Terminated se retrouvant à false) . quand j'essaye de changer le login à parir du gestionnaire de services j'ai une errreur 1058 : "Le service ne peut être démarré parce qu'il est désactivé ou qu'aucun périphérique ne lui est associé" ou encore l'erreur 1053 : "Le service n'a pas répondu assez vite à la demande de lancement ou de contôle"

    Pour résumer : comment prendre en compte et à partir de quels gestionnaires du service (OnStart, OnExecute), l'attribution d'un login réseau valide (à la conception ou à la mise à jour par le gestionnaire de services Windows) pour que mon service lance le thread de façon à accéder au réseau sans erreur ?

    J'ai essayé avec OnStart mais ça n'a pas l'air de marcher.

    Merci à l'âme charitable qui pourra me dépanner.

  2. #2
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut !
    Ton problème est clairement un problème de droit Windows.

    Si tu souhaites accéder à des ressources réseau, il te faut un compte authorisé. Attention pas un simple compte utilisateur, mais un compte ayant reçu le privilège "ouvrir une session en tant que service".
    Pour que le compte obtienne ce privilège, il y a plusieurs axes, en fonction du type de l'infrastructure utilisée.
    Si tu es dans un domaine avec gestion centralisée des stratégies etc..., ton administrateur système peux créer un groupe spécifique et affecté à ton poste hébergeant le service une GPO approprié (Dans la GPO, il faut que le champ : "Configuration ordinateur\Paramètres Windows\Paramètres de sécurité\Stratégies locales\attribution des droits utilisateurs\Ouvrir une session en tant que service" contienne alors le groupe contenant ton "compte de service")
    Si tu n'as pas de gestion centralisée, tu peux, soit effectuer le paramétrage citée si dessus directement dans la GPO du poste, soit dans le gestionnaire des services, tu modifie les paramètre de connecxion avec le compte que tu souhaites utiliser, puis, tu applique, tu devrais voir apparaître un message du type : "le compte xxx viens de recevoir le privilège 'ouvrir une session en tant que service'".

    Maintenant, dans un service que que j'ai réalisé en delphi, je passais le compte et le password en paramètre lors de l'installation, et je les affectait à "ServiceStartName" et "Password" dans l'événement "ServiceBeforeInstall". Cela fonctionnait très bien.

    Dis nous si cela t'aide.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup de ta réponse,

    Je suis désolé de ce message, car en fait j'étais sur la bonne voie, celle que tu indiques concernant les droits appropriés d'accès au réseau. De plus ton message m'a apporté des précisions intéressantes sur la gestion des utilisateurs.

    Mon problème ne venait pas de mon compte utilisateur qui me permettait d'accèder aux ressources réseau, mais d'un bug dans une procédure appelée par le thread de mon service qui l'empéchait d'une part d'accéder au réseau et générait un dysfonctionnement du programme.

    J'ai affiné le trace du service dans un fichier texte de débogage et j'ai fini par trouver et corriger ce bug.

    En effet, losqu'on a un bon login à la conception, à beforeinstall (je n'avais pas encore abordé cette dernière possibilité), au démarrage ou au rédémarrage du service on accède aux ressources réseau sans problème.

    Pour résumer je créee un Thread à partir de la métode ServiceStart du servcie et lance un Thread.Terminate à partir de la méthode ServiceStop (je le rappelle, j'ai repris l'exemple de service avec création de thread à partir de l'aide de Delphi sur TServcie -rubrique utilisation de TService).

    Le thread lance un boucle dans la méthode Execute :
    While not Terminated do begin
    MaProcedure // Lecture et écriture de fichiers sur le réseau
    End;

    Quand j'arrête le service la méthode ServiceStop arrête le thread (Terminated passé à False). Je peux ainsi changer de compte utilisateur dans le panneau des services de Windows et lui attribuer ce compte, le redémarrer et par conséquence le Thread est recréé jusqu'à l'arrêt suivant du service.

    Maintenant je vais approfondir la notion de pause de mon thread avec sleepex(temps). Avec sleepex mon processus se met en pause le temps indiqué. Je compte mettre un sleepex d'une heure et pouvoir par un événement "réveiller" le thread et le sorir du sleepex. Si tu as une idée pour le réveil du thread elle est la bienvenue. Dès que j'ai une solution je te tiens au courant.

    A bientôt

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    Je ne ais pas si cela fonctionne via réseau mais il existe une fonction permettant de surveiller le contenu d'un répertoire (ce qui semble être le cas ici).

    Il s'agit de la fonction ReadDirectoryChangesW() dont un très bonne exemple est présent dans la section sources delphi de ce site

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/08/2010, 16h21
  2. Problème avec les tâches planifiées windows
    Par arnaudperfect dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 19/02/2010, 11h44
  3. Problème avec les MFC de windows
    Par tiagocerqueira dans le forum MFC
    Réponses: 3
    Dernier message: 02/02/2010, 12h30
  4. Problèmes avec les Services Intenet windows(IIS)
    Par mikawell3000 dans le forum C#
    Réponses: 1
    Dernier message: 26/07/2007, 12h55
  5. Problème avec les Thèmes de Windows
    Par virgul dans le forum Windows XP
    Réponses: 3
    Dernier message: 04/07/2007, 12h59

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