2010-08-17 191 views
1

我该如何去查询当前登录用户属于哪个活动目录组?我假设它将通过LDAP,但我已经能够找到很多关于如何获得这些特定信息。查找当前用户活动目录组C++

我已经把一些代码,但即时通讯不能肯定什么,我需要在下一个

// Open the access token associated with the calling process. 
if (OpenProcessToken(GetCurrentProcess(), 
        TOKEN_QUERY, 
        &hToken) == FALSE) 
{ 
    dwErrorCode = GetLastError(); 
    wprintf(L"OpenProcessToken failed. GetLastError returned: %d\n", dwErrorCode); 
    return HRESULT_FROM_WIN32(dwErrorCode); 
} 

// Retrieve the token information in a TOKEN_USER structure. 
GetTokenInformation(hToken, 
        TokenUser,  // Request for a TOKEN_USER structure. 
        NULL, 
        0, 
        &dwBufferSize); 

pTokenUser = (PTOKEN_USER) new BYTE[dwBufferSize]; 
memset(pTokenUser, 0, dwBufferSize); 
if (GetTokenInformation(hToken, 
         TokenUser, 
         pTokenUser, 
         dwBufferSize, 
         &dwBufferSize)) 
{ 
    CloseHandle(hToken); 
} 
else 
{ 
    dwErrorCode = GetLastError(); 
    wprintf(L"GetTokenInformation failed. GetLastError returned: %d\n", dwErrorCode); 
    return HRESULT_FROM_WIN32(dwErrorCode); 
} 

if (IsValidSid(pTokenUser->User.Sid) == FALSE) 
{ 
    wprintf(L"The owner SID is invalid.\n"); 
    delete [] pTokenUser; 
} 

回答

2

在您的特定情况下,我认为你可以没有任何LDAP调用事要做。这里有一个建议:

  • 使用GetCurrentProcessIdOpenProcess得到一个句柄到当前进程
  • 呼叫OpenProcessToken上手柄以打开当前进程
  • 对访问令牌的呼叫GetTokenInformation相关联的访问令牌,令牌信息类别为TokenGroups
  • 结果TOKEN_GROUPS结构包含一个列表,其中包含访问令牌中所有组的SID和属性
  • c所有LookupAccountSid在列表中的每个组的SID上获取其名称

MSDN应提供有关上述调用的更多详细信息。

+0

我开始拼凑一些代码,但我不知道我需要做什么在最后一步使用LookupAccountSid – thecaptain0220 2010-08-19 14:17:05

+0

假设对'GetTokenInformation'的调用是成功的;你现在应该有一个指向'TOKEN_GROUPS'结构的指针,'ptokengroups'。对于每个“ptokengroups-> GroupCount”组,在'ptokengroups-> Groups [idx] .Sid'上调用'LookupAccountSid'。 – 2010-08-20 07:38:34

+0

我看到你已经编辑了这个问题,并添加了代码,它使用具有TokenUser而不是TokenGroups的'GetTokenInformation',尽管你最初说你想检索当前用户所属的组。无论如何,给定代码,您现在可以通过调用'LookupAccountSid'来获取用户的名称和域名,这是第一次使用NULL输出缓冲区来检索它们的大小,然后使用有效的:'LookupAccountSid(NULL,(pTokenUser->用户).Sid,name,&namesize,domainname,&domainnamesize,&use)','SID_NAME_USE use = SidTypeUnknown'。对于组进行类似的处理。 – 2010-08-23 07:16:23

相关问题