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 :

Pb avec CreateProcessAsUser dans un cas bien precis


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut Pb avec CreateProcessAsUser dans un cas bien precis
    Bonjour a tous,

    Je developpe actuellement un service non-interactive qui execute un programme externe avec la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function RunInteractive(prog_filename: String; sessionID: Cardinal): boolean;
    var hToken: THandle;
      si: _STARTUPINFOA;
      pi: _PROCESS_INFORMATION;
    begin
      ZeroMemory(@si, SizeOf(si));
      si.cb := SizeOf(si);
      SI.lpDesktop := nil;
      if WTSQueryUserToken(sessionID, hToken)
      then  begin
              if CreateProcessAsUser(hToken, nil, PChar(prog_filename), nil, nil, False, 0, nil, PChar(ExtractFilePath(prog_filename)), si, pi)
              then  result := true
              else result := false;
            end
      else  Begin
              result := false;
            End;
      CloseHandle(hToken);
    end;
    Prenons le cas ou il y a 2 utilsateurs dans le domaine (domain\user1 et domain\user2) :
    1. pour etre clean, j'installe le service et redemarre le systeme
    2. si j'ouvre la session avec user1: le service lance bien le programme externe dont la form s'affiche a l'ecran
    3.je ferme cette session et j'ouvre la session avec user2: le service lance bien le programme externe

    Ca c'etait le cas le plus commun et si je le repete x fois, il n'ya jamais de probleme.

    Maintenant prenons le cas suivant:
    1. si j'ouvre la session avec le user1: le service lance bien le programme externe
    2.Au lieu de fermer la session cette fois ci je change d'utilisateur avec le user2: le service lance bien le programme externe mais cette fois ci la form par défaut ne s'affiche pas et un message d'erreur apparait : Systeme Error Code 5, Accès refusé.

    Il semblerait donc que quelque chose ne vas pas mais j'aimerais savoir quoi et je ne vois pas du tout. Merci d'avance pour vos reponses

  2. #2
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Quel OS ? Il me semble que pour XP, la premier utilisateur connecté rentre dans une session 0, où le service windows et la forme coexistent dans la même session. Si un deuxième utilisateur vient à se connecter, il est dans une session 1 alors que le service windows lance une application dans la session 0.

    Si tu inverses l'ordre des users, logiquement tu devrais rencontré le même problème.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    1.la les tests s'effectue sous Seven.
    2.que les users ont des droits differents ou pas , le probleme reste le meme.

    Pour repondre a votre question, en fait chaque user lance le program externe en prenant en compte l'iD de session active grace a la focntion WTSQueryUserToken(sessionID, hToken), htoken etant la variable de sortie qui est utilisée ensuite par createProcessAsUser.
    La variable SessionID passee en parametre est quand a elle est correcte (je l'ai verifiee en la journalisant)

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 921
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 921
    Par défaut
    Je regarderais plutôt au niveau de l'application elle-même. N'ouvres-tu pas un fichier en exclusif (donc verrouillé par la première instance) ?

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,

    Pour avoir travaillé sur le sujet (un lanceur d'applications avec ce genre de commandes) et compte tenu de l'erreur rencontrée, je "plussoie" aux propos d'Andnotor et je regarderais plutôt du coté de l'application appelée : ne cherche t-elle pas à utiliser une ressource (fichier, etc) commune et/ou unique de manière exclusive ?

    --
    Philippe.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    En effet, vous avez tous le 2 raisons car j'ai résolu le probleme en modifiant le code de l'application appelée. A ma grande suprise, il s'agissait d'un fonction de la librairie jcl qui causait le probleme (uniquement dans le cas d'un "fast user swithing")!!! La fonction se nomme GetInteractiveUsername et se trouve dans le fichier JclSecurity.pas. J'avais besoin de cette fonction pour recuperer a la fois le domaine et le login de l'utilisateur qui a ouvert la session windows. J'ai contourné le pb en récupérant ces valeurs grace aux variables d'environnements du système.

Discussions similaires

  1. Réponses: 18
    Dernier message: 26/06/2011, 15h21
  2. Utilisation de static char * dans un cas precis
    Par student_ dans le forum Débuter
    Réponses: 4
    Dernier message: 09/01/2010, 22h24
  3. [Malloc - Free] Comment bien les utiliser dans ce cas ?
    Par DOC doc doc dans le forum Débuter
    Réponses: 6
    Dernier message: 06/08/2007, 14h39
  4. Réponses: 2
    Dernier message: 18/04/2007, 21h32
  5. Réponses: 15
    Dernier message: 06/04/2006, 12h05

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