Benutzername eines Prozesses



  • Hallo!

    Ich versuche einen Taskmanager für WindowsXP zu erstellen. Ich weiß... WindowsXP hat schon einen und der funktioniert auch wunderbar. Ich würde trotzdem gerne versuchen einen vergleichbaren TaskManager zu erstellen, der mir vielleicht sogar mehr über die Prozesse verraten kann.
    Die erste Frage, die ich in dem Zusammenhang habe ist, wie ich den Benutzernamen herausfinden kann, mit/unter dem der Prozess läuft(wie im Windows Taskmanager).

    Vielen Dank...

    Der kleine Noob



  • Das sollte mit GetTokenInformation funktionieren, wenn Du 'TokenUser' für die TOKEN_INFORMATION_CLASS nimmst. Du bekommst dann eine TOKEN_USER-Struktur gefüllt. Mit LookupAccountSid kommst Du dann auf den Namen.



  • Danke!

    Ich werde es versuchen!



  • Hi!

    Ich habe nun die Funktion zur Bestimmung des Benutzernamen eines Prozesses fertig. Es gibt mit der Bestimmung der Benutzernamen aber leider einen Haken. Meine Anwendung braucht „Debug Privileges“ und der Benutzername von „System“ und 2 von den 5 svchost.exe (n) können nicht angezeigt werden. Im Windows TaskManager hat „System“ den Benutzernamen „SYSTEM“ und die beiden svchost.exe (n) die Benutzernamen „LOKALER DIENST“ und „NETZWERKDIENST“. Bei diesen 3 Prozessen gibt GetLastError die Fehlermeldung „Zugriff verweigert“ zurück. Dieser Fehler tritt im Zusammenhang mit OpenProcessToken in der Funktion LookupProcessUser auf.
    Die ProcessId für LookupProcessUser bekomme ich mit OpenProcess:

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION , FALSE, pe32.th32ProcessID );
    

    Eine weitere Frage ist, ob ich die letzten 3 Parameter für LookupAccountSid angeben muss. Meine Anwendung braucht sie nicht, ersetze ich sie aber durch NULL wird eine Exception ausgelöst.

    DWORD LookupProcessUser(HANDLE ProcessId, char* &UsrName)
    {
      DWORD dwDomainLength                = 0;
      DWORD	dwLength                      = 0;
      DWORD dwError                       = 0;
    
      HANDLE hToken;
      PTOKEN_USER ptu;
      TOKEN_INFORMATION_CLASS tInfoClass  = TokenUser;
      SID_NAME_USE snu                    = SidTypeUser;
    
      char *DomainName;
    
      bool boReturn = false;
    
      boReturn = OpenProcessToken(ProcessId,TOKEN_QUERY,&hToken);
      if (!boReturn){return GetLastError();}
    
      do
      {
        dwError = 0;
        ptu      = (PTOKEN_USER)new unsigned char [dwLength];
        boReturn = GetTokenInformation(hToken, tInfoClass, (LPVOID)ptu, dwLength,&dwLength);
        if (!boReturn) dwError  = GetLastError();
      }
      while (dwError ==  ERROR_INSUFFICIENT_BUFFER);
    
      if (!boReturn) return dwError;
    
      dwLength       = 0;
      dwDomainLength = 0;
    
      do
      {
        dwError        = 0;
        UsrName        = new char[dwLength];
        DomainName     = new char[dwDomainLength];
        boReturn       = LookupAccountSid(NULL,ptu->User.Sid,UsrName, &dwLength, DomainName, &dwDomainLength, &snu);
        if (!boReturn) dwError = GetLastError();
      }
      while (dwError ==  ERROR_INSUFFICIENT_BUFFER);
    
      if (!boReturn) return dwError;
    
      return 0;
    
    }
    //---------------------------------------------------------------------------
    
    DWORD EnableDebugPrivilege()
    {
    
       HANDLE hToken;
       TOKEN_PRIVILEGES tkp;
       char buf[100]; 
    
       if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
         return GetLastError(); 
    
       if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
         return GetLastError();
    
       tkp.PrivilegeCount = 1;  // one privilege to set
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
       if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
         return GetLastError();
    
       return 0;
    }
    //---------------------------------------------------------------------------
    

    Vielen Dank...

    Der kleine Noob



  • Hi!
    Zu diesem Thema habe ich auch eine Frage. Wie kann man denn den gesammten Pfad der Exe-Datei herausfinden. szExeName gibt ja nur den Namen der Exe wieder.

    Danke

    Doreios


Anmelden zum Antworten