Должен ли GroupPrincipal предоставлять ВСЕ файлы AD? - PullRequest
1 голос
/ 19 февраля 2020

VisualStudio 2019, C#, .NetCore 2.2

Что-то странное происходит. У меня есть следующий код. Это работает , но если я поставлю точку останова в строке var thing = member;, я вижу, что member имеет много значений object.member. Такие вещи, как: EmailAddress и другие поля AD. Тем не менее, в редакторе, если я пытаюсь использовать member.EmailAddress, я получаю сообщение, что EmailAddress не может быть решена.

Я вполне уверен, что пара пользователь / пароль для PrincipalContext является «привилегированной» учетной записью, которая должна иметь доступ ко всем полям AD, если это имеет значение.

    using (var ctx = new PrincipalContext(ContextType.Domain, 
        "ad.myCompany.com",  userName:"ad-svc-account", "...")) {
        var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.DistinguishedName,
            "CN=My Group Staff,OU=Groups - DLs,OU=My,OU=Org,DC=ad,DC=myCompany,DC=com");

        if (grp == null) {
            return StatusCode(StatusCodes.Status500InternalServerError, "Group list is empty");
        }

        foreach (var member in grp.Members) {
            var thing = member;
        }
    }

Что я скучаю?

1 Ответ

1 голос
/ 19 февраля 2020

Когда вы go проходите через членов группы с помощью var member, вы перебираете членов типа Principal [1] . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1002* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1002* * *. Поскольку членом группы может быть либо UserPrincipal, либо GroupPrincipal, либо другие типы, вам необходимо сначала выяснить тип Принципала, с которым вы работаете, привести к нужному типу, а затем найти все свойства.

foreach(var member in grp.Members) 
{
  if (member is UserPrincipal)
  {
      var memberP = member as UserPrincipal;
      memberP.<will have all the properties of UserPrincipal>;
  }
  else if (member is GroupPrincipal)
  {
      var memberG = member as GroupPrincipal;
      memberG.<will have all properties of GroupPrincipal>;
  }
  else
  {
    //handle other types (such as ComputerPrincipal) or all others.
  }
}

[1] Principal

Инициализирует новый экземпляр класса Principal. Этот конструктор вызывается конструкторами производного класса для инициализации базового класса и не предназначен для непосредственного вызова из вашего кода

[2] GroupPrincipal

Инкапсулирует групповые учетные записи. Групповые учетные записи могут быть произвольными коллекциями основных объектов или учетными записями, созданными для административных целей.

[3] UserPrincipal

Инкапсуляция принципалы, которые являются учетными записями пользователей

...