C#用Display name查詢Active Directory, 獲得Login name

來源:互聯網
上載者:User

基本類型

========

主要使用的是三個類型, DirectoryEntry, SearchResult 和DirectorySearcher.

 

DirectoryEntry是包含一個對象具體資訊的類. 這個類被用來實際地綁定下面的ADSI(Active directory Service Interface)對象. 它是動態, 意味著其中的資訊來自Domain Controller, 擷取額外的資訊會帶來對DC查詢的網路通訊.

 

DirectorySearcher是主要的搜尋類. 它的對象根據filter的標準來執行搜尋操作. 獲得SearchResultCollection類型的搜尋結果.

 

SearchResult是使用DirectorySearcher執行搜尋返回的一個緩衝對象. 由於資料是緩衝在本地的, 所以擷取資訊時不需要通過網路, 這同時也意味著其中的資訊可能會到期.

 

LDAP path的格式

=======

格式如下:

LDAP://HostName[:PortNumber][/DistinguishedName]

舉例:

LDAP://domain.fabrikam.com/dc=domain, dc=fabricam, dc=com

 

Search Filters

=======

合法的Filters有限制條件如下:

  • 運算式的各個部分必須被小括弧括起
  • 運算式可以使用關係運算子: <, <=, =, >=, 和 >. 舉例: (lastName=Smith)
  • 符合運算式的格式是運算子作為首碼, 運算子包括 & 和 | . 舉例:  (&(objectClass=user)(|(lastName=Smith)(lastName=Jones))) 該運算式的意義是尋找姓為Smith或者是Jones的使用者.

AD Service Providers

=======

 

 

Active Directory中的名字

=======

這是非常容易混淆的部分, 因為不同的provider有不同的名字. 有時同樣的名字在不同的provider下會引用不同的屬性.

下表清晰的列出了相關資訊.

 

一些縮寫的釋義.

 

full NT name 和 full LDAP name

============

full NT name的格式是

    NetBIOSDomain\sAMAccountName

 

full LDAP name的格式舉例

    cn=Test1,ou=Sales,ou=East,dc=Domain1,dc=com

 

經過研究, 改寫. 貼出My Code如下.

using System;using System.Collections.Generic;using System.Text;using System.DirectoryServices;namespace displaytologin{    class Program    {        static void Main(string[] args)        {            Convertor c = new Convertor();            string displayName = "Robert Chartier";            string loginName = c.GetLoginName(displayName);        }    }    class Convertor    {        public string GetLoginName(string DisplayName)        {            string returnStr = string.Empty;            SearchResultCollection results = null;            string filter = "(&(objectCategory=user)(objectClass=person)(displayName=" + DisplayName + "))";            string connectionPrefix = "LDAP://cn=users,DC=testdc,DC=local";            using (DirectoryEntry root = new DirectoryEntry(connectionPrefix, "administrator", "TestPassword123$"))            {                using (DirectorySearcher searcher = new DirectorySearcher(root))                {                    searcher.ReferralChasing = ReferralChasingOption.All;                    searcher.SearchScope = SearchScope.Subtree;                    searcher.Filter = filter;                    results = searcher.FindAll();                }            }            foreach (SearchResult sr in results)            {                DirectoryEntry entry = sr.GetDirectoryEntry();                PropertyValueCollection pg = entry.Properties["sAMAccountName"];                returnStr = (string)pg.Value;            }            return returnStr;        }    }}

參考資料:

Searching Active Directory for Users and Groups

by Jon Wojtowicz  

Accessing Active Directory Through the .NET Framework
by Robert Chartier  

Names for Objects in Active Directory

  

其餘參考資料:

Search Filter Syntax

http://msdn.microsoft.com/en-us/library/aa746475%28VS.85%29.aspx

 

http://www.codeproject.com/KB/aspnet/adsi1.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.