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后打开本工具。选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。