ProzessName & BenutzerName -> ProzessID?



  • Hallo,

    ich habe den Benutzer- und den Prozess-Namen. Wie kann ich daraus die Prozess-ID herausfinden?

    Danke!





  • Danke für die Antwort!
    Folgendes:
    - Ich verwende WINNT, deshalb bekomme ich bei der Ausführung des Beispiels auf der SDK-Seite folgende Fehlermeldung:

    Der Prozedureinstiegspunkt "CreateToolhelp32Snapshot" konnte
    in der Dynamic Link Library "KERNEL32.DLL" nicht gefunden werden.

    Gibt es da eine Lösung?

    - Ich finde da keinen Benutzernamen, oder habe ich den übersehen? Der Benutzername dient dazu, die richtige ProzessID zu finden, da mehrere User den gleichen Prozess (Programm) starten (auf dem Server).

    Danke nochmals



  • Ok, hat sich erledigt. Ich habe was gefunden und einbißchen angepaßt:

    //---------------------------------------------------------------------------
    AnsiString LookupProcessUser(DWORD dwPID)
    {
      HANDLE  hProcessHandle;  /* for OpenProcess */
      HANDLE  hProcessToken;   /* for OpenProcessToken */
      hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                                     FALSE, dwPID);
    
      if (hProcessHandle == NULL)
      {
        // unable to get process handle, try next
        ShowMessage("ERROR:OpenProcess");
        return "";
      }
    
      if (!OpenProcessToken(hProcessHandle, TOKEN_READ | TOKEN_EXECUTE,
                              &hProcessToken))
      {
        // unable to get process token, try next
        ShowMessage("ERROR:OpenProcessToken");
        return "";
      }
    
      /* get information from the process token, specifically the user name */
      TOKEN_USER  userToken, *pUserToken;
      DWORD       dwSize = sizeof(TOKEN_USER), dwRetSize;
      PSID        pSid;
      if (!GetTokenInformation(hProcessToken, TokenUser, (LPVOID)&userToken,
                               dwSize, &dwRetSize))
      {
        // Assume userToken too small, try larger buffer
        pUserToken = (TOKEN_USER*)new BYTE[dwRetSize];
        dwSize = dwRetSize;
        if (!GetTokenInformation(hProcessToken, TokenUser, (LPVOID)pUserToken,
                                 dwSize, &dwRetSize))
        {
          delete [] pUserToken;
          ShowMessage("ERROR:GetTokenInformation");
          return "";
        }
        else
        {
          pSid = pUserToken->User.Sid;
        }
      }
      else
      {
        pSid = userToken.User.Sid;
      }
    
      // Now, try to look up the username.
      char                  szUserName[1024], szDomainName[1024];
      DWORD                 dwUserSize = 1024, dwDomainSize = 1024;
      SID_NAME_USE  sidType;
      if (!LookupAccountSid(NULL, pSid, szUserName, &dwUserSize,
                              szDomainName, &dwDomainSize, &sidType))
      {
        // unable to get user name
        if (pUserToken) delete [] pUserToken;
        ShowMessage("ERROR:GetTokenInformation");
        return "";
      }
    
      // Finally.
      if (pUserToken) delete [] pUserToken;
    
      AnsiString sUser(szUserName);
      return sUser;
    } 
    //---------------------------------------------------------------------------
    



Anmelden zum Antworten