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 :

[XP PRO 32Bits] Impersonation dans un Windows Service


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut [XP PRO 32Bits] Impersonation dans un Windows Service
    Bonjour,

    Dans le cadre d'une structure Client - Server en C++, j'ai un serveur d'authentification qui :
    1) Vérifie l'identité du client via l'appel à LogonUser
    2) Lance un processus Serveur de traitement avec l'identité Windows du client grâce à CreateProcessAsUser avec le token précédemment obtenu par LogonUser

    Ce serveur d'authentification peut être démarré en tant que processus par un utilisateur ayant le privilège:
    Replace a process level token

    Tout se passe bien quand on s'en sert en tant que processus.

    Il peut aussi être démarré en tant que Service sous le compte Local Service. Et là le problème arrive.

    La phase 1 d'authentification se passe bien mais dans la phase 2, le processus fils crée via CreateProcessAsUser meurt tout de suite après son lancement.
    Les logs que j'ai pu obtenir (dans la douleur) sur l'exécution n'ont montré rien de pertinent.
    Le seul cas qui marche est pour les clients faisant partie du groupe Adminstrateurs local à la machine.
    J'ai essayé de donner tous les privilèges du groupe Administrateurs à un compte de Test ainsi que le Full Control sur les disques durs et la totalité de la base de registre et je n'ai pas obtenu de changements.

    Je ne vois pas quelles autres droits/privilèges je peux ajouter à mon compte de Test pour trouver ce qu'il lui manque pour que l'impersonation marche, des idées? :/

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    est ce que le droit "Ouvrir une session en tant que service" est accordé à l'utilisateur qui ne marche pas ?

    Et quelle est la valeur qui est passé à dwLogonType de LogonUser ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut
    Merci pour votre temps et votre attention tout d'abord.

    1) Le compte de Test a le droit "Logon as a Service"

    2) Valeur de dwLogonType dans le code serveur:

    LOGON32_LOGON_INTERACTIVE
    This logon type is intended for users who will be interactively using the computer, such as a user being logged on by a terminal server, remote shell, or similar process. This logon type has the additional expense of caching logon information for disconnected operations; therefore, it is inappropriate for some client/server applications, such as a mail server.

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    LOGON32_LOGON_INTERACTIVE

    De mémoire, il me semble que ce flag ne marche pas au sein d'un service.
    A vérifier !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut
    Merci pour l'info, je vais tester les différents flags sur mon service

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut
    Je viens de tester les flags et avec:
    LOGON32_LOGON_SERVICE

    Ca marche !!! merci beaucoup Vincent, vous venez de me faire gagner du temps

    Une dernière question: d'après la définition du flag qui fonctionne, je comprends que je demande à l'API un token capable de lancer un service.

    Ce token va me servir pour lancer un processus via CreateProcessAsUser depuis mon service d'Authentification. Cela veut-il dire que ce processus lancé sera lui aussi considéré comme un Service pendant son exécution?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    D'après la doc de LogonUser(), c'est fort possible.
    Si tu veux que ton programme ne soit pas considéré comme service, tu devrais peut-être essayer un truc du genre LOGON32_LOGON_BATCH...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut
    En effet ce serait la solution. Je l'ai testé, et le CreateProcessAsUser voit son fils échouer dès son début d'exécution.

    Je pense que la clef de ma problématique est de trouver un moyen pour:

    Depuis un Service, démarrer un processus avec un token utilisateur qui ne soit pas lancé en tant que Service.

    D'après ce que je comprends, CreateProcessAsUser lancé depuis un service crée un fils considéré comme un service, d'où la nécéssité de mon flag LOGON32_LOGON_SERVICE.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Le fils, il échoue avant le main(), ou il a le temps de logguer au moins un truc quelque part ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Par défaut
    Il échoue avant le premier log

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/01/2011, 18h38
  2. Timer dans un Windows Service
    Par Identifiant dans le forum C#
    Réponses: 5
    Dernier message: 26/05/2009, 15h28
  3. Réponses: 2
    Dernier message: 23/11/2007, 10h52
  4. comment ecrire du texte dans une window application
    Par gaut dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/07/2003, 10h23
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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