Как с помощью DirectoryServices.AccountManagement получить адрес электронной почты группы безопасности Active Directory?

У меня есть группа безопасности (на фото ниже) в активном каталоге, с которой связан адрес электронной почты. Как получить адрес электронной почты группы? Объект GroupPrincipal не имеет свойств адреса электронной почты.

Вот как я получаю все группы:

using (PrincipalContext context = new PrincipalContext(DirectoryContextType, Domain)) {
    using (var groupSearcher = new GroupPrincipal(context)) {
        using (var searcher = new PrincipalSearcher(groupSearcher)) {
            foreach (GroupPrincipal group in searcher.FindAll()) {
                //How do I get the e-mail address?
            }
        }
    }
}

Группа безопасности


person Justin Helgerson    schedule 07.01.2013    source источник
comment
Связано ли с группой имя пользователя? Я не знаю о группах, но я использую UserPrincipal при работе с пользователями.   -  person Botonomous    schedule 07.01.2013
comment
@Anon — у группы есть свойство активного каталога samaccountname. Поиск объектов, отфильтрованных UserPrincipal, не возвращает объект, поскольку это группа. Приведенный выше код извлекает группу, но у меня нет доступа к адресу электронной почты объекта.   -  person Justin Helgerson    schedule 08.01.2013
comment
@JustinHelgerson, вы можете указать членов группы как UserPrincipal, потому что у них общий интерфейс; смотри мой ответ ниже   -  person codeMonkey    schedule 14.04.2017


Ответы (3)


Если вы хотите сделать это из управления учетной записью, вам потребуется создайте новый класс, предоставляющий это свойство.

[DirectoryObjectClass("group")]
[DirectoryRdnPrefix("CN")]
public class GroupPrincipalsEx : GroupPrincipal
{
    public GroupPrincipalsEx(PrincipalContext context) : base(context) { }

    public GroupPrincipalsEx(PrincipalContext context, string samAccountName)
        : base(context, samAccountName)
    {
    }

    [DirectoryProperty("mail")]
    public string EmailAddress
    {
        get
        {
            if (ExtensionGet("mail").Length != 1)
                return null;

            return (string)ExtensionGet("mail")[0];

        }
        set { this.ExtensionSet("mail", value); }
    }
}
person Scott Chamberlain    schedule 07.01.2013
comment
Невозможно привести объект типа ...GroupPrincipal к типу GroupPrincipalsEx - person Christine; 19.12.2018

Я просто хотел добавить это здесь, потому что я думаю, что это может быть полезно. Библиотека управления учетными записями отлично подходит для быстрого выполнения таких действий, как сброс паролей для пользователей AD или получение общих свойств. Но точно не все есть. Что я делаю, так это получаю объект базового каталога, например...

// Pretend you have a groupprincipal object called 'group' 
// This will get all of the properties of that group object not accounted for in 
// System.DirectoryServices.AccountManagement
DirectoryEntry groupDE = group.GetUnderlyingObject() as DirectoryEntry();
// We all know that a distro group in AD will have at least 1 email address. 
// However, A
// security group will have 0, and since the mail property is of type
// PropertyValueCollection, if you try to access the first member of the collection
// and it has no length, an exception will be thrown. The following code 
// accounts for this problem. 

// Get the mail attribute of the AD object 
PropertyValueCollection group_email_addresses = groupDe.Properties["mail"];
// Make sure there is at least one address
if (group_email_addresses.Count > 0){
   // knowing that you have at least one address, you can access the first entry or 
   // loop and grab all entries on a property, depending on the appropriate use case
   Console.WriteLine(group_email_addresses[0]); 
} 

// Эту концепцию можно применить ко всем основным объектам. Просто найдите метод // GetUnderlyingObject(), чтобы начать!

person David Blanchard    schedule 06.09.2019

Вам нужно привести все к типу UserPrincipal:

var mailList = new List<MailAddress>();
var adDomain = "yourdomain";
var adGroup = "yourgroup";

using (var context = new PrincipalContext(ContextType.Domain, adDomain))
{
    using (var groupContext = GroupPrincipal.FindByIdentity(context, adGroup))
    {
        mailList = groupContext.GetMembers(true)
                               .Cast<UserPrincipal>()
                               .Where(x => !string.IsNullOrEmpty(x.EmailAddress) && !string.IsNullOrEmpty(x.DisplayName))
                               .Select(x => new MailAddress(x.EmailAddress, x.DisplayName))
                               .ToList();
    }

}

return mailList;
person codeMonkey    schedule 06.04.2017
comment
@Hill, возможно, у вашей учетной записи нет доступа ни к одному из других участников этой группы AD. - person codeMonkey; 19.12.2018