【问题标题】:Active Directory User Group Memberships GroupPrincipalActive Directory 用户组成员资格 GroupPrincipal
【发布时间】:2011-03-09 14:33:06
【问题描述】:

我正在尝试使用 GroupPrincipalSystem.DirectoryServices.AccountManagement 命名空间的一部分)来填充类型字符串的列表,因此我可以检查用户是否是 Active Directory 组的成员。这是我到目前为止编写的编辑类:

public class ActiveDirectoryMembership
{
    private PrincipalContext context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
    private List<string> GroupName {get;set;}

    public ActiveDirectoryMembership() 
    {
         //Code snipped - this part returns a list of users
         populateGroups();
    }

    private void populateGroups()
    {
        GroupPrincipal SearchGroup = GroupPrincipal.FindByIdentity(context, "Group Name");
        GroupName = new List<string>();
        foreach (UserPrincipal p in GroupName.GetMembers())
        {
           GroupName.add(p.SamAccountName);
        }
    }

那么,我哪里错了?

提前致谢:)

【问题讨论】:

  • 你看到了什么,你期待看到什么???
  • 马特这不是一个真正的问题,这段代码是如何工作的?你会得到哪些结果?如果您检查断点,它在调试时的行为如何?你想得到什么与你现在得到的不同?
  • 对不起,我没有得到用户列表; GroupName 的值为空。我希望看到一个用户列表(我知道有些用户是该组的成员)——这有意义吗?

标签: c# active-directory


【解决方案1】:

您的代码的这种修改有效(我进行了测试以确保):

using System.DirectoryServices.AccountManagement;


    private static readonly string DomainName = "domaincontrollercomputer.domain.com";
    private static readonly string DomainContainer = "DC=DOMAIN,DC=COM";
    private static readonly string ADGroupName = "AD Group Name";
    private List<string> GroupName {get;set;}
      
    private void populateGroups()
    {
        using (var ctx = new PrincipalContext(ContextType.Domain, DomainName, DomainContainer))
        {
            using (var grp = GroupPrincipal.FindByIdentity(ctx, ADGroupName))
            {
                GroupName = new List<string>();
                foreach (var member in grp.GetMembers())
                {
                    GroupName.Add(member.SamAccountName);
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    我认为您的方法中有一个简单的错字 - 您将组负责人放入 SearchGroup(检查 NULL,顺便说一句!!)然后您将成员抢走GroupName??

    试试这个:

    private void populateGroups()
    {
        GroupPrincipal SearchGroup = GroupPrincipal.FindByIdentity(context, "Group Name");
    
        if(SearchGroup != null)
        {
           GroupName = new List<string>();
    
           // call 'GetMembers' on 'SearchGroup' here!! 
           foreach (UserPrincipal p in SearchGroup.GetMembers())  
           {
              GroupName.add(p.SamAccountName);
           }
        }
    }
    

    【讨论】:

    • 我没有收到运行时/编译错误。我是否需要填充 P 的值(在运行 foreach 循环之前有效地给我一个要循环的用户列表?
    • 完全忽略我 - 我的测试在玩我的脑袋 - 我做了 assert.isnull 而不是 assert.isnotnull - 现在一切正常!