首先介绍一下命名空间System.DirectoryServices

System.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。该命名空间包含两个组件类,即 DirectoryEntryDirectorySearcher,它们使用 Active Directory 服务接口 (ADSI) 技术。ADSI 是 Microsoft 提供的一组接口,作为使用各种网络提供程序的灵活的工具。无论网络有多大,ADSI 都可以使管理员能够相对容易地定位和管理网络上的资源。

System.DirectoryServices 命名空间中的类可以与任何 Active Directory 服务提供程序一起使用。当前的一些提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 WinNT。

ADSI 是 Microsoft Active Directory 的编程接口,使应用程序能够只使用一个接口就可以与网络上的不同目录进行交互。使用 ADSI,可以创建一些应用程序,用以执行常见任务,如备份数据库、访问打印机和管理用户帐户。

假定您在使用这些类之前已大致了解 Active Directory。有关 Active Directory 的更多信息,请参见主题“Introduction to Active Directory Objects”(Active Directory 对象介绍)和“Active Directory Technology Backgrounder”(Active Directory 技术背景介绍),以及位于 http://www.microsoft.com/china/msdn/library 上的 MSDN library 中的以下主题:

  • Using Active Directory(使用 Active Directory)
  • Active Directory Service Interfaces(Active Directory 服务接口)
  • Lightweight Directory Access Protocol(轻型目录访问协议)
  • Implementing Active Directory Service Interfaces Providers(实现 Active Directory 服务接口提供程序)
  • Binding to an ADSI Object(绑定到 ADSI 对象)
  • Binding String(绑定字符串)

IADsOpenDSObject::OpenDSObjectIADsOpenDSObject::OpenDSObject

Active Directory 是一种树结构。树中的每个节点包含一组属性。使用此命名空间可遍历、搜索和修改树,以及读取和写入节点的属性。

DirectoryEntry 类封装 Active Directory 层次结构中的节点或对象。使用此类绑定到对象、读取属性和更新特性。DirectoryEntry 与帮助器类一起为生存期管理和导航方法提供支持,包括创建、删除、重命名、移动子节点和枚举子级。

使用 DirectorySearcher 类对 Active Directory 层次结构执行查询。LDAP 是系统提供的唯一一种支持搜索的 Active Directory 服务接口 (ADSI) 提供程序。

通过 DirectorySearcher 搜索 Active Directory 层次结构将返回 SearchResult 的实例,这些实例包含在 SearchResultCollection 类的实例中。

DirectoryEntry的应用

DirectoryEntry组件提供了Path属性,根据文档,此属性指定了目录服务中用来访问对象的对象名,其格式如下:

protocol://servername:port number/distinguished name

此语句的第一部分定义了访问将使用的协议,如

LDAP: (Lightweight Directory Access Protocol)

IIS: (提供IIS元数据来读及配置Internet Infomation Server)

WinNT: (提供在非常有限的性能下对Windows NT域的访问)

NDS: (提供对Novell Directory Service的访问)

等等(详细信息清参考MSDN)。

Example_ONE:操作IIS

操作IIS时,DirectoryEntry的Path的格式为:IIS://ComputerName/Service/Website/Directory

ComputerName:即操作的服务器的名字,可以是名字也可以是IP,经常用的就是localhost;
           Service:即操作的服务器,IIS中有Web,也有FTP,还有SMTP这些服务,我们主要是操作IIS的Web功能,因此此处就是"W3SVC",如果是FTP则应是"MSFTPSVC" ;
           WebSite:一个IIS服务中可以包括很多的站点,这个就用于设置操作的站点。他的值是一个数字,默认是1,表示缺省站点,如果有其它,则从1开始依次类推;

Directory:操作的目录名称,一个站点一般顶层目录为"ROOT",其它目录则是他的孩子(Child)。
首先我们获取一个站点的顶层目录(根目录):

示例:

《创建虚拟目录》

DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");

如果我们创建这个对象是没有发生异常,则表示这个目录是真实存在的。

下面我们来添加新的虚拟目录,比如我们要加的是"ABC":

DirectoryEntry newVirDir = rootfolder.Children.Add("ABC","IIsWebVirtualDir");
newVirDir.Invoke("AppCreate",true);
newVirDir.CommitChanges();
rootfolder.CommitChanges();

创建目录的思路很简单,即在根目录的子集(rootfolder.Children)中再添加一条记录,这里使用的是DirectoryEntries类中的Add方法,它返回的是一个DirectoryEntry,表示新加入的目录,第一个参数是虚拟目录的名字,第二个则是Schema的类名以表明我们加入的目录类型。然后再使用DirectoryEntry的Invoke方法,调用ADSI中的"AppCreate"方法将目录真正创建,最后便是依次调用新、根目录的CommitChanges方法,确认此次操作。

《更新虚拟目录》

相信大家对IIS都比较熟悉,了解IIS中一些重要的设置,如可读(AccessRead)、可写(AccessWrite)、可执行(AccessExecute)等。这些都可通过对DirectoryEntry的Properties属性集合的赋值来实现。赋值可以通过两种方式来完成:

第一种是调用Properties集合的Add方法,如:

dir.Properties["AccessRead"].Add(true);

第二种是对第一个索引值赋值:

dir.Properties["AccessRead"][0] = true;

使用DirectoryEntries类的Find方法找到更新目标目录,如:

DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");

比较常用的赋值属性有:AccessRead,AccessWrite,AccessExecute,AccessScript,DefaultDoc,EnableDefaultDoc,Path

《删除虚拟目录》

删除虚拟目录的方法也很简单,就是找到你要删除的虚拟目录,然后调用AppDelete方法。

DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");
de.Invoke("AppDelete",true);
rootfolder.CommitChanges();

还有一种方法,就是调用Root目录的Delete方法。

object[] paras = new object[2];
paras[0] = "IIsWebVirtualDir"; //表示操作的是虚拟目录
paras[1] = "Aspcn";
rootfolder.Invoke("Delete",paras);
rootfolder.CommitChanges();

ExampleTWO:操作WinNT

引自张义的博客

本示例通过将DirectoryEntry的Path设为"WinNT:",然后对它的所有子项的枚举进行查看来发现网络上的所有域(以及工作 组)。这样,再对所发现的域(以及工作组)的子项进行枚举,就可以发现网络上的所有计算机。下面的一个控制台小程序演示了这一点。

[c-sharp] view plaincopy
  1. using System;
  2. using System.DirectoryServices;
  3. class TempClass
  4. {
  5. static void Main()
  6. {
  7. EnumComputers();
  8. }
  9. static void EnumComputers()
  10. {
  11. using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
  12. {
  13. foreach (DirectoryEntry domain in root.Children)
  14. {
  15. Console.WriteLine("Domain | WorkGroup:/t" + domain.Name);
  16. foreach (DirectoryEntry computer in domain.Children)
  17. {
  18. Console.WriteLine("Computer:/t" + computer.Name);
  19. }
  20. }
  21. }
  22. }
  23. }

--------------------------------------------------------------------------------

改进后的Windows Forms方案
上面代码中两个嵌套的foreach循环看起来并不是太好,并且控制台的显示效果也并不那么美观。下面,我将对代码进行一些改动,并将它移植到WinForm上。
新建一个Windows Application[C#],在Form上添加一个TreeView,命名为treeView1。
添加以下几个函数:

[c-sharp] view plaincopy
  1. //用指定的文本构造一个节点,将其添加为参数parant的子节点,并返回刚构造的节点
  2. private TreeNode AddNode(TreeNode parant, string text)
  3. {
  4. TreeNode node = new TreeNode(text); parant.Nodes.Add(node); return node;
  5. }
  6. //递归地找到参数entry的所有子节点,并在treeView1中显示;这里的entry与entryNode需相对应
  7. private void EnumChildren(DirectoryEntry entry, TreeNode entryNode)
  8. {
  9. if (entry.Children != null)  //如果无子节点则结束
  10. {
  11. foreach (DirectoryEntry i in entry.Children)
  12. {   //将各子节点加入TreeView,并进行递归
  13. EnumChildren(i, AddNode(entryNode, i.Name));
  14. }
  15. }
  16. }
  17. //用给定的字符串构造根节点,并列出其所有子节点
  18. private void Enumerate(string path)
  19. {
  20. try
  21. {
  22. using (DirectoryEntry root = new DirectoryEntry(path))
  23. {
  24. TreeNode node = new TreeNode(root.Name);
  25. treeView1.Nodes.Add(node);
  26. EnumChildren(root, node);
  27. }
  28. }
  29. catch
  30. { }
  31. }

这样,通过传递 "WinNT:" 给函数Enumerate(string),就可以在TreeView中看到网络上的所有计算机,以及每台计算机上的用户、组、服务等资源,效果如图:

--------------------------------------------------------------------------------

总结
本文主要介绍了用DirectoryEntry配置IIS和查看局域网信息,在EXampleTWO中如果把“WinNT”改为“IIS”,我们还可以查看局域网中所有的IIS服务器的信息,DirectoryEntry的功能不仅仅限于此,因为它是对Active Directory的封装,所以ADSI能完成的功能它都可胜任,比如,还可以用它来对网络进行远程管理与配置等等。

首先添加引用System.DirectoryServices的.net组件

using System.DirectoryServices;

2

[c-sharp] view plaincopy
  1. private void adduser(string addaccount)
  2. {
  3. DirectoryEntry decu=new DirectoryEntry("LDAP//","用户名","密码")
  4. DirectoryEntries users=decu.Children;
  5. DirectoryEntry user=users.Add("CN="+addaccount,"user");
  6. user.Properties["userPrincipalName"].Add(account);
  7. user.Properties["samAccountName"].Add(addaccount);    //添加用户的帐号名称
  8. user.Properties["pwdLastSet"].Value=0;           //设置上一次登陆密码为空,用户在新登陆后需要重新设置密码
  9. user.Properties["userAccountControl"].Value=544;   //有效用户   ,应该设为512,却出错
  10. user.CommitChanges();                                                 //确认改变,写入AD
  11. }

这里的话可以把用户添加到了USER组里了

3

其他属性

user.Properties["c"].Value="cn";

user.Properties["co"].Value="China";

user.Properties["telephonenumber"].add("123456789");

属性的添加有两类

一类可以直接输入VALUE的数值

另一类由于有多项值,所以需要用ADD( )方法来解决

但需要判断是否有空值

if(user.Properties.Contains("mobile"))

{

user.Properties["mobile"][0]="13333333333";

}

else

{

user.Properties["mobile"].Add("13333333333");

}

user.CommitChanges();

4

关于member的管理

用户的memberof属性是用户在AD中比较重要的部分

在发现我们没有办法直接修改

user.Properties["memberOf"].add("cn=....");                         X

但我们可以直接修改需要添加到的组的属性

然后修改

group.Properties["member"].add("cn=....");

就可以达到修改组成员的效果来实现添加为某组的成员,但需要有比修改user比较大的修改组的权限

5

CommitChanges()

保存修改操作,勿忘.

6

关于Exchange2000也可以使用以上的方法创建exchange2000的用户

不过存在创建的Exchange用户与AD帐号的连接问题

EXCHANGE2003下却由于与AD结合,方便不少

问题:

user.Properties["telephonenumber"]属于多值属性

经测试只有1000个的容量

如果我有些特定的属性已经超出1000个

user.Properties["telephonenumber"].[999]

DirectoryEntry的应用相关推荐

  1. C#使用DirectoryEntry操作IIS创建网站和虚拟路径

    原文:http://www.cnblogs.com/Aiooioo/archive/2011/05/30/cs-iis.html 在.Net中我们可以使用内置的类DirectoryEntry来承载II ...

  2. AD域根据组名称获取DirectoryEntry对象

    #region 根据组名获取DirectoryEntry对象/// <summary>/// 根据组名获取DirectoryEntry对象/// </summary>/// & ...

  3. AD域根据组织单位名称获取DirectoryEntry对象

    #region 根据组织单位名获取组织对象/// <summary>/// 根据组织单位名获取组织对象/// </summary>/// <param name=&quo ...

  4. DirectoryEntry配置IIS出现ADSI Error:未知错误(0x80005000)

    目录 问题案例 原因分析 解决问题 总结 问题案例 DirectoryEntry配置IIS,在IIS6.0下运转正常,但IIS7.0下运转会出错: System.DirectoryServices.D ...

  5. AD域根据用户名称获取DirectoryEntry对象

    #region 根据用户帐号名称取得用户的对象/// <summary>/// 根据用户帐号名称取得用户的对象/// </summary>/// <param name= ...

  6. c# 获取machineguid_c# – 如何使用objectGUID获取DirectoryEntry?

    我知道,我们可以像这样得到一个DirectoryEntry: string conPath = "LDAP://10.0.0.6/DC=wds,DC=gaga,DC=com"; s ...

  7. 利用DirectoryEntry组件来查看网络所有电脑及用户

    "N年前",在一个MOSS2007开发的项目上,客户提出有这样一个需求,有没有办法列出局域网中的所有计算机及用户呢? 办法当然会有很多种喽...KAKIM当然喜欢的是简洁易懂而又能 ...

  8. DirectoryEntry所有字段对应解释

    cn:姓名英文缩写, sn:姓, c:CN(国家), l:县市, st:省, title:职位, description:描述, postalCode:邮政编码, postOfficeBox:邮政信箱 ...

  9. 《WinForm开发系列之控件篇》Item13 DirectoryEntry(暂无)

    暂无 转载于:https://www.cnblogs.com/Sue_/articles/1657367.html

  10. HTML5 本地文件操作之FileSystemAPI整理(二)

    一.文件目录操作 1.DirectoryEntry对象 属性: 1.isFile: 操作对象的是否为文件,DirectoryEntry对象固定其值为false 2.isDirectory: 操作对象是 ...

最新文章

  1. 码农技术炒股之路——抓取股票基本信息、实时交易信息、主力动向信息
  2. 大兴计算机职业学校,北京大兴区第一职业学校
  3. How to think positively 如何培养正念
  4. 利用ABAP 740的新关键字REDUCE完成一个实际工作任务
  5. MFC处理回车窗口消失
  6. 隐藏画质代码_优秀的模糊测试代码是如何炼成的?
  7. 修改map.html,HTML map 标签 | 菜鸟教程
  8. RGB想YCbCr空间的变换
  9. JAVA大数据-Week2-DAY5
  10. 从网页监听Android设备的返回键
  11. Java IO——字节流和字符流详解区别对比
  12. cmos逻辑门传输延迟时间_MOS管设计知识:传输管TG的原理及组合逻辑延时分析
  13. java 正则表达式 去掉 文章头部和尾部的空格(全角,半角)、制表符、换页符
  14. android头条的状态栏_今日头条如何设置电脑版 今日头条苹果手机任务栏在哪
  15. 搜狗输入法 + qq
  16. python中使用pip提示: Fatal error in launcher: Unable to create process using
  17. 数据备份一般有哪些方式,如何进行数据备份
  18. Unity手指触控之Touch结构体
  19. dllhell 听说过吗?_您已经听说过X25519,但是X448有何特别之处?
  20. 软件测试是背锅,测试如何少背锅”

热门文章

  1. 紫色飞猪:基于K8s的集群稳定架构
  2. 2020-03-13 MySQL 8 绿色安装
  3. 华为笔试题:根据子网掩码判断两个IP地址是否在同一子网,并输出IP1的网络号
  4. unef螺纹_统一螺纹(美制螺纹)UN,UNC,UNF,UNEF详细区别
  5. Matlab图像分割(U-Net)
  6. glibc升级失败及处理过程
  7. 亿图图示输入文字后画面自动缩小
  8. 查看dSYM文件的UUID
  9. 尼日利亚4g频段_4G全球频段划分及主要运营商对应表2015版
  10. jdk11下载与安装教程(win10)超详细