Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式确定用户帐户是否是Windows中特定组的成员?_Windows_Security_Winapi_Active Directory_Local Security Authority - Fatal编程技术网

如何以编程方式确定用户帐户是否是Windows中特定组的成员?

如何以编程方式确定用户帐户是否是Windows中特定组的成员?,windows,security,winapi,active-directory,local-security-authority,Windows,Security,Winapi,Active Directory,Local Security Authority,给定组名和用户帐户,我想知道提供的用户是否属于特定组。用户可以是本地用户或域用户,组可以是本地组或域组,组也可以嵌套在其他组中。简而言之,我正在寻找一个类似于bool IsUserMemberOf(User,Group)的函数,它将在内部调用适当的Win32 API来进行搜索。我猜进行上述查询的进程应该具有查询本地组和广告组所需的权限。我猜在企业管理帐户下运行该进程应该可以查询林中的任何DC,但对于不属于域的计算机可能不起作用。关于这个查询过程应该运行哪个帐户以便查询LSA和AD,您有什么想法吗

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

您需要阅读(TOKEN\u USER),并且。

“返回一个布尔值,指定主体是否是指定组的成员。”

Magnus是正确的,您必须使用CheckTokenMembership

您可以在UnlockPolicy.c(下载)中找到一个示例,函数
ShouldUnlockForUser
usagerestdansgroup
(请原谅我的法语;)

以下是它的精髓:

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;
}

答案从未被接受,可能是因为OP与我所处的情况相同:我没有令牌,只有帐户和组的SID和名称。有没有办法在不知道密码的情况下获取令牌?或者,是否有只使用SID的LSA函数?我仍然被困在搜索后。我处于相同的位置,有两个microsoft官方示例,都不起作用,都会为每个用户返回管理员组。什么是“句柄”?有没有办法将用户名转换为句柄?句柄由一个方法返回,该方法要么验证用户(如
LogonUser
),要么从当前上下文中检索它(如
WTSQueryUserToken
)。使用哪一个在很大程度上取决于上下文。。。问一个问题,这样社区会提供更有用的答案!注意:这对管理员不起作用。管理员仅在权限升级时才在组中。