Как я могу получить SID пользователя, который вызвал метод COM-сервера? - PullRequest
2 голосов
/ 02 марта 2012

Я уже спрашивал о том, как получить имя пользователя. Как я могу получить имя пользователя, который вызвал метод COM-сервера? Теперь мне тоже нужно получить SID. Как мне это сделать?

Подход OpenProcessToken не работает, поскольку эта функция завершается с ошибкой ERROR_BAD_IMPERSONATION_LEVEL.

1 Ответ

2 голосов
/ 02 марта 2012

ОБНОВЛЕНИЕ Чтобы сделать это, клиент должен разрешить серверу получать свою информацию, настроив прокси-сервер с 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.

...