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

  1. #1
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    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 : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    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 du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    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 : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    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 du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais CreateProcessAsUser() n'échoue pas, c'est ça ?

    Un truc qui pourrait être intéressant, c'est savoir si un programme minimal passe: Un programme sans la CRT, qui se contente d'ouvrir un fichier dans un dossier public et y écrire un truc, le tout avec juste l'API Win32.
    Ainsi, on saurait si le problème est dû à une DLL particulière ou si absolument aucun programme ne peut marcher...
    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.

  12. #12
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    Par défaut
    C'est bien ça, CreateProcessAsUser n'échoue pas.
    Pensez-vous qu'un processus simple sans dépendance dynamique particulière et ne faisant pas d'appels à l'API Windows serait lancé sans être considéré comme un Service depuis mon Service?

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    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?
    En quoi c'est génant ?
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Vilmir Voir le message
    C'est bien ça, CreateProcessAsUser n'échoue pas.
    Pensez-vous qu'un processus simple sans dépendance dynamique particulière et ne faisant pas d'appels à l'API Windows serait lancé sans être considéré comme un Service depuis mon Service?
    Non, je pensais qu'un processus simple sand dépendance dynamique particulière et ne faisant pas d'appels à la CRT (mais pouvant faire appel à l'API Windows) pourrait peut-être être lancé avec un token dont le type de Logon n'est pas celui d'un service (notamment un LOGON32_LOGON_BATCH).

    Edit: Vérifie aussi que les droits concernant le type de logon choisi sont bien là...
    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.

  15. #15
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    En quoi c'est génant ?
    Si je livre mon service dans cet état, je pré-suppose que les administrateurs Windows qui vont l'utiliser n'auront pas de problèmes à donner le droit "Log On As a Service" à tous les futurs utilisateurs de mon outils.
    Je ne connais pas assez leurs contraintes de sécurités et l'implication de ceci pour prendre la décision de le faire

    Edit: Hors-sujet, bien vu la signature Médinoc

    Edit2:
    Je vais tester de remplacer mon process de traitement par un process simple pour voir.
    Au niveau des privilèges, notre compte de Test a ce qu'il faut.

  16. #16
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 50
    Points
    50
    Par défaut
    Je viens d'avoir un ingénieur technique de chez Microsoft. Il m'a confirmé que pour le niveau de service que j'attendais j'utilisais la bonne méthode, et que je n'avais aucune solution technique pour éviter d'avoir à donner le privilège "Logon As a Service" aux identités clients.
    Merci pour votre temps, à bientôt.

+ 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