C#用Display name查询Active Directory, 获得Login name

基本类型

========

主要使用的是三个类型, 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

=======

 2009-12-24 17-36-42

 

Active Directory中的名字

=======

这是非常容易混淆的部分, 因为不同的provider有不同的名字. 有时同样的名字在不同的provider下会引用不同的属性.

下表清晰的列出了相关信息.

2009-12-24 17-40-32

 

一些缩写的释义.

2009-12-24 17-47-22

 

full NT name 和 full LDAP name

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

full NT name的格式是

    NetBIOSDomain\sAMAccountName

 

full LDAP name的格式举例

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

 

经过研究, 改写. 贴出我的代码如下.

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

你可能感兴趣的:(Directory)