2014-12-04 4 views
2

Я использую OpenProcessToken, GetTokenInformation, а затем LookupAccountSid, чтобы определить владельца определенного процесса.Получить владельца процесса (Citrix/Provisioning)

На локальном компьютере (Win 7 и Win 8.1) на сеансе служб RD (Server 2012) он работает нормально. Я получаю правильное имя пользователя. Имя пользователя отображается в диспетчере задач рядом с процессом.

Когда я выполняю тот же код в среде Provisioning (ex Citrix), я получаю только имя пользователя «Администратор», хотя в диспетчере задач отображается другое имя.

Есть ли у кого-нибудь идеи, как победить это в среде Provisioning?

Большое спасибо за любую помощь Martin

Вот код C++ Я использую:

BOOL DDEWinWord::processStartedFromLocalUser(DWORD procId) 
{ 
    #define MAX_NAME 256 
    DWORD dwSize = 0, dwResult = 0; 
    HANDLE hToken; 
    SID_NAME_USE SidType; 
    char lpName[MAX_NAME]; 
    char lpDomain[MAX_NAME]; 
    PTOKEN_OWNER tp; 

    // Open a handle to the access token for the calling process. 
    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId); 
    if (!OpenProcessToken(processHandle, TOKEN_QUERY, &hToken)) { 
     AfxMessageBox("processStartedFromLocalUser - OpenProcessToken fehlschlag."); 
     return FALSE; 
    } 

    // Call GetTokenInformation to get the buffer size. 
    if(!GetTokenInformation(hToken, TokenOwner, NULL, dwSize, &dwSize)) 
    { 
     dwResult = GetLastError(); 
     if (dwResult != ERROR_INSUFFICIENT_BUFFER) 
     { 
      AfxMessageBox("processStartedFromLocalUser - GetTokenInformation fehlschlag."); 
      return FALSE; 
     } 
    } 

    // Allocate the buffer. 
    tp = (PTOKEN_OWNER)GlobalAlloc(GPTR, dwSize); 

    // Call GetTokenInformation again to get the group information. 
    if (!GetTokenInformation(hToken, TokenOwner, tp, dwSize, &dwSize)) 
    { 
     AfxMessageBox("processStartedFromLocalUser - GetTokenInformation mit tp fehlschlag."); 
     return FALSE; 
    } 

    if (!LookupAccountSid(NULL, tp->Owner, lpName, &dwSize, lpDomain, &dwSize, &SidType)) 
    { 
     AfxMessageBox("processStartedFromLocalUser - LookupAccountSid fehlschlag."); 
     return FALSE; 
    } 
    else 
    { 
     AfxMessageBox(lpName); 
    } 

    return (m_stUserId.CompareNoCase(lpName) == 0); 
} 

ответ

0

Вы должны использовать TokenUser вместо TokenOwner.

+0

Большое спасибо за помощь. Это решение. –

+0

В чем разница между этими двумя? Когда они разные? – maja

+0

@maja: для учетных записей администратора TokenOwner (который определяет право собственности на вновь созданные объекты по умолчанию) по умолчанию установлен на «Администраторы», а не на определенную учетную запись пользователя. –

Смежные вопросы