簡體   English   中英

使用 Active Directory 中的 email 地址查找域名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM