4

给定组名和用户帐户,我想知道提供的用户是否属于特定组。用户可以是本地用户或域用户,组可以是本地组或域组,该组也可以嵌套在其他组中。简而言之,我正在寻找一个类似的函数bool IsUserMemberOf(User, Group),它将在内部调用适当的 Win32 API 来进行搜索。我想进行上述查询的过程应该具有查询本地和 AD 组的必要权限。我想在企业管理员帐户下运行该过程应该可以查询森林中的任何 DC,但可能不适用于不属于域的机器。关于这个查询过程应该运行什么帐户以便它可以查询 LSA 和 AD 的任何想法?

4

3 回答 3

1

UserPrincipal.IsMemberOf(GroupPrincipal) “返回一个布尔值,指定主体是否是指定组的成员”。

于 2009-06-23T16:37:17.037 回答
1

您需要阅读GetTokenInformation (TOKEN_USER)、AllocateAndInitializeSidCheckTokenMemberShip

于 2009-06-23T15:54:16.930 回答
1

Magnus 是对的,你必须使用 CheckTokenMembership

您可以在 UnlockPolicy.c 中找到示例(在此处下载完整源代码)、函数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;
}
于 2011-06-09T02:19:41.560 回答