2012-07-03 6 views
3

Я пытаюсь использовать информацию с этого поста: https://stackoverflow.com/a/251267/393087Как получить PSID от TOKEN_INFORMATION_CLASS?

И код, который я придумал это:

HANDLE hToken; 
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES, &hToken); 
DWORD dwSize; 
TOKEN_INFORMATION_CLASS tokenInformationClass; 
GetTokenInformation(hToken, tokenInformationClass, NULL, sizeof(TOKEN_INFORMATION_CLASS), &dwSize); 

Хорошо, так что я получил TOKEN_INFORMATION_CLASS, но как получить от этого к PSID что ConvertSidToStringSid() потребности ? Нигде нет слова PSID в справочной странице tic (http://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx).

ответ

8

На самом деле это тривиально. Выберите нужный класс токенов, который вы хотите (моя догадка, что вы хотите TokenUser), а затем убедитесь, что вы передаете соответствующую структуру TOKEN_USER на GetTokenInformation, затем дойдите до структуры TOKEN_USER, чтобы получить доступ к TOKEN_USER::User::Sid, чтобы получить PSID.

Конечно, вам также может понадобиться другой класс информации о токенах, но принцип тот же. Полный пример программы (скомпилирован как .cpp файл в MSVC):

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0500 
#endif      
#include <stdio.h> 
#include <tchar.h> 
#include <Windows.h> 
#include <Sddl.h> // for ConvertSidToStringSid() 

BOOL printTokenUserSid(HANDLE hToken) 
{ 
    PTOKEN_USER ptu = NULL; 
    DWORD dwSize = 0; 
    if(!GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize) 
     && ERROR_INSUFFICIENT_BUFFER != GetLastError()) 
    { 
     return FALSE; 
    } 
    if(NULL != (ptu = (PTOKEN_USER)LocalAlloc(LPTR, dwSize))) 
    { 
     LPTSTR StringSid = NULL; 
     if(!GetTokenInformation(hToken, TokenUser, ptu, dwSize, &dwSize)) 
     { 
      LocalFree((HLOCAL)ptu); 
      return FALSE; 
     } 
     if(ConvertSidToStringSid(ptu->User.Sid, &StringSid)) 
     { 
      _tprintf(_T("%s\n"), StringSid); 
      LocalFree((HLOCAL)StringSid); 
      LocalFree((HLOCAL)ptu); 
      return TRUE; 
     } 
     LocalFree((HLOCAL)ptu); 
    } 
    return FALSE; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HANDLE hToken = NULL; 
    if(OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken) 
     || OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) 
    { 
     if(!printTokenUserSid(hToken)) 
     { 
      _tprintf(_T("Something failed, Win32 error: %d\n"), GetLastError()); 
     } 
     CloseHandle(hToken); 
    } 
    return 0; 
} 
+2

На самом деле это немного сложнее, поскольку буфер вы передаете GetTokenInformation() должен быть достаточно большим, чтобы вместить SID (TOKEN_USER имеет только достаточно места для указатель на SID). – Luke

+0

О, так это относительный SID, тогда ... хороший момент, позвольте мне исправить это. – 0xC0000022L

+0

@ Luke: ну есть более полная (и менее тривиальная версия) :) – 0xC0000022L