UPDATE Для того, чтобы сделать это, клиент должен позволить серверу, чтобы получить свою информацию путем настройки прокси-сервера с 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.
КОНЕЦ UPDATE
И после этого вы можете использовать GetTokenInformation API следующим образом:
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.