zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2018.11.12
    2018.11.8
    2018.11.7
    2018.11.6
    2018.11.5
    学习python课程第七天
    作业四.
    学习python课程第六天
    作业3
    学习python课程第五天
  • 原文地址:https://www.cnblogs.com/awpatp/p/1631453.html
Copyright © 2011-2022 走看看