赛迪网 >> 技术应用子站1 >> 今日更新
浅析.Net下Active Directory编程技术 (2)
作者:宋华 来源:赛迪网 发布时间:2002.10.25
【Java专区】 【网络安全】 【网管专区】 【linux专区】 【数据库专区】 【进入论坛】 【IT博客】 
【Eclipse】  【PHP】  【DB2】  【Ajax】  【Struts】  【Spring】  【源码·文档下载】

.Net架构支持

DirectoryServices名字空间

.Net架构对Active Directory提供了丰富的支持功能,其命名空间 System.DirectoryServices包含的DirctoryEntry、DirectoryEntries以及DirectorySearcher等类库可与任何 Active Directory 服务提供程序(一种识别绑定协议并提供相关服务的程序,下面有专门阐述)一起使用,.NET 框架的这些支持使得操作具有 DirectoryEntry 和 DirectorySearcher 等组件的 ADSI 功能非常容易。

DirectoryEntry组件

DirectoryEntry 组件使从目录访问对象以及使用其数据和行为非常方便。当给 DirectoryEntry 组件指定一个 Active Directory 层次结构中的有效目录路径时,它返回可操作的 ADSI COM 对象,这些对象包括用户、计算机、服务、用户帐户和计算机的组织、文件系统以及文件服务操作。DirectoryEntry 类封装 Active Directory 层次结构中的节点或对象,使用此类库绑定到对象、读取属性和更新特性。DirectoryEntry 与帮助器类一起为生存期管理和导航方法提供支持,包括创建、删除、重命名、移动子节点和枚举子级。

可以将 DirectoryEntry 组件绑定到目录中的对象以执行管理任务,如修改属性或监视信息更改。可以使用 DirectoryEntry 组件自动执行常见管理任务,如添加用户和组、管理打印机以及设置网络资源的权限。这样,你可以使用 DirectoryEntry 组件与企业中任何目录系统上的任何资源进行交互。可以向层次结构添加新的节点。当然,如果需要更改 Active Directory 对象的属性值,你必须拥有所绑定到对象的管理权限。

在创建新的对象时,DirectoryEntry 组件会用到 Active Directory Schema 架构。这时你需要指定一个先前已存在的架构名,并将该对象与之关联。

DirectorySearcher组件

DirectorySearcher 组件使用Active Directory架构信息在目录中执行搜索并获得节点的属性并返回 SearchResult 的实例,这些实例包含在 SearchResultCollection 类的实例中。SearchResult 的实例与 DirectoryEntry 的实例非常类似。明显的差异在于每次访问新对象时,DirectoryEntry 都从 Active Directory 层次结构中检索其信息,而 SearchResult 的数据已经存在于用 DirectorySearcher 执行的查询返回的 SearchResultCollection 中。SearchResult 中只存在那些在查询中通过 DirectorySearcher.PropertiesToLoad 属性的集合指定的属性。

可以使用 DirectorySearcher 类对使用轻量目录访问协议(Lightweight Directory Access Protocol,LDAP)的 Active Directory 层次结构进行搜索以查找特定的服务或对象;可以基于大型目录中对象的属性 (Rich Query) 执行查询,以便按其一个或多个属性值查找特定的对象;可以封装层次结构中的节点,并操作或查询其属性。DirectorySearcher 组件的实例需要 LDAP 提供程序以便对 Active Directory 层次结构执行多格式查询。LDAP 是系统提供的唯一一种支持搜索的 Active Directory 服务接口 (ADSI) 提供程序。

目录服务提供程序

可以使用 DirectoryEntry 组件访问的每种目录系统类型都具有一种特定的目录协议(称为“服务提供程序”),此协议允许您访问和处理该目录的内容。创建ADSI可使开发人员通过单个接口访问所有的协议,从而可以方便地在这些协议之间进行切换。

下表列出了可以访问的服务提供程序以及每种服务提供程序的标识符。

服务提供程序 路径标识符
Windows NT 5.0 版、Windows 2000 或 Windows XP WinNT://path
轻量目录访问协议(LDAP) LDAP://path
Novell NetWare 目录服务 NDS://path
Novell Netware 3.x NWCOMPAT://binderyServer/TopHat

每种服务提供程序为您提供一组不同的可访问和操作的对象以及关联数据和行为。这些对象与该命名空间的目录树中的项和资源对应。很多提供程序具有相同的对象。例如,所有提供程序授予您访问组对象(表示一个组帐户)和用户对象(表示一个用户帐户)的权限。

对于 Windows NT 服务提供程序,您可以访问域、计算机、打印队列和会话。对于 LDAP 提供程序,您可以访问组织、地址和"根 DS 项"(rootDSE) 对象。LDAP把rootDSE定义为目录服务器中目录树的根。根 DS 项是一组必需的操作属性,用户可以读取这些属性以找出目录和服务器的基本特征:如读取默认命名环境名(default naming context), rootDSE 仅对 LDAP 提供程序是必需的。

绑定及路径

当创建DirectoryEntry组件的实例时,需要指定所使用的服务提供程序的类型以及要操作的对象,并与Active Directory连接,这个过程称为“绑定”。这时,你需要指定所使用的协议(LADP、WinNT等),即服务提供程序指示符。当前的一些服务提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)和 WinNT等。随后你可能需要指定计算机所在的域名、组名以及计算机名,如果没有显示式指定域名(服务器名),系统就会在整个域中查找与用户绑定过程相关的域控制器,并且使用所找到的第一个域控制器。这样,WinNT下的绑定语法大致为:

1.WinNT://MyDomain/Group

2.WinNT://MyDomain/MyComputer/aPrinter/

这个过程中,可能需要指定路径信息,类DirectoryEntry的Path属性唯一地标识网络环境中的路径信息,设置该属性将从目录存储区检索新项,它不更改当前绑定的项的路径。同绑定类似,Path 属性的语法取决于服务提供程序,在WinNT 下连接到计算机上的组语法为:WinNT://domain/computer/group;而IIS下连接到Web目录则为:IIS://LocalHost/W3SVC/1/ROOT/web-directory-name。

ADSI可实现的操作

依赖于.Net架构类库的强大支持,使用ADSI使以下操作变得简单可行:

1、一次登录可处理不同的目录。DirectoryEntry 组件类提供用户名和密码属性,可以在运行时输入这些属性并与绑定到的 Active Directory 对象进行通讯。

2、通过给用户提供各种要使用的协议,使用单个应用程序编程接口 (API) 即可在多个目录系统上执行任务。

3、对目录系统执行"多格式查询"。ADSI 技术允许通过指定两种查询语言,即 SQL 和 LDAP,来搜索对象。

4、通过访问 Active Directory 树,访问和使用用于管理和维护各种复杂网络配置的单个分层结构。

5、将目录信息与数据库(如 SQL Server)进行集成。只要 DirectoryEntry 路径使用 LDAP 提供程序,就可以将它用作 ADO.NET 连接字符串。

实 例

运用上面的知识,以下创建了一个Windows Forms程序实例,它可以列出本地计算机上的用户、组和服务。程序实现时,请拖放TreeView控件到窗体上,设置其名为viewPC(它将在程序中提供三个顶级节点,各个节点分别用于用户User、组Group和服务Services。每个二级节点都将代表一个在您的计算机上注册的用户、组或服务。每个用户、组和服务都具有两个子节点,一个用于其 Active Directory 路径Path,另一个用于其属性Porperties);同时,请添加System.DirectoryServices.dll引用。并从组件中拖入 DirectoryEntry 组件,配置 DirectoryEntry 组件属性,设置其名Name 属性为 entryPC。将 DirectoryEntry 组件的 Path 属性设置为 WinNT://研发中心/Webserver。(这里,“研发中心”是笔者所在的组名,“Webserver”则是笔者所使用的计算机服务器名,你可能需要修改它们)。运行程序,就将可视化地列出指定计算机上的所有用户、组和服务,展开这些节点,将罗列出它们各自的路径及属性。

主要源代码如下:

private void Form1_Load(object sender, System.EventArgs e)
		{
			TreeNode users=new TreeNode("Users");
			TreeNode groups=new TreeNode("Groups");
			TreeNode services=new TreeNode("Services");
			viewPC.Nodes.AddRange(new 
TreeNode[]{users,groups,services});		
foreach(DirectoryEntry child in entryPC.Children)
{
	TreeNode newNode=new TreeNode(child.Name);
	switch(child.SchemaClassName)
	{
		case "User":
			users.Nodes.Add(newNode);
			break;
		case "Group":
			groups.Nodes.Add(newNode);
			break;
		case "Service":
			services.Nodes.Add(newNode);
			break;
	}
	try
	{		AddPathAndProperties(newNode,child);
	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}
}
//以下函数实现路径及属性的添加功能
private void AddPathAndProperties(TreeNode node,DirectoryEntry entry)
{
	node.Nodes.Add(new TreeNode("Path:"+entry.Path));
	TreeNode propertyNode=new TreeNode("Properties");
	node.Nodes.Add(propertyNode);
	foreach(string propertyName in entry.Properties.PropertyNames)
	{	string
	oneNode=propertyName+":"+entry.Properties[propertyName][0].ToString();
	    propertyNode.Nodes.Add(new TreeNode(oneNode));
	}
}

程序拓展

运行以上程序段将列举出本地机上注册的用户、组、服务及其属性。要列举远程计算机的相应属性,你需要更改DirectoryEntory组件的Path属性为远程计算机名,比如"销售事业部"是笔者所在公司的一个远端工作组,"Xsb1"是这个组中的一台计算机,设置Path=WinNT://销售事业部/Xsb1,就可以列出该机所配置的相关属性。不过,要保证这一功能的实现,你需要确保此远程计算机(如Xsb1)启动了Guest客户访问权限,否则将引发"访问被拒绝"异常;同时,你也需要确保该远程机能支持Active Directory活动目录,即提供了ADSI SDK运行库,否则,将引发"计算机名无效"异常。

运行环境

程序在:Windows XP中文操作系统、Microsoft .Net Frameworks框架、Visual Studio.Net 正式

中文版下调试通过

参考资料:《C#高级编程》、《Visual studio.net深入编程》、《.Net数据服务c#高级编程》、Vs.net帮助文档

Sunny

<<上一页 1 2

最全面的服务器导购资讯,形成全方位的服务器导购平台

评论】 【推荐】 【 】 【打印】 【关闭
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章
· .net和gdi+共创ico图标编辑器 2002-10-21
· 微软.Net Server明年初上市 2002-10-15
· VB.NET编程之托盘程序篇 2002-10-15
· 利用ASP.NET创建图表 2002-10-11
· C#下用P2P技术实现点对点聊天 2002-10-10