我目前有一些代码可以提取组中的用户列表,然后遍历该组以确定给定的帐户是否存在,但似乎应该有更简洁(也许更快)的方法来实现这一点.
此代码(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)
仅供参考:GetNetworkObject调用只返回一个directoryEntry对象,我已经确认正在为组和用户对象返回正确的对象.
如果您使用的是.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");
我不知道这种方法是如何执行的,但它是一个干净的解决方案.