快速确定用户帐户是否是AD组成员的最佳方法?

Joh*_*nFx 9 ldap adsi active-directory directoryentry

我目前有一些代码可以提取组中的用户列表,然后遍历该组以确定给定的帐户是否存在,但似乎应该有更简洁(也许更快)的方法来实现这一点.

此代码(VB.NET)尝试使用组对象的成员属性,但即使用户是该组的成员,它也会返回false.谁能看到我在这里做错了什么?

Dim group As DirectoryEntry =  GetNetworkObject(GroupDomanName, NetworkObjectType.NetworkGroup, GroupName)
Dim user As DirectoryEntry =GetNetworkObject(UserDomainName, NetworkObjectType.NetworkUser, Login)

Return group.Properties("member").Contains(user.Path)
Run Code Online (Sandbox Code Playgroud)

仅供参考:GetNetworkObject调用只返回一个directoryEntry对象,我已经确认正在为组和用户对象返回正确的对象.

hus*_*int 19

如果您使用的是.NET 3.5堆栈,则System.DirectoryServices.AccountManagement.dll程序集在AD之上有一个很好的API.可以使用以下方法来解决您的问题:

static bool IsUserMemberOf(string userName, string groupName)
{
    using (var ctx = new PrincipalContext(ContextType.Domain))
    using (var groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName))
    using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName))
    {
        return userPrincipal.IsMemberOf(groupPrincipal);
    }
}

// Usage:
bool result = IsUserMemberOf("CONTOSO\\john.doe", "CONTOSO\\Administrators");
Run Code Online (Sandbox Code Playgroud)

我不知道这种方法是如何执行的,但它是一个干净的解决方案.