C# 读写AD数据

转载 2013年12月05日 18:11:27
 AD对查询进行了优化,所以查询起来还是比较快的。

1、LDAP查询语法

LDAP中操作符有&(逻辑与),|(逻辑或), !(逻辑非),=(等于),*(通配符)。LDAP操作符的使用有点不同。

l  &符号,查找类型为user,cn为oo的用户

示例: (&(objectClass=user)(cn=oo)))。

l  !符号,查找cn不是oo的用户、组等其他类型

示例:(!cn=oo)。

l  |符号,查找类型为user,cn为oo或者为xi的用户

示例:(&(obectClass=user)(|(cn=oo)(cn=xi)))。

l  *符号,查找cn以oo开始的用户

示例:(&(objectClass=user)(cn=oo*))

 

C#读取AD数据

l  Web.config配置如下:

test1:AD所在的计算机名称

          contoso:域名

[c-sharp] view plaincopy
  1. <add key="LDAPPath" value="LDAP://test1/DC=contoso,DC=com" />  
  2. <add key="LDAPUser" value="contoso/bot" />  
  3. <add key="LDAPPassword" value="123456" />  
  4. <add key="OUName" value="天机集团有限公司"/>  

l  连接AD

[c-sharp] view plaincopy
  1. DirectoryEntry  searchRoot = new DirectoryEntry(LDAPPath, LDAPUser, LDAPPassword, AuthenticationTypes.Secure);  

l  查询指定的用户

[c-sharp] view plaincopy
  1. DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot);  
  2. directorySearch.Filter = "(&(objectClass=user)(cn=" + userName + "))";  
  3. SearchResult results = directorySearch.FindOne();   
  4. if (results != null)  
  5. {  
  6.           DirectoryEntry user = results.GetDirectoryEntry();  
  7.  }  

objectClass:指定查找的类型,user(代表查找用户),AD中的类型有很多。比如user , organizationalUnit,group等。很多软件还会对AD的类型进行扩展, Exchange就会对AD的schema进行扩展。

cn: 是user类型的一个属性,即CommonName。也就是说我们查找的是类型为user,cn为userName的用户。

那AD中到底有多少类型以及多少属性呢,我们可以打开开始->管理工具->ADSI编辑器。然后在ADSI编辑器上点击右键->连接。弹出连接设置对话框,在选择一个已知命名上下文的下拉框中选择架构,然后点击确定,我们就可以看到所有的类型和属性。在一个类型上进行双击,会弹出类型的属性编辑器,可以看到类型所有的属性,并可以进行编辑。

l  使用代码查看类型的属性

当然我们也可以使用代码来查看类型的属性,但是只能查看设定了值的属性,没有设定值的属性还不知道怎么查看。比如以下代码,可以输出user类型的一些属性。知道属性的名称和属性的值之后就可以更好的设定一些查询条件。

[c-sharp] view plaincopy
  1.  DirectoryEntry m_DirectoryEntry = new DirectoryEntry(LDAPPath, LDAPUser, LDAPPassword, AuthenticationTypes.Secure);  
  2.  DirectorySearcher directorySearch = new DirectorySearcher(searchRoot);  
  3.  directorySearch.Filter = "(&(objectClass=user)(cn=test))";  
  4.         SearchResult results = directorySearch.FindOne();  
  5.  DirectoryEntry entry = results.GetDirectoryEntry();  
  6.  foreach (string pro in entry.Properties.PropertyNames)  
  7. {  
  8.   Console.WriteLine(entry.Properties[pro].PropertyName + ".........." + entry.Properties[pro].Value.ToString());  
  9. }  

l  查询指定OU的代码。

[c-sharp] view plaincopy
  1. DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot);  
  2. directorySearch.Filter = "(&(objectClass=organizationalUnit)(ou=" + ouName + "))";  
  3. SearchResult results = directorySearch.FindOne();  
  4. if (results != null)  
  5. {  
  6.     DirectoryEntry entry = results.GetDirectoryEntry();  
  7. }  

l  查询指定OU的下的子OU。

[c-sharp] view plaincopy
  1. foreach (DirectoryEntry entry in root.Children)  
  2. {  
  3.     if (entry.SchemaClassName.Equals("organizationalUnit"))  
  4.     {  
  5.         // 自己的代码  
  6.     }  
  7. }  

Root的类型为DirectoryEntry,所以首先需要查询出指定的OU,获取DirectoryEntry实例。DirectoryEntry实例有一个Children属性,包含所有的子元素。通过遍历所有的子元素,并判断ShcemaClassName是不是"organizationalUnit",如果是就代表该子元素为OU。

当然查询的OU可能不止一个,我们可以使用FindAll()方法进行查询。

SearchResultCollection userCollection = directorySearch.FindAll();

            foreach (SearchResult users in userCollection)

查询之后我们获得一个SearchResult集合,对SearchResult集合进行遍历,就可以获得所有的OU了。

那如果想获取OU下的子user或者group怎么办呢,只需要修改代码如下

entry.SchemaClassName.Equals("user") //类型为user

entry.SchemaClassName.Equals("group") //类型为group

l  获取指定OU下的指定用户呢,

a)         可以把查询条件些的更精确一点。以下代码,我们可以获取cn为test的用户了。

 

DirectoryEntry  searchRoot = newDirectoryEntry("LDAP://test1/CN=test,CN=Users,DC=contoso,DC=com", LDAPUser, LDAPPassword);

 

b)         首先获取指定OU的DirectoryEntry实例,再把获取的实例作为参数,传入到DirectorySearcher得构造函数中,进行查询。

DirectorySearcher directorySearch = new DirectorySearcher(entry);

l  获取指定的group。

DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot);

                directorySearch.Filter = "(&(objectClass=group)(SAMAccountName=" + groupName +"))";

                SearchResult results = directorySearch.FindOne();

SAMAccountName:是group类型的一个属性。

 

获取group下的所有用户

[c-sharp] view plaincopy
  1. DirectorySearcher directorySearch = new DirectorySearcher(SearchRoot);  
  2. directorySearch.Filter = "(&(objectClass=group)(SAMAccountName=" + groupName + "))";  
  3. SearchResult results = directorySearch.FindOne();   
  4. if (results != null)  
  5. {  
  6.     DirectoryEntry dirEntry = new DirectoryEntry(results.Path, LDAPUser, LDAPPassword);  
  7.     PropertyCollection propertyCollection = dirEntry.Properties;   
  8.     int count = propertyCollection ["member"].Count;   
  9.     for (int i = 0; i < count; i++)  
  10.     {  
  11.         string respath = results.Path;   
  12.         string[] pathnavigate = respath.Split("CN".ToCharArray());  
  13.         respath = pathnavigate[0];   
  14.         string objpath = propertyCollection["member"][i].ToString();   
  15.         string path = respath + objpath;  
  16.         DirectoryEntry user = new DirectoryEntry(path, LDAPUser, LDAPPassword);  
  17.     }  
  18. }  
    

 

用户是是不能通过group的Children属性来进行获取。组有一个属性就是member,member中存储了所有用户的路径,比如CN=test,CN=Users,DC=contoso,DC=com。

想获取group隶属于哪个组,只需要把member修改为memberOf就可以了。当然我们也可以通过这种方式,查找一个用户所属的组

WINDOWS AD读写数据

package com.sinosoft.ben; import java.util.Properties; import java.util.TimerTask; import javax.n...
  • benbenkui
  • benbenkui
  • 2010年06月13日 07:05
  • 644

C# AD操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2016年10月18日 12:39
  • 1288

C# SerialPort 串口读写

串口发送接收数据,支持大量数据交互
  • kolvin2008
  • kolvin2008
  • 2016年10月16日 22:09
  • 5265

c# 域操作实例 AD身份验证

 domainName  域服務器名稱   例如 AD1.Domain.com.twADPATH = LDAP://AD1.Domain.com.cn/DC= Domain,DC=com,DC=cn ...
  • weiqian000
  • weiqian000
  • 2009年11月10日 08:02
  • 6530

在asp.net中,我用c#进行AD操作,添加用户

主  题:关于 AD ,高手请进,在线等待在asp.net中,我用c#进行AD操作,添加用户,我怎么才能列举本域中下面的所有用户,包括Users,和自己建立的组织单位,请举例,谢谢回复人: yxrj(...
  • xuandhu
  • xuandhu
  • 2005年03月16日 14:07
  • 5397

AD用户属性&C#操作实例

AD用户属性&C#操作实例 属性显示名称属性名称First NamegivenNameLast NamesnInitialsinitialsDescriptiondescriptionOfficeph...
  • h0017809
  • h0017809
  • 2009年04月05日 15:44
  • 1592

C# sqliet 读写 *.db 数据库

public static string DbPath = string.Format(@"Data Source={0}", System.Windows.Forms.Application.S...
  • hediping9811
  • hediping9811
  • 2014年08月20日 14:22
  • 663

c# AD域 权限管理

我现在开始第一步,获取AD域用户所在的组,因为我想把菜单和界面按钮的功能由角色组来控制,用户加入角色组就可以获得相应的权限. 这是我的思路. 第一 如何关联AD域 并获取当前登录域的用户所在的角色组 ...
  • dllxf
  • dllxf
  • 2016年07月18日 14:31
  • 620

C# 获取AD组中的用户信息

DirectoryEntry de = new DirectoryEntry("LDAP://" + "域名", "用户名", "密码", AuthenticationTypes.Secure); ...
  • Bychentufeiyang
  • Bychentufeiyang
  • 2012年06月25日 15:22
  • 5354

c# 读取写入excel单元格(包括对excel的一些基本操作)【总结篇】

这次雇主又说要加几个功能,没办法,作为程序猿,只能乖乖听话啦!对于这几个功能,我也做了一些总结 以下是一些对excel的一些基本操作: 命名控件的引入: using Microsoft.office...
  • cyg2001
  • cyg2001
  • 2016年08月10日 17:00
  • 3469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 读写AD数据
举报原因:
原因补充:

(最多只允许输入30个字)