给定一个组名和一个用户帐户,我想知道提供的用户是否属于一个特定的组。 用户可以是本地用户或域用户,并且该组可以是本地组或域组,并且该组也可以嵌套在其他组内。 简而言之,我正在寻找一个像bool IsUserMemberOf(User, Group)
这样的函数,它将在内部调用相应的Win32 API来执行search。 我想进行上述查询的过程应具有查询本地和AD组所需的权限。 我想运行企业pipe理员帐户下的进程应该做的查询任何森林区议会,但可能不适用于不属于域的机器。 关于这个查询过程应该运行什么帐户的任何想法,以便它可以查询LSA以及AD?
您需要阅读GetTokenInformation (TOKEN_USER), AllocateAndInitializeSid和CheckTokenMemberShip 。
UserPrincipal.IsMemberOf(GroupPrincipal) “返回一个布尔值,指定主体是否是指定组的成员”。
Magnus是对的,你必须使用CheckTokenMembership
你可以在UnlockPolicy.c中找到一个示例(下载完整的源码 ),函数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; }