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

posted on 2009-12-24 15:11  中道学友  阅读(3747)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上