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

  1. #1
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    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 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 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
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    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 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
    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 éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

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

  6. #6
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    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 !

  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 518
    Points
    41 518
    Par défaut
    Si j'ai bien compris, ça veut dire que ton processus "père" est dans un job, un job qui n'autorise pas le "breakaway".
    Why is my process in a Job if I didn't put it there?
    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
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    Bonjour,

    Pour mieux expliquer le problème, j'ai fais une petite vidéo rapide en montrant exactement ce que je fais.
    Je suis sur une session USER dans la vidéo (non admin) avec des droits restreints.

    Le lien :
    http://codeanalysis.fr/bug.avi (taille 10 Mo)

    En gros, sur la console administrateur, le programme (test.exe) qui lance un autre programme (toto.exe) avec CreateProcess ne fonctionne pas...
    C'est le monde à l'envers pourtant la console indique bien dans son titre (en haut à gauche) que je suis administrateur. Je me suis juste loggé différemment.

    Si je supprime le flag CREATE_BREAKAWAY_FROM_JOB ca marche dans les deux cas mais je ne peux plus assigner le process à un Job (et j'en ai besoin )

    Le code source complet du programme :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #include <iostream>
    #include <dirent.h>
    #include <windows.h>
    #include <winbase.h>
    #define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000
    #define CREATE_PRESERVE_CODE_AUTH_LEVEL 0x02000000
     
    using namespace std;
     
    int main(int argc, char** argv)
    {
        int res = 0;
     
        // C'est un répertoire où se situe le fichier exe que je veux lancer mais à vous de le changer
        res = chdir("C:\\Program Files (x86)\\test_hello world\\bin");
        if (res != 0)
        {
            cout << "error";
        }
        cout << "Enter in directory ok" << endl;
     
        PROCESS_INFORMATION pi = {0};
        STARTUPINFO si = {0};
        si.cb = sizeof(si);
     
        HANDLE ghJob = CreateJobObject( NULL, NULL); // GLOBAL
        if ( ghJob == NULL)
        {
            cout << "CreateJobObject failed " << GetLastError() << endl;
            return -1;
        }
        else
        {
            cout << "CreateJobObject OK" << endl;
     
            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);
                cout << "SetInformationJobObject failed " << GetLastError() << endl;
                return -1;
            }
        }
     
       // nom de l'executable à lancer qui se trouve dans le répertoire "C:\\Program Files (x86)\\test_hello world\\bin"
        std::string exe = "toto.exe";
        res = CreateProcess(NULL,
                            (char*)exe.c_str(),
                            NULL,
                            NULL,
                            TRUE,
                            //CREATE_NEW_CONSOLE,
                            CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_PRESERVE_CODE_AUTH_LEVEL,
                            NULL,
                            NULL,
                            &si,
                            &pi);
        if (res == 0)
        {
            cout << "CreateProcess: GetlastError = " << GetLastError() << endl;
        }
        else cout << "CreateProcess OK (" << res << ")" << endl;
     
        if (ghJob && pi.hProcess)
        {
            if (0 == AssignProcessToJobObject( ghJob, pi.hProcess))
            {
                cout << "AssignProcessToJobObject failed " << GetLastError();
                //return -1;
            }
            else cout << "AssignProcessToJobObject OK" << endl;
        }
        else cout << "Cannot AssignProcessToJobObject (CreateProcess failed...)" << endl;
     
       //normalement il faut fermer les handle mais c'est juste pour le test...
     
        system("pause");
     
        return 0;
    }
    NB: Ne pas oublier de compiler le programme avec le flag -D_WIN32_WINNT=0x500

    Normalement vous devriez pouvoir reproduire la situation.

    Merci et bonne journée
    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 !

  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 518
    Points
    41 518
    Par défaut
    Comme je te dis, le problème semble être que le process créateur est déjà dans un job, sur lequel il n'a pas le contrôle, et qui interdit le breakaway.
    En d'autres termes, IsProcessInJob() devrait retourner TRUE et QueryInformationJobObject(NULL, JobObjectExtendedLimitInformation, ...) devrait te retourner les limitations actuelles (qui pourraient, ou non, déjà avoir le flag que tu cherches à ajouter).

    Malheureusement Windows ne semble offrir aucun moyen de modifier le job contenant le processus courant; et sous Windows 7, il n'est pas possible de faire des "sous-jobs" (il semblerait que AssignProcessToJobObject() soit censé marcher à partir de Windows 8).
    Par contre, il est peut-être possible d'empêcher que ton processus se retrouve dans un job en premier lieu (note qu'il faut peut-être un Visual Studio 2008 ou supérieur, vu que c'est des histoires de manifest et niveau d'exécution).
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Je n'ai pas la réponse proprement dite mais si tu es aussi le créateur des programmes enfants, il est assez simple de surveiller le processus parent (ou n'importe quel processus d'ailleurs) et de détecter sa terminaison. OpenProcess(SYNCHRONIZE, ...) suivi d'un WaitForSingleObject sur le handle retourné (le tout dans un thread secondaire).

  11. #11
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    J'aimerais bien vérifier ta théorie mais j'ai un autre soucis...
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BOOL bb = FALSE;
    IsProcessInJob(GetCurrentProcess(), NULL, &bb);
    J'ai une erreur de linkage : "IsProcessInJob not declared" pourtant d'après la doc MSDN, il n'y rien à linker...

    Dans winbase.h, j'ai bien :
    #if (_WIN32_WINNT >= 0x0501)
    WINBASEAPI BOOL IsProcessInJob(HANDLE,HANDLE,PBOOL);
    #endif
    Une idée ?

    @Andnotor: Malheureusement je ne suis pas le créateur des programmes enfants

    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 !

  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
    Quelle est la valeur de _WIN32_WINNT dans ton projet?
    Ton projet contient-il un targetver.h? Je ne me souviens plus quelle version de Visual les crée (et j'ignore quelle version tu as).
    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
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    _WIN32_WINNT=0x501 dans mon projet (j'ai pensé à la changer)

    Et je n'utilise pas Visual studio c'est peut être à cause de cela donc je n'ai pas de fichier targetver.h
    J'utilise minGW avaec codeblocks...
    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 !

  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
    Dans ce cas, il est fort possible que tu sois dans un job pour la raison indiquée dans un de mes liens (pas de manifest -> mode de compatibilité)...
    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
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    J'ai trouvé un workaround (enfin c'est osé quand même) : j'ai modifié Winbase.h en modifiant cette ligne
    WINBASEAPI BOOL IsProcessInJob(HANDLE,HANDLE,PBOOL);

    avec
    WINBASEAPI BOOL WINAPI IsProcessInJob(HANDLE,HANDLE,PBOOL);

    Et ca link correctement... Peut être une erreur de la part de ceux qui ont développé MinGW ?
    Citation Envoyé par Médinoc Voir le message
    Dans ce cas, il est fort possible que tu sois dans un job pour la raison indiquée dans un de mes liens (pas de manifest -> mode de compatibilité)...
    Après avoir testé, quand je compile dans l’environnement de Codeblocks (avec F9), la sortie est :
    Enter in directory OK
    CreateJobObject OK
    IsProcessInJob TRUE
    CreateProcess OK (1)
    AssignProcessToJobObject OK
    Quand je l’exécute en ligne de commande à partir de la console "administrateur" (celle où je me suis loggé en tant qu'autre utilisateur...) :
    Enter in directory OK
    CreateJobObject OK
    IsProcessInJob TRUE
    CreateProcess: GetLastError 5
    Cannot AssignProcessToJobObject (CreateProcess failed)
    Dans les deux cas, le process courant est bien dans un Job mais CreateProcess fonctionne bien quand je suis dans l'IDE codeblocks mais ne fonctionne plus en dehors !!

    Si j'exécute en ligne de commande mais cette fois avec la console "normale" (sur ma session USER, je clique sur cmd.exe donc j'ai une console non admin), et bah ca marche...
    Enter in directory OK
    CreateJobObject OK
    IsProcessInJob FALSE
    CreateProcess OK (1)
    AssignProcessToJobObject OK
    A une différence près : le processus courant n'est plus dans un Job...

    Trop bizarre...

    PS: J'ai ajouté le IsProcessInJob juste avant le CreateProcess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BOOL bb = FALSE;
    IsProcessInJob(GetCurrentProcess(), NULL, &bb);
    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 !

  16. #16
    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
    Donc, quand tu le lances depuis Code::Blocks, il est dans un job qui autorise le breakaway.
    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.

  17. #17
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Donc, quand tu le lances depuis Code::Blocks, il est dans un job qui autorise le breakaway.
    Est ce que je peux le vérifier avec ta fonction QueryInformationJobObject ? (faut que je regarde comment elle marche sur la msdn)
    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 !

  18. #18
    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
    Normalement, oui.
    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.

  19. #19
    Expert confirmé
    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
    Points : 4 388
    Points
    4 388
    Par défaut
    Voilà ce que j'ai pour les infos avec execution dans l'IDE codeblocks :
    BasicLimitInformation.LimitFlags = 0x800
    ProcessMemoryLimit = 0
    JobMemoryLimit = 0
    Les autres infos me semblaient pas pertinentes.
    Je pense donc que le flag est peut être dans LimitFlags ? D'après le doc le 0x800 correspond à JOB_OBJECT_LIMIT_BREAKAWAY_OK mais c'est peut être une combinaison de flags aussi qui donne 0x800...

    Dans la console "admin" (celle où je me suis loggé en tant qu'autre utilisateur) :
    BasicLimitInformation.LimitFlags = 0x0
    ProcessMemoryLimit = 0
    JobMemoryLimit = 0
    Aucun flag...

    Et dans l'autre console où ca marche bien :
    BasicLimitInformation.LimitFlags = 0x572970
    ProcessMemoryLimit = 0x76ee118e
    JobMemoryLimit = 0x76ee1162
    Et là un paquet de flags...

    Le code :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION data;
        res = QueryInformationJobObject(NULL, JobObjectExtendedLimitInformation, &data, sizeof(data), NULL);
        cout << "QueryInformationJobObject (" << res << ") " <<  GetLastError() << endl;
        cout << "\t" << "BasicLimitInformation.LimitFlags Ox" << std::hex << data.BasicLimitInformation.LimitFlags << endl;
        cout << "\t" << "ProcessMemoryLimit " << data.ProcessMemoryLimit << endl;
        cout << "\t" << "JobMemoryLimit " << data.JobMemoryLimit << endl;
    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 !

  20. #20
    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
    Pour moi, ça semble confirmer, sauf que ça ne devrait rien renvoyer de pertinent quand le processus n'est pas dans un job.
    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.

Discussions similaires

  1. [IIS 7.5] Acces refusé code 403 .
    Par marcandre dans le forum IIS
    Réponses: 1
    Dernier message: 23/04/2012, 15h32
  2. Accès refusé jquery.js Code 0
    Par maxwell374 dans le forum jQuery
    Réponses: 4
    Dernier message: 26/10/2010, 14h40
  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, 14h01
  4. Kerio / Composants Indy / Accès refusé
    Par ixpe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/09/2004, 14h38
  5. acces refusé
    Par pram dans le forum XMLRAD
    Réponses: 3
    Dernier message: 02/04/2003, 16h55

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