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 :

CreateProcessAsUser & requireadmin


Sujet :

Windows

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Par défaut CreateProcessAsUser & requireadmin
    Bonjour,

    j'ai un service Windows de mise-à-jour de mon logiciel qui doit exécuter des setups qu'il télécharge pour l'utilisateur courant. J'utilise donc la fonction "CreateProcessAsUser()" afin que mes setups soient lancés sur le bureau de l'utilisateur. Cela fonctionne correctement avec les setups qui ne requièrent pas les droits d'admin mais cela échoue si le setup en question stipule qu'il a besoin des droits admin pour s'exécuter.

    Mon souhait serait que le setup ayant besoin des droits admin fasse prompter l'UAC comme si l'utilisateur l'avait lancé lui-même.

    Je connais une solution mais elle n'est pas très sexy : lancer une application avec le CreateProcessAsUser(), qui elle va se charger de lancer le setup sur le bureau courant avec un ShellExecute().

    Savez-vous s'il ne serait pas tout simplement possible de faire en sorte que le CreateProcessAsUser() se comporte de la même manière pour les exe avec et sans option "requireadim" dans leur manifest ?

    Merci d'avance pour votre aide.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Essaie de regarder du côté de SHCreateProcessAsUserW ou CreateProcessWithLogonW, peut-être...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Essaie de regarder du côté de SHCreateProcessAsUserW ou CreateProcessWithLogonW, peut-être...
    Oui mais en fait non:
    - SHCreateProcessAsUserW n'est plus disponible à partir d'XP.
    - CreateProcessWithLogonW nécessite de connaître le nom d'utilisateur et son mot de passe.

    Merci d'avoir essayé

  4. #4
    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
    N'y a-t-il pas aussi un truc du genre CreateProcessWithTokenW()?
    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.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    N'y a-t-il pas aussi un truc du genre CreateProcessWithTokenW()?
    J'ai tenté avec cette fonction aussi, mais j'ai toujours un échec au lancement car l'utilisateur n'a pas les droits admin.

    J'ai trouvé divers contournements mais cela m'étonne de ne vraiment pas pouvoir faire une sorte de shellexecuteasuser() à partir d'un service...ça sent le moisi !

    Merci quand même !

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pataguillon Voir le message
    J'ai trouvé divers contournements mais cela m'étonne de ne vraiment pas pouvoir faire une sorte de shellexecuteasuser() à partir d'un service...ça sent le moisi !
    Sans que l'utilisateur n'entre au moins une fois son MdP ? Non, c'est plutôt normal en fait...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Sans que l'utilisateur n'entre au moins une fois son MdP ? Non, c'est plutôt normal en fait...
    Et c'est exactement ça que je voudrais...je voudrais lancer un exécutable en tant qu'utilisateur courant à partir d'un processus système et que l'UAC demande l'élévation des droits si cet exécutable en a besoin (d'après son fichier manifest).

    Avec la fonction "CreateProcessWithTokenW()" ça peut fonctionner mais il faut forcer l'affichage de la fenêtre qui demande le mot de passe admin et les passer à la fonction en paramètres, alors que moi je voudrai laisser ce travail de prompt à l'UAC (qui est là pour ça).

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pataguillon Voir le message
    Et c'est exactement ça que je voudrais...je voudrais lancer un exécutable en tant qu'utilisateur courant à partir d'un processus système et que l'UAC demande l'élévation des droits si cet exécutable en a besoin (d'après son fichier manifest).
    Le souci, c'est que tu cherches, en tant qu'administrateur et/ou compte système, à te "faire passer" pour un utilisateur. Or, ce n'est pas permis de façon normale : tu peux certes outrepasser pas mal de limites (notamment en tant qu'admin), mais quand même pas jusqu'à l'usurpation d'identité, et encore moins depuis un service !!
    Il serait étonnant que tu puisses le faire sans que l'utilisateur n'aie à entrer au moins une fois son MdP, qui pourra par contre être "mémorisé" ensuite (enfin, c'est le token qui le sera)...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Le souci, c'est que tu cherches, en tant qu'administrateur et/ou compte système, à te "faire passer" pour un utilisateur. Or, ce n'est pas permis de façon normale : tu peux certes outrepasser pas mal de limites (notamment en tant qu'admin), mais quand même pas jusqu'à l'usurpation d'identité, et encore moins depuis un service !!
    Il serait étonnant que tu puisses le faire sans que l'utilisateur n'aie à entrer au moins une fois son MdP, qui pourra par contre être "mémorisé" ensuite (enfin, c'est le token qui le sera)...
    Excusez-moi, je me suis mal exprimé :
    quand je dis "c'est exactement ce que je voudrais", je veux parler du fait que l'utilisateur soit obligé de taper son mot de passe si nécessaire...c'est-à-dire que mon service lance un exécutable sur le compte de l'utilisateur courant et que cela engendre un prompt UAC à l'utilisateur pour qu'il accepte (ou pas) l'exécution. D'où l'idée d'un "shellExecuteAsUser()"...ça devrait être possible, reste à trouver comment

  10. #10
    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
    Il est POSSIBLE à un processus serveur possédant le privilège Impersonate de récupérer l'identité du processus client, si ce client communique avec un tube nommé. ImpersonateNamedPipeClient() permet de faire ça pour le thread courant. Mais ensuite, je ne vois pas comment transposer cela à la création d'un nouveau processus...
    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.

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