要用代码访问 Active Directory域服务,需引用System.DirectoryServices命名空间,该命名空间包含两个组件类,DirectoryEntry和 DirectorySearcher。DirectoryEntry类可封装 ActiveDirectory域服务层次结构中的节点或对象,使用此类绑定到对象、读取属性和更新特性;使用DirectorySearcher类可对 Active Directory域服务层次结构执行查询。

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

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用户的账户和密码,如果是管理员则可以进行任何操作,普通只能进行查询操作。

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

//获取用户的名称和账户
foreach (SearchResult sr in src)
{  strUserName=sr.Properties["name"][0].ToString();  strUserName= sr.Properties["userPrincipalName"][0].ToString();
}  

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

if (sr.Properties.Contains("sn"))
{  strFirstName = sr.Properties["sn"][0].ToString();//姓
}
if (sr.Properties.Contains("givenName"))
{  strLastName = sr.Properties["givenName"][0].ToString();//名
}  

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

foreach (string strPropNamein sr.Properties.PropertyNames)
{  Console.WriteLine(strPropName);
}  

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

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组织单元或者群组的话也是这么做,对应于组织单元筛选字符串可以这么写:

//字符筛选器,筛选类型为OU的对象
string strFilter = "(&(objectCategory=organizationalUnit)(objectClass=organizationalUnit))";  

群组的筛选字符串:

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中有些属性是拒绝修改的,一旦修改了不允许修改的属性,会被服务器拒绝或者出现服务器不愿意执行该操作异常。

若要向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

转载于:https://www.cnblogs.com/mqxs/p/3498774.html

【转】 如何利用C#代码来进行操作AD相关推荐

  1. oracle中修改多个字段默认值_利用VBA代码在已有的数据表中删除、添加、修改字段...

    大家好,今日继续给大家讲解VBA数据库解决方案的第21讲,如何利用VBA代码在已有的数据表中删除,添加,修改字段.这个内容是操作数据库的一项必修的内容,还望大家在实际工作中多利用,所以这节的知识,对于 ...

  2. 利用对象池优化数据库操作

    简介:这是利用对象池优化数据库操作的详细页面,介绍了和asp.net,.Net,创建,对象池,示例有关的知识,要查看更多相关信息,请点击此处 说到对象池,大家都不陌生.很多人都实现过,网上的代码也满天 ...

  3. html段落自动删除,利用JS代码自动删除稿件的普通弹幕功能

    事情的起因是在b站投稿了一个高级弹幕测试的视频(av9940487),但是由于b站的弹幕池机制是新的弹幕顶掉旧的弹幕,所以导致一些人发的高级弹幕很快就被顶掉了. 所以就想着写个脚本来自动删除属性为普通 ...

  4. Android手机上,利用bat脚本模拟用户操作

    大家可能会遇到这样的情景: #  也许你是一个通过App的销售人员,需要不断靠App的点击率来拿利润 #  也许你是一个个人开发者,想要自己写个脚本点击banner广告 #  也许你是一个业务经理,你 ...

  5. 如何利用MAXScript代码进行DNA双螺旋结构的创建

    在以前,我讲过如何利用3ds MAX中的阵列进行DNA双螺旋结构的创建,但是有与MAXScript也能够实现在3DS MAX界面中的大部分功能,而且得到的结构更加的精确,所以这一片博客中我主要讲述,如 ...

  6. word vba 转换html,快速合并文本到Word – 利用VBA代码

    为了提高录入的效率,同事分别安排下属录入不同的文本,并以数字序号进行命名,最后再在Word中将这些文本文档合并起来.常规的方法是切换到"插入"选项卡,在"文本" ...

  7. python计算器程序_利用Python代码编写计算器小程序

    1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...

  8. 伙伴云戴志康:如何利用低代码提升研发和IT效能

    嘉宾 | 戴志康   整理 | 小雨青年 出品 | CSDN云原生 2022年6月28日,在CSDN云原生系列在线峰会第11期"低代码峰会"上,伙伴云CEO戴志康从低代码与研发.I ...

  9. python自动操作微信_微信全智能机器人测试,Python代码实现自动化操作,玩转智能应答...

    原标题:微信全智能机器人测试,Python代码实现自动化操作,玩转智能应答 本文为微信智能回复相关python项目,通过模拟网页端微信接口,实现跟好友之间自动的回复,并接入了图灵智能库,进行相应的内容 ...

最新文章

  1. 12种主流编程语言输出“ Hello World ”,把我给难住了!
  2. Python 开源项目 Top 10 精选(平均star为1128)
  3. 神秘使者到 Java 帝国传道协程,竟被轰了出去!
  4. 自建邮件服务器给企业带来的商业价值
  5. Netty 和 RPC 框架线程模型分析
  6. 中秋我用CSS写了个嫦娥奔月
  7. 使用Logstash filter grok过滤日志文件
  8. 决定对SQL Server 2008 R2进行升级
  9. Impala ODBC 安装笔记
  10. python源代码文件_Python代码编译与反编译
  11. python 二分查找法
  12. oppoa79支持手机html,oppo a79驱动
  13. 电信dns地址是多少?
  14. DSL是什么意思?Mbps是什么意思?
  15. 斐波那契常见规律(总结)
  16. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)
  17. ios写python_iOS开发之 使用python自动化打包
  18. 8、开发工具软件 - 软件技术系列文章
  19. 蓝的成长记——追逐DBA(20):何故缘起,建库护航 (二次发布-练习使用markdown编辑)
  20. android lcm,MTK Android Driver :lcm

热门文章

  1. Linux编译安装nginx详细步骤
  2. 映射java是什么_java – 映射,绑定和解析有什么区别?
  3. Recorder︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
  4. SynchronousQueue
  5. 20145209 2016-2017-2 《Java程序设计》第4周学习总结
  6. Parallels中使用加密狗读取文件出现错误
  7. Oracle中函数/过程返回结果集的几种方式
  8. 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
  9. 缓存热点问题解决方案
  10. django数据库处理