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 :

[C++] CreateProcess : accès refusé (code 5)


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [C++] CreateProcess : accès refusé (code 5)
    Bonjour,

    Je lance sous Windows 7 en C++ une application (toto.exe par exemple) via la commande :
    Code c++ : 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
    20
    // Start the child process.
    PROCESS_INFORMATION pi = { 0 };
    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);
     
    if(!CreateProcessA(
                NULL,
                "MonFichier.exe",        // Command line
                NULL,           // Process handle not inheritable
                NULL,           // Thread handle not inheritable
                TRUE,          // Set handle inheritance to TRUE
                CREATE_BREAKAWAY_FROM_JOB,
                NULL,           // Use parent's environment block
                NULL,           // Use parent's starting directory
                &si,            // Pointer to STARTUPINFO structure
                &pi)           // Pointer to PROCESS_INFORMATION structure
            )
    {
    // error
    }
    Le problème est que j'ai le code de retour 5 de la fonction CreateProcessA qui veut dire que je n'ai pas les droits d'accès.
    En effet, MonFichier.exe est situé dans un répertoire qui n'a pas les droits d'écriture (seulement en lecture et exécution).

    Ce que je ne comprends pas, c'est que si je la lance via le code suivant :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    int ret = system("MonAppli.Exe");
    et bien ca marche !

    Il faut noter que je lance mon application C++ (toto.exe) en mode admin à partir d'une session non admin.

    Je dois absolument utiliser la fonction CreateProcess...

    Avez vous une idée ?

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Le répertoire courant est-il bien le bon? L'administrateur en question a-t-il bien accès au fichier? etc.

    Des fonctions comme GetFileSecurity() peuvent aider à trouver la source du problème...
    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.

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le répertoire courant est-il bien le bon? L'administrateur en question a-t-il bien accès au fichier? etc.

    Des fonctions comme GetFileSecurity() peuvent aider à trouver la source du problème...
    Oui c'est le bon répertoire car system("MonAppli.Exe"); fonctionne... De même en admin, j'ai bien les droits mais je regarderais quand même ce WE la fonction GetFileSecurity()
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Je suis un peu à cours d'idées, mais je sais au moins que system() cherche dans le PATH (vu qu'il passe par CMD.EXE), et je ne crois pas que CreateProcess() le fasse. Donc s'il y a un MonFichier.exe dans le path auquel tu as accès, il pourrait peut-être prendre le pas sur l'autre.
    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
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    ce serait pas un problème de littéral ? essaye peut-être avec L"C:\\repertoire\\executable.exe"

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Bonsoir,

    Après investigation : c'est le flag CREATE_BREAKAWAY_FROM_JOB qui me provoque le code d'erreur 5 de CreateProcess

    Je m'explique : sur mon PC, j'ai un compte admin et un compte user (qui n'a pas les droits admin).

    Je suis sur le compte user :
    Quand j'ouvre un cmd.exe et que j’exécute mon programme qui lui même va lancer un autre programme => ca marche !
    Quand j'ouvre un cmd.exe "en tant qu'autre utilisateur" et que je me log avec le compte admin => ca marche pas !!


    Si je supprime le flag CREATE_BREAKAWAY_FROM_JOB alors les deux cas fonctionnent mais je ne peux pas faire ca car je dois associer mon processus à un Job afin de pouvoir supprimer tous les processus enfants si le processus parent est killé.

    Voilà, je n'y comprends pas grand chose

    Pour info, le code complet :
    Code c++ : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    // Start the child process.
            PROCESS_INFORMATION pi = { 0 };
            STARTUPINFO si = { 0 };
            si.cb = sizeof(si);
     
            HANDLE ghJob = CreateJobObject( NULL, NULL); // GLOBAL
            if( ghJob == NULL)
            {
                LError << "CreateJobObject failed " << GetLastError();
                return -1;
            }
            else
            {
                JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = {{{{ 0 }}}};
     
                // Configure all child processes associated with the job to terminate when the
                jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
                if( 0 == SetInformationJobObject( ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
                {
                    CloseHandle(ghJob);
                    LError << "SetInformationJobObject failed " << GetLastError();
                    return -1;
                }
            }
     
            if(!CreateProcessA(
                NULL,
                (char*)processName.c_str(),        // Command line
                NULL,           // Process handle not inheritable
                NULL,           // Thread handle not inheritable
                TRUE,          // Set handle inheritance to TRUE
                CREATE_BREAKAWAY_FROM_JOB,
                //CREATE_NEW_CONSOLE,
                NULL,           // Use parent's environment block
                NULL,           // Use parent's starting directory
                &si,            // Pointer to STARTUPINFO structure
                &pi)           // Pointer to PROCESS_INFORMATION structure
            )
            {
                LError << "CreateProcess failed " << GetLastError();
                return -1;
            }
     
            if(ghJob)
            {
                if(0 == AssignProcessToJobObject( ghJob, pi.hProcess))
                {
                    LWarning << "AssignProcessToJobObject failed " << GetLastError();
                    //return -1;
                }
            }
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

Discussions similaires

  1. [IIS 7.5] Acces refusé code 403 .
    Par marcandre dans le forum IIS
    Réponses: 1
    Dernier message: 23/04/2012, 14h32
  2. Accès refusé jquery.js Code 0
    Par maxwell374 dans le forum jQuery
    Réponses: 4
    Dernier message: 26/10/2010, 13h40
  3. [DCOM] Accès refusé au lancement du programme à distance
    Par raoulmania dans le forum Web & réseau
    Réponses: 7
    Dernier message: 22/06/2005, 13h01
  4. Kerio / Composants Indy / Accès refusé
    Par ixpe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/09/2004, 13h38
  5. acces refusé
    Par pram dans le forum XMLRAD
    Réponses: 3
    Dernier message: 02/04/2003, 15h55

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