gpt4 book ai didi

c# - 使用 C# 从通讯组列表中获取电子邮件地址

转载 作者:行者123 更新时间:2023-12-05 03:27:34 26 4
gpt4 key购买 nike

更新:

对我来说,LDAP 方式 仅适用于查找 AD 组内的电子邮件地址,例如:名为 ITSolutionDeliveryDevelopers 的组。 在 Exchange 分发列表中,例如:名为 abc@domainname.com

// I was able to figure out entry as suggested by @Gabriel Luci and
// all of the following possible formats worked for me:
// ngroupnet.com is my company domain name.
var entry = new DirectoryEntry();
var entry = new DirectoryEntry("LDAP://ngroupnet.com");
var entry = new DirectoryEntry("LDAP://ngroupnet.com", "MyAccountUsername", "MyAccountPassword");
var entry = new DirectoryEntry("LDAP://ngroupnet.com", "MyName@mycompany.com", "MyEmailAccountPassword");

我的完整答案请看下面:https://stackoverflow.com/a/71518937/8644294


原始问题:

获取包含交换分发列表的所有个人电子邮件地址的最佳方法是什么?

例如:我有一个名为 abc@domainname.com 的通讯组列表,其中包含电子邮件地址:

  1. a@domainname.com
  2. b@domainname.com
  3. c@domainname.com

现在我需要使用 C# 代码获取这些地址。

我找到了使用 LDAP 的解决方案,但我觉得找出我的 Active Directory 的 LDAP 路径会很麻烦。

// How do I get this LDAP Path, username and password?  
// Is the username and password service account credentials of the app?
// And do they need to be registered in AD?
var entry = new DirectoryEntry("LDAP Path");//, username, password);

LDAP方式:

public static List<string> GetDistributionListMembers(string dlName = "abc@domainname.com")
{
var result = new List<string>();
try
{
// How do I get this LDAP Path?
var entry = new DirectoryEntry("LDAP Path");//, username, password);
var search = new DirectorySearcher(entry);
search.Filter = $"CN={dlName}";
int i = search.Filter.Length;

string str = "", str1 = "";
foreach (SearchResult AdObj in search.FindAll())
{
foreach (String objName in AdObj.GetDirectoryEntry().Properties["member"])
{
str += Convert.ToString(objName) + "&lt;Br>";
int selIndex = objName.IndexOf("CN=") + 3;
int selEnd = objName.IndexOf(",OU") - 3;
str1 += objName.Substring(selIndex, selEnd).Replace("\\", "");

DirectorySearcher dsSearch = new DirectorySearcher(entry);
dsSearch.Filter = "CN=" + objName.Substring(selIndex, selEnd).Replace("\\", "");
foreach (SearchResult rs in dsSearch.FindAll())
{
//str1 += "&lt;p align='right'><font face='calibri' color='#2266aa' size=2>" + Convert.ToString(rs.GetDirectoryEntry().Properties["mail"].Value) + "|" + Convert.ToString(rs.GetDirectoryEntry().Properties["displayName"].Value) + "|" + Convert.ToString(rs.GetDirectoryEntry().Properties["sAMAccountName"].Value) + "|" + Convert.ToString(rs.GetDirectoryEntry().Properties["department"].Value) + "|" + Convert.ToString(rs.GetDirectoryEntry().Properties["memberOf"].Value) + "&lt;/font></p>";
str1 = Convert.ToString(rs.GetDirectoryEntry().Properties["mail"].Value);
result.Add(str1);
}
}

}
return result;
}
catch (Exception ex)
{
//Do some logging or what have you.
throw;
}
}

所以我选择了 EWS 路线。

EWS方式:

public static static List<string> GetDistributionListMembers(string dlName = "abc@domainname.com")
{
try
{
var service = new ExchangeService();
var cred = new WebCredentials("sharedmailbox@domain.com", "some_password");
service.Credentials = cred;
service.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx");
service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;

var expandedEmailAddresses = new List<string>();

ExpandGroupResults myGroupMembers = service.ExpandGroup(dlName);

foreach (EmailAddress address in myGroupMembers.Members)
{
expandedEmailAddresses.Add(address.Address);
}

return expandedEmailAddresses;
}
catch (Exception ex)
{
// The DL doesn't have any members. Handle it how you want.
// Handle/ Log other errors.
}
}

EWS 方法是一种好方法吗?

如果是,那么我很好。如果没有,我将不得不找出 LDAP 路径。

或者如果有更好的方法,请告诉我。

最佳答案

如果您运行此程序的计算机加入了与您要查找的组相同的域,则您无需确定 LDAP 路径。你可以这样做:

var search = new DirectorySearcher();

如果您的计算机没有加入同一个域,那么您只需使用域名:

var entry = new DirectoryEntry("LDAP://domainname.com");

这要求您的计算机和域 Controller 之间没有防火墙阻止端口 389。如果您需要传递凭据,请执行以下操作:

var entry = new DirectoryEntry("LDAP://domainname.com", username, password);

凭据可以是域中的任何用户。

也就是说,您的代码中存在许多低效之处,这将使其运行速度比需要的慢得多。我写了一篇关于此的文章可以帮助您更新代码:Active Directory: Better Performance

Is EWS approach a good way?

如果它有效,它就有效。我不是 EWS 方面的专家(尽管我已经使用过),但我相当确定这是在使用基本身份验证,is going to be disabled in October .

关于c# - 使用 C# 从通讯组列表中获取电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71445653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com