首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从AD Group MVC获取电子邮件地址

从AD Group MVC获取电子邮件地址
EN

Stack Overflow用户
提问于 2019-08-07 21:45:17
回答 1查看 363关注 0票数 0

我有我的广告组的名称,我需要返回一个列表中找到的用户的每个单独的电子邮件地址。我一直在四处寻找,试图找到这个问题的答案,但我找到的所有结果都是为了检查单个用户的电子邮件地址的AD组。通常通过使用他们的windows登录用户名。

然而,我想要做的是抓取我的目标active directory组中的每个电子邮件地址。因为最终会将其转换为只需发送给active directory组中的个人的自动电子邮件。

我正在构建的项目正在使用MVC5。

有没有人能给我指个方向?

EN

回答 1

Stack Overflow用户

发布于 2019-08-07 22:18:37

您需要将此过程分成两个步骤:

  1. 查找该组(我假设您只知道该组的名称)
  2. 获取所有成员。

查找组的

你可以使用GroupPrincipal.FindByIdentity,它可以说更容易,但我发现它相当慢(你的小组越大,速度就越慢)。我更喜欢使用DirectorySearcher/DirectoryEntry (这也是GroupPrincipal在幕后使用的)。

要查找该组,您的代码应如下所示:

代码语言:javascript
复制
var groupName = "MyGroup";
var search = new DirectorySearcher() {
    Filter = $"(&(objectClass=group)(cn={groupName}))"
};
search.PropertiesToLoad.Add("cn"); //this is just to prevent it from returning every attribute

//This will throw an exception if the group is not found
var group = ((SearchResult)search.FindOne()).GetDirectoryEntry();

如果你已经有了组的distinguishedName,你实际上可以跳过这一步,只创建一个DirectoryEntry

代码语言:javascript
复制
var group = new DirectoryEntry($"LDAP://{disginguishedName}");

获取members

我写了一篇关于如何做到这一点的文章,其中包含示例C#代码:Find all the members of a group

那篇文章中的示例代码返回DOMAIN\username,所以这里是相同的方法,修改为返回所有拥有电子邮件地址的成员的电子邮件地址列表。

将我们为组找到的DirectoryEntry对象传递给此方法。如果希望在嵌套组中查看,请将recursive设置为true

代码语言:javascript
复制
public static IEnumerable<string> GetGroupMemberList(DirectoryEntry group, bool recursive = false) {
    var members = new List<string>();

    group.RefreshCache(new[] { "member" });

    while (true) {
        var memberDns = group.Properties["member"];
        foreach (string member in memberDns) {
            using (var memberDe = new DirectoryEntry($"LDAP://{member.Replace("/", "\\/")}")) {
                memberDe.RefreshCache(new[] { "objectClass", "mail" });

                if (recursive && memberDe.Properties["objectClass"].Contains("group")) {
                    members.AddRange(GetGroupMemberList(memberDe, true));
                } else {
                    var email = memberDe.Properties["mail"].Value.ToString();
                    if (!string.IsNullOrEmpty(email)) {
                        members.Add(email);
                    }
                }
            }
        }

        if (memberDns.Count == 0) break;

        try {
            group.RefreshCache(new[] {$"member;range={members.Count}-*"});
        } catch (COMException e) {
            if (e.ErrorCode == unchecked((int) 0x80072020)) { //no more results
                break;
            }
            throw;
        }
    }
    return members;
}

在我的文章中,我还谈到了主要组和外国安全原则,但您不必在这里担心,因为它不适用于通讯组列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57395929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档