ОБНОВЛЕНИЕ Чтобы сделать это, клиент должен разрешить серверу получать свою информацию, настроив прокси-сервер с CoSetProxyBlanket API, как показано ниже:
HRESULT hr;
if(FAILED(hr = ::CoSetProxyBlanket(
unk // An interface the client uses to access the com server
, RPC_C_AUTHN_DEFAULT
, RPC_C_AUTHZ_DEFAULT
, NULL
, RPC_C_AUTHN_LEVEL_DEFAULT
, RPC_C_IMP_LEVEL_DELEGATE // This flag should be *_DELEGATE or *_IMPERSONATE or *_IDENTIFY
, NULL
, EOAC_DYNAMIC_CLOAKING)))
throw com_exception(hr, "Failed to set proxy blanket");
Затем выдает себя за (CoImpersonateClient) вы можете получить доступ к токену пользователя с помощью OpenThreadToken.
КОНЕЦ ОБНОВЛЕНИЯ
И после этого вы можете использовать API GetTokenInformation следующим образом:
DWORD tokenSize = 0;
::GetTokenInformation(token, TokenUser, NULL, 0, &tokenSize);
....
TOKEN_USER *tokenInfo; // should point to a memory location of size tokenSize.
....
if(::GetTokenInformation(token, infoClass, tokenInfo, tokenSize, &tokenSize) == FALSE)
throw win32_exception(::GetLastError(), "Failed to obtain token information");
tokenInfo будет содержать поле User.Sid извведите PSID.