找出AD中的一个群组是否在分发群组中?

时间:2011-11-01 04:31:35

标签: asp.net active-directory distribution active-directory-group

我正在使用带有C#的ASP.net,对Active Directory一无所知。我已经完成了以下步骤编写程序的任务:

ASP.net应用程序被赋予用户的用户名。

应用程序应该使用给定的用户名查询用户的所有组。

然后,应用程序应将这些组显示在两个单独的列表中,其中一个由通讯组组成,另一个列表中包含其余组。

现在,查询所有组很容易。但是,如何检查该组是否在分发组中?

我没有得到更多信息。

我可以查看任何属性或其他内容吗?

3 个答案:

答案 0 :(得分:3)

您可以从名为Groupe-Type的属性(最后一行)中检索此信息。

(0x00000001) : Specifies a group that is created by the system.
(0x00000002) : Specifies a group with global scope.
(0x00000004) : Specifies a group with domain local scope.
(0x00000008) : Specifies a group with universal scope.
(0x00000010) : Specifies an APP_BASIC group for Windows Server Authorization Manager.
(0x00000020) : Specifies an APP_QUERY group fir Windows Server Authorization Manager.
(0x80000000) :Specifies a security group. If this flag is not set, then the group is a distribution group.

您可以在this answerthis other one以不同方式查找用户所属的群组。

您可以找到here如何撤消用户。

答案 1 :(得分:3)

由于您使用的是.NET 3.5及更高版本,因此您应该查看System.DirectoryServices.AccountManagement(S.DS.AM)命名空间。在这里阅读所有相关内容:

基本上,您可以定义域上下文并轻松在AD中查找用户和/或组:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{ 
   // get all roles for that user
   var roles = user.GetGroups();

   // set up two lists for each type of groups
   List<GroupPrincipal> securityGroups = new List<GroupPrincipal>();
   List<GroupPrincipal> distributionGroups = new List<GroupPrincipal>();

   // iterate over groups found
   foreach (Principal p in roles)
   {
       // cast to GroupPrincipal
       GroupPrincipal gp = (p as GroupPrincipal);

       if (gp != null)
       {
           // check whether it's a security group or a distribution group
           if (gp.IsSecurityGroup)
              securityGroups.Add(gp);
           else
              distributionGroups.Add(gp);
       }
    }
}

新的S.DS.AM让您可以轻松地与AD中的用户和群组一起玩!

答案 2 :(得分:3)

此代码将检索您启用电子邮件的所有组,无论它是安全组还是通讯组。 (看过你对marc_s的答案的评论,我猜这实际上是你的经理们正在寻找的)。

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    Principal prototype = new GroupPrincipal(ctx);
    PrincipalSearcher searcher = new PrincipalSearcher(prototype);
    List<string> groupNames = new List<string>();
    PropertyValueCollection email;

    foreach (var gp in searcher.FindAll()) using (gp)
    {
        GroupPrincipal group = gp as GroupPrincipal;

        using (DirectoryEntry groupEntry = ((DirectoryEntry)group.GetUnderlyingObject())
        {
          email = groupEntry.Properties["mail"];
          if (email.Value != null)
          {
            groupNames.Add(group.Name);
          }
        }
    }
}