快捷搜索:

C#操作Active Directory(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>用户公共名称</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>通用名(displayName,系统中显示的中文字)</param> /// <param>帐户名(如Peter)</param> /// <param>组织单元名(资讯中心)</param> /// <param>密码</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></param> /// <param>属性名称?</param> /// <param>属性值</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       

您可能还会对下面的文章感兴趣: