Active Directory的DirectoryEntry与DirectorySearcher初识及Filter语法
前言
增删改查,我想查询是最先要说的一个了。本章主要记录使用.NET Framework进行对域控服务器对象的查询操作,介绍DirectoryEntry与DirectorySearcher(搜索器)及Filter(搜索过滤器)语法,并对AD对象常用属性做记录。
DirectoryEntry与DirectorySearcher
使用C#语言对域控服务器的AD对象进行查询操作,DirectoryEntry和DirectorySearcher是必须要了解的两个类。System.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。该命名空间包含了两个组件类,即DirectoryEntry和DirectorySearcher,它们使用AD服务接口(ADSI)技术。
DirectoryEntry:我们知道Active Directory中的数据是树状的,并且是层次型存储。而DirectoryEntry类就是为了封装 Active Directory 层次结构中的节点或对象。使用此类绑定到对象、读取属性和更新特性。DirectoryEntry 与帮助器类一起为生存期管理和导航方法提供支持,包括创建、删除、重命名、移动子节点和枚举子级。
https://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry_members(v=vs.80).aspx
DirectorySearcher:顾名思义这个对象是主要执行针对Active Directory域服务的查询。
https://msdn.microsoft.com/zh-cn/library/system.directoryservices.directorysearcher(v=vs.110).aspx
目前我的域控服务器在域上AD对象结构如下:
一段示例代码,目的是查询用户李四
1 static void Main(string[] args) 2 { 3 //声明一个AD对象搜索器 4 DirectorySearcher searcher = new DirectorySearcher(); 5 //设置此搜索器的搜索起点 6 searcher.SearchRoot = DomainRootEntry(); 7 //设置此搜索器的搜索语句 8 searcher.Filter = "(&(objectClass=user)(name=李四))"; 9 //设置此搜索器的查询范围 10 searcher.SearchScope = SearchScope.Subtree; 11 //执行查询,有FindOne与FindAll之别 12 SearchResult result = searcher.FindOne(); 13 if (result != null) 14 { 15 //转换为李四对象 16 DirectoryEntry userEntry = result.GetDirectoryEntry(); 17 } 18 } 19 /// <summary> 20 /// 域控服务器IP 21 /// </summary> 22 private static string DomainServiceIP = "192.168.241.3"; 23 /// <summary> 24 /// 域控服务器用户名 25 /// </summary> 26 private static string UserName = @"Domain"; 27 /// <summary> 28 /// 域控服务器密码 29 /// </summary> 30 private static string Password = "p@ssw0rd"; 31 32 /// <summary> 33 /// 获取域控服务器中域节点对象 34 /// </summary> 35 public static DirectoryEntry DomainRootEntry() 36 { 37 DirectoryEntry rootEntry = null; 38 try 39 { 40 rootEntry = new DirectoryEntry("LDAP://" + DomainServiceIP, UserName, Password); 41 return rootEntry; 42 } 43 catch (Exception ex) 44 { 45 throw ex; 46 } 47 }
这里的DirectoryEntry对象封装 Active Directory 域层次结构中的节点对象。通过DirectorySearcher搜索器来查询用户李四。如代码所示DirectorySearcher对象使用有几个地方要了解。
SearchRoot:获取或设置一个值(DirectoryEntry对象,一般为DC或者OU),该值指示 Active Directory 域服务层次结构中的节点,从该节点处开始搜索。说白了就是说我这个查询器查询从这个节点开始向下查询包括这个节点。
SearchScope:获取或设置指示服务器遵循的搜索范围的值。为SearchScope的enmu类型。
1 //指定使用 System.DirectoryServices.DirectorySearcher 对象执行的目录搜索的可能范围。 2 public enum SearchScope 3 { 4 // 将搜索限于基对象。结果最多包含一个对象。当 System.DirectoryServices.DirectorySearcher.AttributeScopeQuery 5 // 属性指定用于某一搜索时,搜索范围必须设置为 System.DirectoryServices.SearchScope.Base。 6 Base = 0, 7 // 搜索基对象的直接子对象,但不搜索基对象。 8 OneLevel = 1, 9 // 搜索整个子树,包括基对象及其所有子对象。如果未指定目录搜索的范围,则执行 System.DirectoryServices.SearchScope.Subtree 10 // 类型的搜索。 11 Subtree = 2 12 }
FindOne();与FindAll();的区别:FindOne执行搜索返回搜索过程中找到的第一项,返回结果为一个System.DirectoryServices.SearchResult对象。而FindAll执行搜索并返回找到的项的集合,返回结果是System.DirectoryServices.SearchResultCollection对象。
剩下的就是这个Filter比较复杂了,我们继续往下看。
Filter语法详解及属性扩充
Filter:(官方解读为:搜索过滤器)它为DirectorySearcher(搜索器)定义一个搜索条件,为的是使我们的搜索器更有效的搜索。有点像ADO中的T-SQL语句。Filter属性值以 LDAP 格式表示的筛选条件,用Unicode字符串表示。下表列出了一些例子。
Search filter(搜索过滤器) | Description(描述) |
"(objectClass=*)" | 所有的对象。 |
"(&(objectCategory=person)(objectClass=user)(!cn=andy))" | 所有的用户对象,但“andy”除外 |
"(sn=sm*)" | 所有对象的满足姓氏从“SM”开头。 |
"(&(objectClass=user)(name=李四))" | 所有名称为李四的用户对象 |
Filter语法详解:
表达式:属性名=Value
通配符:“*”,该字符出现在表达式Value中,匹配该字符位置后的内容,类似于SQL中的“%”;例子如下:
|
Description(描述) | |
”(objectClass=*)“ | 得到所有对象 | |
“(cn=*bob*)” | 得到的对象,名称含有“bob”: | |
”(&(objectClass=user)(email=*))“ | 得到包含电子邮件属性的所有用户: |
逻辑运算符:
Logical operator(逻辑运算符) | Description(描述) |
= | 等于 |
& | 和 |
| | 或 |
! | 非 |
~= | 约等于 |
<= | 字典序小于或者等于 |
>= | 字典序大于或者等于 |
语法类型:(Key=Value)为一个表达式,两个表达式满足某些条件(|或、&且、!非)则放在两个表达前面并用括号括起来。如:(&(objectClass=user)(mobile=132*)) ,电话为132开头的所有用户。(&(表达式1=value)(表达式2=value)),该filter结果为取表达式1和表达式2同时匹配的内容。
特殊字符:如果以下任何特殊字符必须出现在搜索过滤的文字中,他们必须通过的转义替换。
ASCII字符 | 转义替代 |
* | \2a |
( | \28 |
) | \29 |
\ | \5c |
NULL | \00 |
/ | \2f |
DirectorySearcher.Filter类型属性扩充说明(不区分大小写):
筛选条件 | 值 |
域 | (objectClass=domainDNS) |
组织单位 | (objectClass=organizationalUnit) |
用户 | (&(objectCategory=person)(objectClass=user))或者(&(objectClass=User)(!objectClass=computer)) |
计算机 | (objectCategory=computer) |
组 | (objectCategory=group) |
联系人 | (objectCategory=contact) |
共享文件夹 | (objectCategory=volume) |
打印机 | (objectCategory=printQueue) |
以上是一些常用类型检索条件,值得注意的是(objectClass=user)并不只是检索用户还包括计算机。所以要要做处理。当然检索的条件不知以上这些。AD中对象的属性都可以做检索条件,我们最后看看AD中的对象属性有哪些是我们常用的。
Active Directory常用属性
用户(User)常用选项卡中的属性
选项卡项名 | 属性名 | 备注 |
名称 | name | 在同一节点下唯一,string |
姓(L) | sn | string |
名(F) | givenName | string |
英文缩写(I) | initials | string |
显示名称(S) | displayName | 域内不唯一,但是在同一个组织单位内唯一 |
描述(D) | description | string[] |
办公室(C) | physicalDeliveryOfficeName | string |
电话号码(T) | telephoneNumber | string |
电子邮件(M) | string | |
网页(W) | wWWHomePage | string |
选项卡项名 | 属性名 | 备注 |
用户登录名(U) | userPrincipalName | 全域内唯一,string |
用户登录名(Windows 2000 以前版本)(W) | sAMAccountName | 全域内唯一,string |
选项卡项名 | 属性名 | 备注 |
国家/地区(O) | co | string |
省/自治区(V) | st | string |
市/县(C) | l | string |
街道(S) | streetAddress | string |
邮政信箱(B) | postOfficeBox | string[] |
邮政编码(Z) | postalCode | string |
选项卡项名 | 属性名 | 备注 |
家庭电话(M) | homePhone | string |
寻呼机(P) | pager | string |
移动电话(B) | mobile | string |
传真(F) | facsimileTelephoneNumber | string |
IP电话(I) | ipPhone | string |
注释 | info | string |
选项卡项名 | 属性名 | 备注 |
公司(C) | company | string |
部门(D) | department | string |
职务(J) | title | string |
经理-姓名(N) | manager | string |
直接下属(E) | directReports | string[] |
组织单位(Organizational Unit)常用选项卡中的属性
选项卡项名 | 属性名 | 备注 |
名称 | name | 在同一节点下唯一,string |
描述(D) | description | string[] |
国家/地区(O) | co | string |
邮政编码(Z) | postalCode | string |
省/自治区(V) | st | string |
市/县(C) | l | string |
街道(S) | street | string |
Active Directory的隐藏通用属性
这一部分属性,在选项卡上是看不到的,必须在【属性编辑器】中才能查看到:
属性 | 备注 |
objectGUID | 全域内唯一,对象创建时自动生成的,16进制所以在DirecotryEntry中接受时要做数据处理。 |
distinguishedName | 全域内唯一,对象创建或者移动时自动生成。详细请看上章。 |
objectClass | 对象创建时自动创建 |
cn | 常用于User或者Computer,与name相同。 |
ou | 常用于Ou,与name同属性。 |
大约整理出这些常用属性,若想查看更多有两种方式:第一种查看属性的属性编辑器,第二种遍历DirectoryEntry.Properties.PropertyNames;
结语
这些属性根据业务场景不同用的多少也会不同。有时候可能会使用一些不常用的属性存储与业务处理有关的数据,因为AD中的数据存储不想关系型数据库,所以在AD中一些不常用的属性我们会根据不同业务场景去为逻辑变成做铺垫。Filter语法的话其实和LDAP协议有着很密切的关系但这里就不说了。主要是DirectoryEntry和DirectorySearcher这两个类对象,在后面DirectoryEntry做AD编程时将无处不在,它是一个入口。鉴于目前.NET Core 没有更新System.DirectoryServices;。所以以后若使用PowerShell那就另外再说了。
本章最后更新时间:2017年4月23日18:10:13
作者:IFire47 出处:http://www.cnblogs.com/IFire47/
转载于:https://www.cnblogs.com/IFire47/p/6751188.html
Active Directory的DirectoryEntry与DirectorySearcher初识及Filter语法相关推荐
- Active Directory之AD对象
1.概述 在这篇文章中,我们将讨论不同的 Active Directory 对象及其基本概念,例如: 为什么域中需要 Active Directory 对象 如何创建它们? 如何枚举 Active D ...
- 如何验证 Active Directory 使用表单身份验证和 Visual C#.NET
本文引用下面的 Microsoft.NET 框架类库名称空间: System.Text System.DirectoryServices System.Security.Principal Syste ...
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
转自:http://blog.csdn.net/lingpaoershiyishiji/article/details/9139527 目录 示例准备 知识了解 读取AD域信息示例 Directory ...
- 优化.NET访问Active Directory的性能
从Active Directory获取大量对象时应特别注意,一不小心,就会掉入性能瓶颈甚至引起内存泄漏.本文提供了一个关于.NET访问Active Directory的优化例子. 1.获取对象的属性值 ...
- Lock/Unlock Account - Active Directory
根据IsAccountLocked属性来判断Account是否Lock/Unlock,因为LDAP provider不支持IsAccountLocked属性,这里采用WinNT Provider:(注 ...
- 查找计算机 域服务不可用,win7系统打印文件提示Active Directory域服务不可用解决方法...
办公用户因为工作需要,就需要安装打印机,也是办公设备中不可缺少一部分,使用过程中难免遇到一些故障问题,Win7系统打印文件时频繁弹出提示"Active Directory域服务当前不可用&q ...
- Active Directory 账号迁移配置介绍
首先介绍一下环境: 生产域环境: example.cn 测试域环境: fengdian.info 系统平台: 2K08 R2 林.域功能级别:Windows Server 2008 要求: 测试域环境 ...
- 实战域树部署,Active Directory系列之十九
实战子域部署<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ...
- Powershell管理Active Directory 复制和拓扑
Powershell管理Active Directory 复制和拓扑 Active Directory 的 Windows PowerShell (AD) 支持复制和拓扑管理.它包含了管理复制.站点. ...
- Active Directory数据库复制原理
前面的博文中和大家聊了很多关于域的话题,比如说额外预控.域的恢复等,但是大家可否知道我们上面说的这些都是靠两个域之间的数据库相互复制实现的,那么域之间的数据究竟是如何复制的呢,下面我们就来聊聊域数据库 ...
最新文章
- 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
- Apache Beam欲通过uber api获取大数据
- POJ-1789 Truck History 最小生成树
- 微信企业号开发:启用回调模式
- [内核摘要] 虚拟文件系统
- 2008文件服务器迁移,Windows2008及早期服务器DHCP的数据迁移方法
- java rpc与webservice_RPC体系,RPC和WebService的区别详解
- php 关闭 row,MySql php:检查Row是否存在
- [转] 数据挖掘 机器学习 模式识别的关系
- 【CC评网】2013.第44周 把握每天的第一个小时
- BIM族库下载——Revit管道卡箍连接族
- Django学习笔记之form组件的局部钩子和全局钩子
- “24岁,一门手艺,年入百万”:真正厉害的人,都做到了这4件事
- 微信如何创建自己的小程序?
- 优动漫PAINT入门小知识——拾色器功能
- Request header field xxx is not allowed by Access-Control-Allow-Headers in preflight respon
- mongodb 批量转换大写字符
- 【无标题】AD导入CAD文件发现找不到图形
- C#网络爬虫抓取小说
- bootstrapvalidator已定义的验证规则
热门文章
- Springboot集成Activiti7
- 模块化,组件化,插件化简析
- 中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]
- php毕设周记,毕设周记录如何写的
- H3C网络暑期培训大作业-某银行支行内部网络整改方案
- 【SCI文献下载】手把手教你如何免费下载SCI文献
- php特效表白代码,js爱心表白动画特效代码
- 【一周头条盘点】中国软件网(2018.1.15~2018.1.19)
- 联想官方出品小工具:关闭或开启 Win10 系统自动更新
- 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版