C#操作Active Directory(AD)详解
.Net提供了专用类操作AD,本文详细介绍使用C#操作AD的方法。
一、系统环境
系统环境:Windows Server 2008 R2, VS2010, .Net Framework 4.0
AD Server:LDAP的server IP
基本DN:OU=user,DC=Company,DC=com
用来登录的管理员:Peter
密码:ab#CD%1234
二、程序
1. 引用
.Net操作AD的类在命名空间System.DirectoryServices下,需要将该类引用进来。
2. 连接
要操作AD需首先连接AD,就象要操作数据先要连接数据库一样。
/// <summary> /// 获得DirectoryEntry对象实例,以管理员登陆AD /// </summary> /// <returns></returns> private static DirectoryEntry GetDirectoryObject() { DirectoryEntry entry = null; try { entry = new DirectoryEntry("LDAP://10.10.10.16", "Peter", " ab#CD%1234", AuthenticationTypes.Secure); } catch (Exception ex) { } return entry; }
3. 查询
根据各种条件获取具体的用户。下例为根据公共名称获取对象。
/// <summary> /// 根据用户公共名称取得用户的 对象 /// </summary> /// <param name="commonName">用户公共名称</param> /// <returns>如果找到该用户则返回用户的对象,否则返回 null</returns> public static DirectoryEntry GetDirectoryEntry(string commonName) { DirectoryEntry de = GetDirectoryObject(); DirectorySearcher deSearch = new DirectorySearcher(de); deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName.Replace("\", "") + "))"; deSearch.SearchScope = SearchScope.Subtree; try { SearchResult result = deSearch.FindOne(); de = new DirectoryEntry(result.Path); return de; } catch (Exception ex) { return null; } }
4. 修改用户
修改查询到的Entity的值,修改后将修改记录保存到AD。注意有两种保存属性的方式。具体使用哪种请参考帮助。
1) 直接修改属性
2) 通过invoke来触发AD的内置函数
/// <summary> /// 修改查询到的用户 /// </summary> /// <param name="CommonName">通用名(displayName,系统中显示的中文字)</param> /// <param name="Account">帐户名(如Peter)</param> /// <param name="organizeName">组织单元名(资讯中心)</param> /// <param name="password">密码</param> public static string ChangeADAccount(string CommonName, string Account, string password) { //获取对应AD实体 DirectoryEntry user = GetDirectoryEntry( commonName); try { ADHelper.SetProperty(user, " sAMAccountName ", Account); user.Invoke("SetPassword", new object[] { password }); user.CommitChanges(); } catch (Exception e) { throw e; } return user.Path; } /// <summary> /// 设置指定的属性值 /// </summary> /// <param name="de"></param> /// <param name="propertyName">属性名称?</param> /// <param name="propertyValue">属性值</param> public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue) { if (de.Properties.Contains(propertyName)) { if (String.IsNullOrEmpty(propertyValue)) { de.Properties[propertyName].RemoveAt(0); } else { de.Properties[propertyName][0] = propertyValue; } } else { if (!String.IsNullOrEmpty(propertyValue)) { de.Properties[propertyName].Add(propertyValue); } } }
5. 修改OU
1) 获取OU
DirectoryEntry OUEntry = new DirectoryEntry(GetOrganizeNamePath(OUName), "Peter", " ab#CD%1234", AuthenticationTypes.Secure); /// <summary> /// 获得OU的Path /// </summary> /// <param name="organizeUnit">OU名</param> /// <returns></returns> public static string GetOrganizeNamePath(string organizeUnit) { StringBuilder sb = new StringBuilder(); sb.Append(ADPath); sb.Append("/"); return sb.Append(SplitOrganizeNameToDN(organizeUnit)).ToString(); }
2) 修改OU项
OUEntry.Rename("OU=" + newOUName); OUEntry.CommitChanges();
3) 删除OU
DirectoryEntry OUParent = OUEntry.Parent; OUParent.Children.Remove(OUEntry); OUParent.CommitChanges();
6. 修改组
1) 获取组
/// <summary> /// 获取AD组 /// </summary> /// <param name="groupName"></param> /// <param name="organizeUnit"></param> /// <returns></returns> public static DirectoryEntry GetADGroupInOU(string groupName, string organizeUnit) { if (!String.IsNullOrEmpty(groupName)) { DirectoryEntry de = new DirectoryEntry(GetOrganizeNamePath(organizeUnit) , "Peter", " ab#CD%1234", AuthenticationTypes.Secure); ; DirectorySearcher deSearch = new DirectorySearcher(de); deSearch.Filter = "(&(objectClass=group)(cn=" + groupName.Replace("\", "") + "))"; deSearch.SearchScope = SearchScope.Subtree; try { SearchResult result = deSearch.FindOne(); if (result != null) { de = new DirectoryEntry(result.Path, adminName, adminPassword); } else { return null; } return de; } catch (Exception ex) { return null; } } else { return null; } }
2) 管理组成员
group.Properties["member"].Add(user.Properties["distinguishedName"].Value); group.Properties["member"].Remove(user.Properties["distinguishedName"].Value);
三、查看AD User属性结果
在程序中修改了User属性后我们要检验一下是否被修改了,有三种方式查看AD中User属性:
1. Active Directory Users and Computers
打开Active Directory Users and Computers,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。在该属性页只能看到一些常用的属性。
2. Exchange Management Console
打开Exchange Management Console,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。单击Customer Attributes按钮可以查看自定义的属性。
3. adsiedit.msc
以上两种方式所看到的属性都不全,要看到所有属性需使用adsiedit.msc工具。
在运行窗口中输入adsiedit.msc后打开本工具。选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。
- 推荐文章
- 欧拉函数
- [NOIP2016] 蚯蚓
- 剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题
- 快速理解Java中的五种单例模式
- 剑指Offer-第一章面试细节总结
- 快速了解产品经理的三大关注点
- CSU 1425 NUDT校赛 I题 Prime Summation
- CSU_1414 Query On a Tree BFS序+DFS时间戳进行预处理
- UVALive 3704 细胞自动机 矩阵快速幂
- UVA 11019 二维匹配 AC自动机
- UVA 11468 AC 自动机
- UVA 11732 链表+字典树
- UVALive 4670 AC自动机
- Z0J 3772 Calculate the Function 线段树+矩阵
- WOJ 1543 Array
- WOJ 1546 Maze 图论上的状态压缩DP
- poj 1961 Period 【KMP-next前缀数组的应用】
- poj 2406 Power Strings【字符串+最小循环节的个数】
- poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】
- poj 3414 Pots【bfs+回溯路径 正向输出】
- 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】
- 一道蓝桥比赛的训练打印题【构造+不断的构造+构造规律】
- poj 1679 The Unique MST 【次小生成树+100的小数据量】
- poj 2828 Buy Tickets 【买票插队找位置 输出最后的位置序列+线段树】
- 【转载】素数快速打表(据说是线性复杂度)
- HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
- yifan的数组
- Tempter of the Bone
- 最短路
- 排列2