如何利用C#代码来进行操作AD

来源:互联网 发布:java oa系统 源代码 编辑:程序博客网 时间:2024/06/07 12:05
要用代码访问 Active Directory域服务,需引用System.DirectoryServices命名空间,该命名空间包含两个组件类,DirectoryEntry DirectorySearcherDirectoryEntry类可封装 ActiveDirectory域服务层次结构中的节点或对象,使用此类绑定到对象、读取属性和更新特性;使用DirectorySearcher类可对 Active Directory域服务层次结构执行查询。

如果仅要对AD的组织单元,群组和用户进行查询或者更改属性,使用上述两个类即可。下面给出的是查询在AD中某个组织单元下的所有用户部分代码:

[csharp] view plaincopy
  1. DirectoryEntry objDE = new DirectoryEntry(strADRootPath, strADAccount, strADPassword);  
  2. string strFilter = "(&(objectCategory=person)(objectClass=user))";  
  3. DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter);  
  4. //排序  
  5. objSearcher.Sort = new SortOption("name", SortDirection.Ascending);  
  6. 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=COMXX.XX.XX.XX为服务器IP);ADAccountADPwdAD用户的账户和密码,如果是管理员则可以进行任何操作,普通只能进行查询操作。

执行上述代码即可获取到在某个指定组织单元的所有用户,搜索结果存放在src中,要读取用户属性值可使用下面代码:

[csharp] view plaincopy
  1. //获取用户的名称和账户  
  2. foreach (SearchResult sr in src)  
  3. {  
  4. strUserName=sr.Properties["name"][0].ToString();  
  5. strUserName= sr.Properties["userPrincipalName"][0].ToString();  
  6. }  

值得注意的是因为在创建AD用户的时候填写的用户信息不同,每个AD用户所具有的属性都不一定相同,建议使用如下方法进行取值:

[csharp] view plaincopy
  1. if (sr.Properties.Contains("sn"))  
  2. {  
  3.     strFirstName = sr.Properties["sn"][0].ToString();//姓  
  4. }  
  5. if (sr.Properties.Contains("givenName"))  
  6. {  
  7.     strLastName = sr.Properties["givenName"][0].ToString();//名  
  8. }  

要知道一个用户的所有属性可使用如下代码:

[csharp] view plaincopy
  1. foreach (string strPropNamein sr.Properties.PropertyNames)  
  2. {  
  3.     Console.WriteLine(strPropName);  
  4. }  

还有一种读取AD用户属性字段值的方法:

[csharp] view plaincopy
  1. foreach (SearchResult sr in src)  
  2. {  
  3.     DirectoryEntry myde = sr.GetDirectoryEntry();  
  4.     strGuid = myde.Guid.ToString();//用户Guid,创建用户时由系统自动生成  
  5.     strParentGuid = myde.Parent.Guid.ToString();//用户所在组织单元的Guid  
  6.     myde.Properties["name"][0].ToString();//用户名称  
  7. }  

同样的,如果要得到是AD组织单元或者群组的话也是这么做,对应于组织单元筛选字符串可以这么写:

[csharp] view plaincopy
  1. //字符筛选器,筛选类型为OU的对象  
  2. string strFilter = "(&(objectCategory=organizationalUnit)(objectClass=organizationalUnit))";  

群组的筛选字符串:

[csharp] view plaincopy
  1. string strFilter = "(&(objectCategory=group)(objectClass=group))";  

上面是对AD的查询操作,如果查询之后需要修改,仅需要做些许变动,下面是修改用户属性部分代码:

[csharp] view plaincopy
  1. foreach (SearchResult sr in src)  
  2. {  
  3.     string strUserName = sr.Properties["name"][0].ToString();  
  4.     //targetUserName:要修改用户名称  
  5.     if (strUserName.Equals(targetUserName))  
  6.     {  
  7.         DirectoryEntryde = sr.GetDirectoryEntry();  
  8.         de.Properties["sn"].Value = m_User.FirstName;//姓                        
  9.         de.Properties["givenName"].Value = m_User.LastName;//名  
  10.         de.Properties["mobile"].Value = m_User.Mobile;//移动电话                      
  11.         de.CommitChanges();  
  12.     }  
  13. }  

修改AD组织单元或者群组也是用类似的方法。值得注意的是,在AD中有些属性是拒绝修改的,一旦修改了不允许修改的属性,会被服务器拒绝或者出现服务器不愿意执行该操作异常。

若要向AD中添加用户,组织单元或者群组的话也是需要通过DirectoryEntry来添加,如下是向AD的指定路径添加一个用户:

[csharp] view plaincopy
  1. public bool AddUser2AD(string strUserName, string strSAMAccountname,  
  2.                         string strPassword, string strPath)  
  3. {  
  4.     string strname = "CN=" + strUserName;  
  5.     try  
  6.     {  
  7.         // strADAccount ,strADPassword为AD管理员账户和密码  
  8.         DirectoryEntry objDE = new DirectoryEntry(strPath, strADAccount, strADPassword);  
  9.         DirectoryEntries objDES = objDE.Children;  
  10.         DirectoryEntry myDE = objDES.Add(strname, "User");  
  11.         myDE.Properties["userPrincipalName"].Value = strSAMAccountname;  
  12.         myDE.Properties["name"].Value = strUserName;  
  13.         myDE.Properties["sAMAccountName"].Value = strSAMAccountname;  
  14.         myDE.CommitChanges();  
  15.   
  16.         //设置密码                
  17.         IADsUser objUser = myDE.NativeObject as IADsUser;  
  18.         objUser.SetPassword(strPassword);  
  19.         //设置用户状态:密码永不过期(65536)+用户正常(512)= 66048  
  20.         objUser.Put("userAccountControl", 66048);  
  21.         objUser.SetInfo();  
  22.     }  
  23.     catch  
  24.     {  
  25.         return false;  
  26.     }  
  27.     return true;  
  28. }  

特别要注意最后几行设置用户密码和账户状态代码。如果myDE.CommitChanges()后面的代码没有;,那么在AD里面创建的用户是禁用状态,并且密码为空。如果在AD中直接写:

[csharp] view plaincopy
  1. myDE.Password = strPassword;  
  2. myDE.Properties["userAccountControl"].Value = 66048;  

是会失败的。这里我们可以利用ActiveDs.dllActiveDs是一个AD服务相关应用程序COM接口,里面提供了设置密码,修改密码,获取属性值的一些方法。按照如上写法即可创建正常的AD用户,切用户密码永不过期。

解释一下userAccountControl,该属性记录了用户的AD账号信息,是一组16进制数,该属性标志是累积性的。若要禁用用户的帐户,将userAccountControl属性设置为 0x0202 (0x002 + 0x0200)。在十进制中,它是 514 (2 + 512);若要启用账户且密码永不过期,请将 userAccountControl属性设置为 0x10200 (0x10000 + 0x0200),十进制为66048

若想要修改用户密码的话也可以使用ActiveDs提供的方法:

[csharp] view plaincopy
  1. DirectoryEntry obj = sr.GetDirectoryEntry();  
  2. IADsUser objUser = obj.NativeObject as IADsUser;  
  3. objUser.ChangePassword(strOldPassword, strNewPassword);  
  4. objUser.SetInfo();  

最后提供一个验证AD用户身份的方法以资参考:

[csharp] view plaincopy
  1.  /// <summary>  
  2.  ///验证用户登录  
  3.  ///</summary>  
  4.  ///<param name="strUserAccount">用户账户</param>  
  5.  ///<param name="strPassword">用户密码</param>  
  6.  ///<returns>验证通过则返回true,否则返回false</returns>  
  7. public static bool VerifyUserLogin(string strUserAccount, stringstrPassword)  
  8.  {  
  9.     try  
  10.     {  
  11.         // strADRootPath为该组织单元路径  
  12.         DirectoryEntry objDE = newDirectoryEntry(strADRootPath, strUserAccount, strPassword);                  
  13.         DirectorySearcher objSerach = new DirectorySearcher(objDE);  
  14.         SearchResult sr = objSerach.FindOne();  
  15.         return true;  
  16.     }  
  17.     catch  
  18.     {  
  19.         return false;  
  20.     }  
  21.  }  

以上便是利用C#来操作AD的大致方法。另外稍微整理了一下自己在摸索利用C#操作AD时候写的部分代码,有需要的网友可以下来看看:http://download.csdn.net/detail/jgwen/4494765

 

参考资料:

AD 用户属性userAccountControl的详细解释:http://microbear.blog.51cto.com/307131/306220。

ActiveDirectory如何用C#进行增加、删除、修改、查询用户与组织单位!:http://weiweictgu.cnblogs.com/archive/2006/07/13/449932.html