3

給定一個組名和一個用戶帳戶,我想知道提供的用戶是否屬於一個特定的組。用戶可以是本地用戶或域用戶,並且該組可以是本地組或域組,並且該組也可以嵌套在其他組內。總之,我正在尋找一個像bool IsUserMemberOf(User, Group)這樣的函數,它將在內部調用相應的Win32 API來執行搜索。我想進行上述查詢的過程應具有查詢本地和AD組所需的權限。我猜想運行企業管理員帳戶下的流程應該可以查詢森林中的任何DC,但可能不適用於不屬於域的機器。關於這個查詢過程應該運行什麼帳戶的任何想法,以便它可以查詢LSA以及AD?如何以編程方式確定用戶帳戶是否是Windows中特定組的成員?

回答

1

您需要詳細瞭解GetTokenInformation(TOKEN_USER),AllocateAndInitializeSidCheckTokenMemberShip

+0

答案是從來沒有接受,可能是因爲OP是在同樣的情況我在:我沒有道理,只是一個SID和名稱每個帳戶和組。有沒有辦法在不知道密碼的情況下獲取令牌?或者,是否有一個LSA函數只用SID來完成?狩獵後我仍然陷入困境。 – 2012-12-19 11:22:27

+0

我處於相同的位置,有兩個微軟官方示例,既不工作,也總是爲每個用戶返回管理員組。 – Owl 2017-12-01 10:50:43

0

馬格努斯是正確的,你必須使用CheckTokenMembership

你可以找到UnlockPolicy.c樣本(下載full source here),功能ShouldUnlockForUserUsagerEstDansGroupe(原諒我的法國)。

這裏是它的膽量:

HRESULT IsUserInGroup(HANDLE user, const wchar_t* groupe) 
{ 
    HRESULT result = E_FAIL; 
    SID_NAME_USE snu; 
    WCHAR szDomain[256]; 
    DWORD dwSidSize = 0; 
    DWORD dwSize = sizeof szDomain/sizeof * szDomain; 

    if ((LookupAccountNameW(NULL, groupe, 0, &dwSidSize, szDomain, &dwSize, &snu) == 0) 
      && (ERROR_INSUFFICIENT_BUFFER == GetLastError())) 
    { 
     SID* pSid = (SID*)malloc(dwSidSize); 

     if (LookupAccountNameW(NULL, groupe, pSid, &dwSidSize, szDomain, &dwSize, &snu)) 
     { 
      BOOL b; 

      if (CheckTokenMembership(user, pSid, &b)) 
      { 
       if (b == TRUE) 
       { 
        result = S_OK; 
       } 
      } 
      else 
      { 
       result = S_FALSE; 
      } 
     } 

     //Si tout vas bien (la presque totalitée des cas), on delete notre pointeur 
     //avec le bon operateur. 
     free(pSid); 
    } 

    return result; 
} 
相關問題