若是仅要对AD的组织单元,群组和用户进行查询或者更改属性,使用上述两个类便可。下面给出的是查询在AD中某个组织单元下的全部用户部分代码:html
DirectoryEntry objDE = new DirectoryEntry(strADRootPath, strADAccount, strADPassword); string strFilter = "(&(objectCategory=person)(objectClass=user))"; DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter); //排序 objSearcher.Sort = new SortOption("name", SortDirection.Ascending); SearchResultCollection src = objSearcher.FindAll();
其中ADPath是要查询组织单元的所在的LDAP,其格式为:LDAP:\\ OU=XX部门,OU=XX公司,DC=域名,DC=COM,若是链接到的AD是在服务器上那么格式写成LDAP:\\XX.XX.XX.XX\ OU=XX部门,OU=XX公司,DC=域名,DC=COM(XX.XX.XX.XX为服务器IP);ADAccount和ADPwd为AD用户的帐户和密码,若是是管理员则能够进行任何操做,普通只能进行查询操做。spring
执行上述代码便可获取到在某个指定组织单元的全部用户,搜索结果存放在src中,要读取用户属性值可以使用下面代码:服务器
//获取用户的名称和帐户 foreach (SearchResult sr in src) { strUserName=sr.Properties["name"][0].ToString(); strUserName= sr.Properties["userPrincipalName"][0].ToString(); }
值得注意的是由于在建立AD用户的时候填写的用户信息不一样,每一个AD用户所具备的属性都不必定相同,建议使用以下方法进行取值:ui
if (sr.Properties.Contains("sn")) { strFirstName = sr.Properties["sn"][0].ToString();//姓 } if (sr.Properties.Contains("givenName")) { strLastName = sr.Properties["givenName"][0].ToString();//名 }
要知道一个用户的全部属性可以使用以下代码:spa
foreach (string strPropNamein sr.Properties.PropertyNames) { Console.WriteLine(strPropName); }
还有一种读取AD用户属性字段值的方法:.net
foreach (SearchResult sr in src) { DirectoryEntry myde = sr.GetDirectoryEntry(); strGuid = myde.Guid.ToString();//用户Guid,建立用户时由系统自动生成 strParentGuid = myde.Parent.Guid.ToString();//用户所在组织单元的Guid myde.Properties["name"][0].ToString();//用户名称 }
一样的,若是要获得是AD组织单元或者群组的话也是这么作,对应于组织单元筛选字符串能够这么写:code
//字符筛选器,筛选类型为OU的对象 string strFilter = "(&(objectCategory=organizationalUnit)(objectClass=organizationalUnit))";
群组的筛选字符串:htm
string strFilter = "(&(objectCategory=group)(objectClass=group))";
上面是对AD的查询操做,若是查询以后须要修改,仅须要作些许变更,下面是修改用户属性部分代码:对象
foreach (SearchResult sr in src) { string strUserName = sr.Properties["name"][0].ToString(); //targetUserName:要修改用户名称 if (strUserName.Equals(targetUserName)) { DirectoryEntryde = sr.GetDirectoryEntry(); de.Properties["sn"].Value = m_User.FirstName;//姓 de.Properties["givenName"].Value = m_User.LastName;//名 de.Properties["mobile"].Value = m_User.Mobile;//移动电话 de.CommitChanges(); } }
修改AD组织单元或者群组也是用相似的方法。值得注意的是,在AD中有些属性是拒绝修改的,一旦修改了不容许修改的属性,会被服务器拒绝或者出现服务器不肯意执行该操做异常。blog
若要向AD中添加用户,组织单元或者群组的话也是须要经过DirectoryEntry来添加,以下是向AD的指定路径添加一个用户:
public bool AddUser2AD(string strUserName, string strSAMAccountname, string strPassword, string strPath) { string strname = "CN=" + strUserName; try { // strADAccount ,strADPassword为AD管理员帐户和密码 DirectoryEntry objDE = new DirectoryEntry(strPath, strADAccount, strADPassword); DirectoryEntries objDES = objDE.Children; DirectoryEntry myDE = objDES.Add(strname, "User"); myDE.Properties["userPrincipalName"].Value = strSAMAccountname; myDE.Properties["name"].Value = strUserName; myDE.Properties["sAMAccountName"].Value = strSAMAccountname; myDE.CommitChanges(); //设置密码 IADsUser objUser = myDE.NativeObject as IADsUser; objUser.SetPassword(strPassword); //设置用户状态:密码永不过时(65536)+用户正常(512)= 66048 objUser.Put("userAccountControl", 66048); objUser.SetInfo(); } catch { return false; } return true; }
特别要注意最后几行设置用户密码和帐户状态代码。若是myDE.CommitChanges()后面的代码没有;,那么在AD里面建立的用户是禁用状态,而且密码为空。若是在AD中直接写:
myDE.Password = strPassword; myDE.Properties["userAccountControl"].Value = 66048;
是会失败的。这里咱们能够利用ActiveDs.dll。ActiveDs是一个AD服务相关应用程序COM接口,里面提供了设置密码,修改密码,获取属性值的一些方法。按照如上写法便可建立正常的AD用户,切用户密码永不过时。
解释一下userAccountControl,该属性记录了用户的AD帐号信息,是一组16进制数,该属性标志是累积性的。若要禁用用户的账户,将userAccountControl属性设置为 0x0202 (0x002 + 0x0200)。在十进制中,它是 514 (2 + 512);若要启用帐户且密码永不过时,请将 userAccountControl属性设置为 0x10200 (0x10000 + 0x0200),十进制为66048。
若想要修改用户密码的话也可使用ActiveDs提供的方法:
DirectoryEntry obj = sr.GetDirectoryEntry(); IADsUser objUser = obj.NativeObject as IADsUser; objUser.ChangePassword(strOldPassword, strNewPassword); objUser.SetInfo();
最后提供一个验证AD用户身份的方法以资参考:
/// <summary> ///验证用户登陆 ///</summary> ///<param name="strUserAccount">用户帐户</param> ///<param name="strPassword">用户密码</param> ///<returns>验证经过则返回true,不然返回false</returns> public static bool VerifyUserLogin(string strUserAccount, stringstrPassword) { try { // strADRootPath为该组织单元路径 DirectoryEntry objDE = newDirectoryEntry(strADRootPath, strUserAccount, strPassword); DirectorySearcher objSerach = new DirectorySearcher(objDE); SearchResult sr = objSerach.FindOne(); return true; } catch { return false; } }
原文地址:http://blog.csdn.net/dl020840504/article/details/10200227
其余文章推荐:http://www.cnblogs.com/springyangwc/archive/2012/02/07/2340987.html