![](/img/trans.png)
[英]How to find all users with the same User name\email address in Azure B2C using Azure Active Directory Graph Client?
[英]find domain name using email address from Active Directory
例如,我在組織中可以有多個 email 地址
if user alias = alias1 he will have for sure one email address as alias1@org.com at the same time he might have other email address fname.lname123@org.com
我的組織也有多個活動目錄域,如 NorthAmerica、EASASTASIA 等。
我想查找用戶屬於哪個活動目錄域。 使用下面的代碼,我能夠找出所有類型為 alias@org.com 的電子郵件的域,但對於其他類型的 email,代碼無法在活動目錄中找到記錄。
string[] emails = new string[]{"alias1@org.com", "fname.lname@org.com"};
string[] DOMAINS = new string[] { "DOMAIN1", "DOMAIN2"};
PrincipalContext[] contexts = new PrincipalContext[DOMAINS.Length];
for (int i=0; i<DOMAINS.Length; i++)
{
contexts[i] = new PrincipalContext(ContextType.Domain, DOMAINS[i]);
}
foreach (string email in emails)
{
string myDomain = "Not found";
for(int i=0; i<DOMAINS.Length; i++)
{
UserPrincipal yourUser = UserPrincipal.FindByIdentity(contexts[i], email);
if (yourUser != null)
{
myDomain = DOMAINS[i];'
break;
}
}
Console.WriteLine(email + " " + myDomain);
}
對於 alias1@org.com 我能夠找到活動目錄域,但對於其他情況則沒有
UserPrincipal.FindByIdentity()
實際上無法通過 email 地址進行搜索。 它只能通過IdentityType
中的一種標識符類型進行搜索。 在您的情況下,它可能與UserPrincipalName
匹配,這就是您有時會找到結果的原因,但不是全部。
為此,我將直接使用DirectorySearcher
,這是UserPrincipal.FindByIdentity()
在幕后使用的,但您可以更好地控制搜索方式。
您必須通過proxyAddresses
屬性進行搜索。 用戶的所有 email 地址都會在那里,前綴為smtp:
(主地址為大寫SMTP:
)。 看起來像這樣:
string[] emails = new string[]{"alias1@org.com", "fname.lname@org.com"};
string[] DOMAINS = new string[] { "DOMAIN1", "DOMAIN2"};
foreach (string email in emails)
{
string myDomain = "Not found";
for(int i=0; i<DOMAINS.Length; i++)
{
var searcher = new DirectorySearcher {
SearchRoot = new DirectoryEntry($"LDAP://{DOMAINS[i]}"),
Filter = $"(&(objectClass=user)(objectCategory=person)(proxyAddresses=smtp:{email}))",
PropertiesToLoad = { "cn" } //just put something so it doesn't return everything
};
if (searcher.FindOne() != null)
{
myDomain = DOMAINS[i];
break;
}
}
Console.WriteLine(email + " " + myDomain);
}
如果您正在搜索的所有域都在同一個 AD 林中,那么您可以通過查詢全局目錄一次來節省時間,而不是對每個域進行單獨的查詢。 全局目錄存儲林中所有域的數據。 您可以使用GC://
而不是LDAP://
來定位全局目錄。
然后您可以詢問用戶的msDS-PrincipalName
屬性,該屬性將是DOMAIN\username
格式的用戶名,因此您可以從中提取域名。 例如:
string[] emails = new string[]{"alias1@org.com", "fname.lname@org.com"};
foreach (string email in emails)
{
string myDomain = "Not found";
var searcher = new DirectorySearcher {
SearchRoot = new DirectoryEntry("GC://example.com"),
Filter = $"(&(objectClass=user)(objectCategory=person)(proxyAddresses=smtp:{email}))",
PropertiesToLoad = { "msDS-PrincipalName" }
};
var found = searcher.FindOne();
if (found != null)
{
var mdDsPrincipalName = (string) found.Properties["msDS-PrincipalName"][0];
myDomain = mdDsPrincipalName.Substring(0, mdDsPrincipalName.IndexOf("\\"));
}
Console.WriteLine(email + " " + myDomain);
}
只需將example.com
替換為您的任何域的名稱(不管哪個)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.