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

C++ Discussion :

[tlhelp32] Problème pour lister les processus et utilisateurs


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Par défaut [tlhelp32] Problème pour lister les processus et utilisateurs
    Voilà, j'ai un soucis. J'ai développé une application qui émule une session windows avec les comptes windows.
    Lorsque je veux émuler une session, je vérifie avant que aucun processus n'est lancé par cette session sinon cela veut dire que la session est active donc je prend un autre compte.

    Exemple :
    Mon serveur de connexion est lancé par la session "Jean".

    Je lance une demande de connexion pour le compte "Pierre" ne trouve aucun processus pour ce compte donc je lance la session.

    Là un autre client demande la session "Pierre" et là c'est le drame, lorsque je lance la vérification des processus (avec tlhelp32). Ils sont tous lancés par "Jean". Alors que si je regarde les processus lancés par le "Gestionnaire de taches" je vois bien mes processus "Jean" mais aussi les ceux de Pierre.

    Et quand je regarde le PID des processus lancés par Pierre avec tlhelp32, il me retourne toujours l'utilisateur Jean.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    C'est une erreur dans la fonction de détection de connexions du serveur.
    En l'absence de code, je parie sur une erreur de copie.

    Sinon, es-tu certain que le processus est lancé par le bon utilisateur?
    Que dit le gestionnaire de processus?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Par défaut
    Désolé je suis partis en vacance. Donc voici un bout de code :
    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
    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
     
    bool Serveur::GetUserProcess(DWORD dwIDProc, WCHAR*szName)
    {
        // Recuperation du nom de l'utilisateur utilisant le process
        HANDLE haProcess;
        PSECURITY_DESCRIPTOR psdRecup;
        SID_NAME_USE snuName;
        BOOL boOwner;
        DWORD dwSize;
        PSID psid;
        wchar_t * szDomain;
        DWORD dwNameSize = 64;
        DWORD dwSizeDom = 64;
        szDomain = (wchar_t*)GlobalAlloc(GMEM_FIXED,51);
        psdRecup = (PSECURITY_DESCRIPTOR)GlobalAlloc(GMEM_FIXED,1000);
        /*
        * Récupère le handle du processus , pour lire la sécurité du fichier .
        * READ_CONTROL doit être présent dans le handle du processus.
        */
        haProcess = OpenProcess(READ_CONTROL,TRUE,dwIDProc);
        if (haProcess == NULL) { return FALSE;}
        if ((GetKernelObjectSecurity(haProcess,OWNER_SECURITY_INFORMATION,psdRecup,1000,&dwSize)) == 0 ) {CloseHandle(haProcess); return FALSE;}
        if ((GetSecurityDescriptorOwner(psdRecup,&psid, &boOwner)) == 0) {CloseHandle(haProcess); return FALSE;}
        if ((LookupAccountSid(NULL,psid,szName,&dwNameSize,szDomain,&dwSizeDom,&snuName)) == 0) {CloseHandle(haProcess); return FALSE;}
        etatServeur->setText(etatServeur->toPlainText()+"\r\n snuName : " + QString::number(snuName));
        char *Domain = new char[4096];
        wcstombs(Domain, szDomain, 64);
        etatServeur->setText(etatServeur->toPlainText()+"\r\n szDomain : " + Domain + " PID dflksdfhj : " + QString::number(dwIDProc));
        GlobalFree(psdRecup);
        GlobalFree(szDomain);
        return TRUE;
    }
     
    bool Serveur::GetProcessList()
    {
        // Recuperation de la liste des processus en cours
        HANDLE hProcessSnap;
        HANDLE hProcess;
        PROCESSENTRY32 pe32;
        DWORD dwPriorityClass;
        DWORD dwSizeCurUSer = 30;
        WCHAR szUserProcess[30+1];
        WCHAR szCurUser[30+1];
        GetUserName(szCurUser,&dwSizeCurUSer);
        // Take a snapshot of all processes in the system.
        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 1);
        // Set the size of the structure before using it.
        pe32.dwSize = sizeof(PROCESSENTRY32);
        // Retrieve information about the first process,
        // and exit if unsuccessful
        if (!Process32First(hProcessSnap, &pe32)) {
            CloseHandle(hProcessSnap);          // clean the snapshot object
            return false;
        }
        // Now walk the snapshot of processes, and
        // display information about each process in turn
        do {
            GetUserProcess(pe32.th32ProcessID, szUserProcess);
            char *UserProcess = new char[4096];
            wcstombs(UserProcess, szUserProcess, 64);
            QString text(UserProcess);
           // if (NumeroProcess == pe32.th32ProcessID)
                etatServeur->setText(etatServeur->toPlainText()+"\r\n personne : " + text + " PID : " + QString::number(pe32.th32ProcessID));
     
            if (!ListClientProcess.contains(text))
                ListClientProcess.append(text);
            // Retrieve the priority class.
            dwPriorityClass = 0;
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
            if (hProcess != NULL) {
                dwPriorityClass = GetPriorityClass(hProcess);
                if (!dwPriorityClass)
                    qDebug() << "GetPriorityClass";
                CloseHandle(hProcess);
            }
        } while (Process32Next(hProcessSnap, &pe32));
        CloseHandle(hProcessSnap);
        return true;
    }

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Déjà, plusieurs choses me chagrine

    pourquoi retourner un bool? en C++ on préfère une exception en cas d'erreur.

    Crée une classe de RAII autour des handles, ton code sera bien meilleur.

    Style: pourquoi une majuscule, en quoi DWORD dwIDProc est mieux que DWORD processusId?

    La classe est Serveur les commentaires sont en français, mais les fonctions et arguments sont nommées en anglais. Il faut choisir.

    Pour en venir à ton problème initial, je n'ai pas d'idées.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Par défaut
    pourquoi retourner un bool? en C++ on préfère une exception en cas d'erreur.
    C'est ma façon de traiter mes fonctions. Tu as certainement la tienne et je pense que l'on peut se prendre la tête longtemps. J'ai fait une petite recherche et les deux existe ici

    Style: pourquoi une majuscule, en quoi DWORD dwIDProc est mieux que DWORD processusId?

    Pour ceci, désolé j'avais mal dormi et j'ai la modif.

    La classe est Serveur les commentaires sont en français, mais les fonctions et arguments sont nommées en anglais. Il faut choisir.

    Pour les coms je les ai mis en Français c’était pour vous car tous mes projet je les écris en anglais, si tu regardes bien dans la deuxième fonction ils sont en Anglais.

Discussions similaires

  1. [Free Pascal] Problème pour lister les fichiers d'un serveur distant
    Par mm_71 dans le forum Free Pascal
    Réponses: 6
    Dernier message: 26/06/2013, 09h52
  2. Réponses: 1
    Dernier message: 28/02/2011, 09h28
  3. Problème pour lister les fichiers d'in JAR
    Par Micke7 dans le forum Langage
    Réponses: 4
    Dernier message: 25/02/2011, 11h21
  4. Problème pour lister tous les lecteurs
    Par zit_zit dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/09/2007, 11h35
  5. Problème pour lister les fichiers d'un répertoire
    Par Vitaly dans le forum Applets
    Réponses: 17
    Dernier message: 21/08/2007, 00h49

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