На самом деле это тривиально. Выберите нужный класс токенов, который вы хотите (моя догадка, что вы хотите 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;
}
На самом деле это немного сложнее, поскольку буфер вы передаете GetTokenInformation() должен быть достаточно большим, чтобы вместить SID (TOKEN_USER имеет только достаточно места для указатель на SID). – Luke
О, так это относительный SID, тогда ... хороший момент, позвольте мне исправить это. – 0xC0000022L
@ Luke: ну есть более полная (и менее тривиальная версия) :) – 0xC0000022L