Владелец процесса.

Тема в разделе "WASM.WIN32", создана пользователем sadomazer, 15 сен 2006.

  1. sadomazer

    sadomazer New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    2
    Как имея данные о процессе(pid, если надо, хендл) определить какой пользователь его запустил? Документированных функций нету, однако Task Manager как-то это делает.
     
  2. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    sadomazer
    1) Открыл процес - получил хендл.
    2) По хенделу получил токен.
    3) По токену получил владельца.

    P.S.
    Например: OpenProcess, OpenProcessToken, GetTokenInformation
     
  3. SmikeX

    SmikeX New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2003
    Сообщения:
    20
    вот тебе простенький примерчик о чем говорит DelExe
    в примере процесс берет информацию о самом себе

    Код (Text):
    1. #include "windows.h"
    2. #include "stdio.h"
    3. void main()
    4. {
    5.    HANDLE hProcToken;
    6.    char szModuleName[1024];
    7.    char szUserName[1024];
    8.    char szDomainName[1024];
    9.    DWORD dwLenUser;
    10.    DWORD dwLenDomain;
    11.    //next 2 lines are included to make more obvious how to get Process Handle from Process ID
    12.    DWORD dwProcessID = GetCurrentProcessId();
    13.    HANDLE ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);
    14.    //For current process it is possible to call
    15.    // HANDLE ProcessHandle = GetCurrentProcess();
    16.    if (OpenProcessToken(ProcessHandle,
    17.       TOKEN_QUERY, &hProcToken) != FALSE)
    18.    {
    19.       BYTE *byData = new BYTE[1024];
    20.       DWORD dwRetLen;
    21.       if (GetTokenInformation(hProcToken, TokenUser/*TokenOwner*/, byData, 1024,
    22.          &dwRetLen) != FALSE) {
    23.          dwLenUser = sizeof(szUserName);
    24.          dwLenDomain = sizeof(szDomainName);
    25.          TOKEN_USER * pTokenUser = (TOKEN_USER*)byData;
    26.          SID_NAME_USE sidUse;
    27.          if (LookupAccountSid(NULL,
    28.             /*sid*/pTokenUser->User.Sid,
    29.             szUserName, &dwLenUser,
    30.             szDomainName, &dwLenDomain,
    31.             &sidUse) != FALSE)
    32.          {
    33.             GetModuleFileName(NULL, szModuleName, sizeof(szModuleName));
    34.             printf("Process: %s\nUserName: %s\nDomainName: %s",
    35.                szModuleName,
    36.                szUserName,
    37.                szDomainName);
    38.          }
    39.          
    40.       }
    41.       delete[] byData;
    42.    }
    43. }
    результат выполнения:

    Process: C:\TestProjects\test\Debug\test.exe
    UserName: Smike
    DomainName: BlackIP