鉴于组名和用户帐户,我想知道提供的用户是否属于特定组。用户可以是本地用户或域用户,该组可以是本地组或域组,该组也可以嵌套在其他组中。总之,我正在寻找像bool IsUserMemberOf(User, Group)
这样的函数,它将在内部调用相应的Win32 API来进行搜索。我想进行上述查询的过程应具有查询本地和AD组的必要权限。我想在企业管理员帐户下运行该流程应该完成查询林中任何DC的工作,但可能不适用于不属于域的计算机。有关此查询过程应该运行的任何想法,以便它可以查询LSA以及AD吗?
答案 0 :(得分:1)
您需要阅读GetTokenInformation(TOKEN_USER),AllocateAndInitializeSid和CheckTokenMemberShip。
答案 1 :(得分:1)
UserPrincipal.IsMemberOf(GroupPrincipal)“返回一个布尔值,指定主体是否是指定组的成员”。
答案 2 :(得分:1)
马格努斯是对的,你必须使用CheckTokenMembership
您可以在UnlockPolicy.c中找到示例(下载full source here),函数ShouldUnlockForUser
和UsagerEstDansGroupe
(请原谅我的法语;)。
以下是它的内容:
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;
}