2012-03-02 4 views
2

Я уже спрашивал о том, как получить имя пользователя. How can I get the user name who invoked the method of COM server? Теперь мне нужно также получить SID. Как мне это сделать?Как я могу получить SID пользователя, который вызвал метод COM-сервера?

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

ответ

2

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.

 Смежные вопросы

  • Нет связанных вопросов^_^