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 :

Soumettre un 'job' avec un autre compte


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 116
    Points
    116
    Par défaut Soumettre un 'job' avec un autre compte
    Bonjour,


    J'ai une question de sécurité à laquelle je ne trouve pas de réponse.
    Je travaille sur une application qui lance des traitements (applis, scripts, etc...).

    Actuellement l'application utilise la fonction LogonUser pour changer de session, ce qui impose à l'appli de pouvoir récupérer le mot de passe en clair de la session en question.

    Or, souhaitant me plugger à un annuaire (LDAP), afin de ne plus avoir à remplir les infos de comptes utilisateurs dans mon application, je me trouve coincé car je ne peux pas changer de session si je ne connais pas le mot de passe.
    Or dans les annuaires, les mots de passe étant hashés, il m'est impossible de retrouver le mot de passe clair.

    Donc ma question est la suivante: existe t il un moyen de changer de session sans mot de passe, comme on peut le faire sous unix en étant root ?

    J'ai vu sur la msdn qu'un service qui tourne en tant que 'Local system' et qui a le droit 'SE_IMPERSONATE_NAME' est censé pouvoir le faire (ça fonctionne d'ailleurs puisqu'il suffit de demander à un service de se lancer 'en tant que...'). Comment puis je reproduire ceci ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    "l'impersonnalisation", c'est le fait de prendre l'identité du demandeur d'un service, pas de ce faire passer pour lui.
    Si votre application doit être l'instigatrice d'une tâche, il faudra soit qu'il crée une session et donc connaisse le mot de passe, soit que le système la lance dans une session adéquate via la déclaration d'un service.
    S'il était possible de changer d'utilisateur sans restriction cela serait un énorme trois de sécurité.
    Si votre application n'est pas l'instigatrice des tache, soit elle est dans une session interactive avec un utilisateur, soit elle n'est pas ou n'a pas de session avec le bon user et cela est le cas typique d'un service avec impersonnalisation.
    Donc normalement, soit votre application est un service et donc utilisation de l'impersonnalisation, soit elle hérite de l'utilisateur courant (runas.exe ou raccourcis avec changement d'utilisateur peuvent cacher la création d'une session utilisateur), soit la demande d'un login-mot de passe est impérative.

  3. #3
    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 518
    Points
    41 518
    Par défaut
    L'impersonation ne permet pas de créer un nouveau process.
    Tu dois utiliser CreateProcessAsUser() (qui nécessite le privilège "Assign Primary Token", que seul LocalSystem possède), ou CreateProcessWithLogonW(), qui nécessite seulement que le service de connexion secondaire tourne.
    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.

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 116
    Points
    116
    Par défaut
    Je complète un peu ma description:

    Pour soumettre un job actuellement, j'ai trois étapes:
    1- J'appelle LogonUser pour récupérer un Handle du user concerné.
    2- J'appelle ImpersonateLoggedOnUser en lui passant le handle de manière à ce que le thread courant récupère le contexte
    3- J'appelle CreateProcessAsUser en lui passant ma commande et le même handle.

    Ceci fonctionne que l'appli tourne en service ou lancée à la main avec un compte local.

    bacelar: d'après ce que tu dis, je dois pouvoir, si mon appli tourne en tant que service, me passer de mot de passe ?
    Médinoc: que j'utilise l'un ou l'autre, dans tous les cas je dois passer par un logon quelque part, et donc donner un user et un mot de passe, c'est ça ?

  5. #5
    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 518
    Points
    41 518
    Par défaut
    Non, je dis que CreateProcessAsUser() devrait échouer si tu ne tournes pas en service en tant qu'utilisateur NT AUTHORITY\LocalSystem.
    Car par défaut, lui seul possède le privilège Assign Primary Token, nécessaire pour que CreateProcessAsUser() réussisse avec le token d'un autre utilisateur.

    Par contre, si tu a joué avec les privilèges avant, tu peux peut-être l'ajouter à d'autres utilisateurs que LocalSystem...
    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.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Quand on enregistre un service Windows, on peut lui assigner on compte utilisateur et donner son mot de passe une seule fois, au moment de l'enregistrement.
    C'est ainsi qu'IIS utilise toujours en compte avec le minimum de droit.
    Si l'identité de l'utilisateur ne change pas au cours du temps, cela serais l'option la plus naturelle.
    Si le compte utilisateur doit changer en cours d'utilisation, j'utiliserais l'impersonnalisation dans un service qui recevrait des requêtes des différents utilisateurs.

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 116
    Points
    116
    Par défaut
    bacelar: comme je l'ai dis dans mon dernier message, c'est déjà ce que je fais, et j'ai besoin du mot de passe pour le faire.

  8. #8
    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 518
    Points
    41 518
    Par défaut
    Sous Windows, je ne connais pas 36 moyens de changer de session sans mot de passe, et tous impliquent de le faire à la demande de l'utilisateur en question.

    Ça permet typiquement à un serveur de prendre l'identité d'un client connecté (en tubes nommés ou en DCOM) pour agir en son nom...
    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.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Vous n'avez pas besoin du mot de passe pour faire une "impersonnalisation".

  10. #10
    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 518
    Points
    41 518
    Par défaut
    Ça dépend sur quoi.
    • ImpersonateNamedPipeClient(), c'est comme je l'ai dit pour le client d'un serveur.
    • Avec DCOM, c'est parail.
    • Pour ImpersonateLoggedOnUser(), il te faut un jeton d'accès avec les bons droits dessus. Et pour obtenir ledit jeton, généralement on utilise LogonUser(), qui exige le mot de passe.
    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.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    "pour le client d'un serveur" -> c'est le seul cas d'"impersonnalisation"

  12. #12
    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 518
    Points
    41 518
    Par défaut
    Le seul cas normal d'impersonalisation, mais oui. C'est à ça que c'est censé servir, après tout.
    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.

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par bacelar Voir le message
    "pour le client d'un serveur" -> c'est le seul cas d'"impersonnalisation"
    Oui mais ce n'est pas cela que je veux faire.

  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 518
    Points
    41 518
    Par défaut
    Citation Envoyé par zifox Voir le message
    Oui mais ce n'est pas cela que je veux faire.
    Dans ce cas, j'ai bien peur que tu n'aies pas le choix: Mot de passe obligatoire.
    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 régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 116
    Points
    116
    Par défaut
    Ouaip, c'est ce que j'ai compris avec vos réponses... je suis bloqué !

Discussions similaires

  1. Code pour lancer un EXE avec un autre compte
    Par G-Orwell dans le forum C
    Réponses: 4
    Dernier message: 19/06/2013, 15h00
  2. Soumettre un job depuis un autre
    Par yoyo-tns dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/12/2012, 14h30
  3. Soumettre un job depuis un autre
    Par yoyo-tns dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 19/12/2012, 14h30
  4. pgadmin se connecter avec un autre compte
    Par mapmip dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/08/2010, 09h37
  5. Exécuter un programme avec un autre compte
    Par bossun dans le forum VBScript
    Réponses: 2
    Dernier message: 17/04/2008, 09h35

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