Узнайте, входит ли группа в AD в группу рассылки?

Я использую ASP.net с C# и очень мало знаю об Active Directory. Мне дали задание написать программу по шагам ниже:

Приложению ASP.net дается имя пользователя.

Приложение должно запрашивать все группы пользователя с заданным именем пользователя.

Затем приложение должно отображать эти группы в двух отдельных списках, один из которых состоит из групп рассылки, а другой — из остальных групп.

Теперь запрос для всех групп прост. Но как я могу проверить, находится ли группа в группе рассылки или нет?

Больше информации мне не предоставили.

Любой атрибут или что-то, что я могу проверить?


person PPGoodMan    schedule 01.11.2011    source источник


Ответы (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.

Вы можете найти в этот ответ или в нижней части этого другой другой способ получения групп, к которым принадлежит пользователь.

Вы можете найти здесь, как получить пользователя .

person JPBlanc    schedule 01.11.2011
comment
Я пока не уверен в вашем ответе. Потому что я еще не понял, что там происходит!!! Но я не спрашиваю вас, что вы имеете в виду, потому что я хотел бы разобраться в себе, так как теперь у меня есть время. Спасибо большое. - person PPGoodMan; 02.11.2011

Поскольку вы используете .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!

person marc_s    schedule 01.11.2011
comment
Большое спасибо. Кажется, это работает. Он дает два списка в порядке, но руководство утверждает, что эти два списка неверны! Это означает, что некоторые группы рассылки находятся в списке групп безопасности. Может быть, они ошибаются. В любом случае большое спасибо. Кстати, при компиляции я столкнулся с этой странной ошибкой: Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?). Это было нормально, когда он был приведен к bool. Но что, черт возьми, за тип данных «bool»? ??? Никогда об этом не слышал! - person PPGoodMan; 02.11.2011
comment
@PPGoodMan: это обнуляемое логическое значение, что означает, что оно может быть NULL, истинным или ложным. - person marc_s; 02.11.2011

Этот код извлечет все ваши группы с включенной электронной почтой, независимо от того, является ли это группой безопасности или группой рассылки. (Увидев ваш комментарий к ответу 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);
          }
        }
    }
}
person Cavyn VonDeylen    schedule 19.03.2013