DirectoryEntry 对象
在 System.DirectoryServices 中,目录中的每个对象都由 DirectoryEntry 对象表示。DirectoryEntry 在内存中创建一个项对象;在调用 CommitChanges 方法之前,它实际上并没有在目录中创建该对象。这样做的好处在于,您可以从客户端应用程序检索用于访问的目录信息,并且在本地读取或修改这些信息,然后重新连接到服务器,以便将修改后的信息保存到该目录。这会使服务器的执行效率达到最高。
每个网络资源都表示为目录中的一个对象,并且每个目录对象(如前所述)都表示为客户端应用程序中的 DirectoryEntry。
目录项对象具有下列特征:
- Name。此对象名称也称作相对可分辨名称 (RDN)。RDN 的格式采用语法 key=value。例如,在下图中,用户对象的 RDN 是 CN=Jeff Smith。请注意,空格不包括在内。
- Parent。网络对象是分层的,并且除位于层次结构顶部的根对象(它是域对象,有时称作域头)之外都具有父对象。
- Path。目录对象路径也称作可分辨名称 (DN)。可分辨名称由对象名称以及置于该名称前面的其各级父对象直至根对象的名称组成。例如,对于用户对象 CN=Jeff Smith,DN 以根对象开头,后面跟指向该用户对象的路径,如下所示:DC=Fabrikam,DC=COM,OU=Sales,CN=Jeff Smith。路径使用 LDAP 规范定义的语法。有关该路径的正确语法的详细信息,请参阅绑定字符串。该路径用于由 DirectoryEntry 对象创建的绑定字符串中。
对象路径模型
尽管前面的信息适用于使用 System.DirectoryServices 连接到的任何 LDAP 目录对象,但还有一些针对 Active Directory 域服务的事项需要予以注意。Active Directory 域服务对象的一个特性是,它们必须包含全局唯一标识符 (GUID)。尽管可以修改该对象的不同属性值,但 GUID 是不可变的。
下面的代码示例说明如何创建 DirectoryEntry 并编写其路径、名称和 GUID。在此示例中,DirectoryEntry 绑定到此用户当前连接到的域的根。
static void Main()
{
DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
DirectoryEntry NewUser = AD.Children.Add("222", "user");
NewUser.Invoke("SetPassword", new object[] { "#12345Abc" });
// NewUser.Invoke("Put", new object[] { "Description", "Test User from .NET" });
NewUser.CommitChanges();
DirectoryEntry grp;
//grp = AD.Children.Find("Guests", "group");
//if (grp != null)
//{
// grp.Invoke("Add", new object[] { NewUser.Path.ToString() });
//}
Console.WriteLine("Account Created Successfully");
Console.WriteLine("Path:---" + AD.Path);
Console.WriteLine("Name:---" + AD.Name);
Console.WriteLine("Guid:---" + AD.Guid);
Console.WriteLine("AuthenticationType:---" + AD.AuthenticationType);
Console.WriteLine("Children-:---" + AD.Children);
Console.WriteLine("Container:---" + AD.Container);
Console.WriteLine("NativeGuid:---" + AD.NativeGuid);
Console.WriteLine("NativeObject:---" + AD.NativeObject);
// Console.WriteLine("ObjectSecurity:---" + AD.ObjectSecurity);
Console.WriteLine("Options:---" + AD.Options);
Console.WriteLine("Parent:---" + AD.Parent);
Console.WriteLine("Properties:---" + AD.Properties);
Console.ReadLine();
Console.ReadKey();
}
外加套餐:
System.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。
该命名空间包含两个组件类,即 DirectoryEntry 和 DirectorySearcher,
它们使用 Active Directory 服务接口 (ADSI) 技术。ADSI 是 Microsoft 提供的一组接口,作为使用各种网络提供程序的灵活的工具。无论网络有多大,
ADSI 都可以使管理员能够相对容易地定位和管理网络上的资源。
System.DirectoryServices 命名空间中的类可以与任何 Active Directory 服务提供程序一起使用。当前的一些提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 WinNT。
ADSI 是 Microsoft Active Directory 的编程接口,使应用程序能够只使用一个接口就可以与网络上的不同目录进行交互。使用 ADSI,可以创建一些应用程序,
用以执行常见任务,如备份数据库、访问打印机和管理用户帐户。
Path 属性
Path 属性唯一地标识网络环境中的此项。始终可以使用此 Path 检索此项。
设置 Path 将从目录存储区检索新项;它不更改当前绑定的项的路径。
与 DirectoryEntry 组件关联的类可与任何 Active Directory 域服务提供程序一起使用。当前的一些提供程序包括 Internet 信息服务 (IIS)、轻量目录访问协议 (LDAP)、Novell NetWare 目录服务 (NDS) 和 WinNT。
说明:标识提供程序(在“://”前面)的 Path 部分是区分大小写的。例如,“LDAP://”或“WinNT://”。
Path 属性的语法随提供程序不同而不同。一些常见的情况有:
名称 | 作用 |
---|---|
WinNT | 连接到计算机上的组。例如“WinNT://<域名>/<计算机名>/<组名>”。如果是连接到本地计算机,则为“WinNT://<计算机名>/<组名>”。 发现网络上的所有域。例如,“WinNT:”通过枚举此项的子级可以找到这些域。 |
LDAP | 连接到域中的组。例如“LDAP://CN=<组名>, CN =<用户>, DC=<域组件>, DC=<域组件>,…”。 |
IIS | 连接到 Web 目录。例如“IIS://LocalHost/W3SVC/1/ROOT/”。若要使用 LDAP 绑定到当前域,请使用路径“LDAP://RootDSE”,然后获取默认命名上下文,并重新绑定该项。例如:String str = ent.Properties[“defaultNamingContext”][0]; DirectoryEntry domain = new DirectoryEntry(“LDAP://” + str); |
-
在网页中的通用方法:
获取服务器电脑名:Page.Server.MachineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress
-
在网络编程中的通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AdressList
也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址).HostName
-
系统环境类的通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName
创建示例
打开 Microsoft Visual Studio .NET,然后新建一个 Visual C# Console 应用程序项目。
在“解决方案资源管理器”中,右键单击引用,然后单击添加引用。
添加一个对 System.DirectoryServices.dll 程序集的引用。
static void Main()
{
DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
DirectoryEntry NewUser = AD.Children.Add("222", "user");
NewUser.Invoke("SetPassword", new object[] { "#12345Abc" });
NewUser.Invoke("Put", new object[] { "Description", "Test User from .NET" });
NewUser.CommitChanges();
DirectoryEntry grp;
grp = AD.Children.Find("Guests", "group");
if (grp != null)
{
grp.Invoke("Add", new object[] { NewUser.Path.ToString() });
}
Console.ReadKey();
}
创建本示例中的目录项时,假定系统正在运行 Microsoft Windows NT、Windows 2000 或 Windows XP。 注意,向 DirectoryEntry 构造函数传递以“WinNT://”开头的字符串。 您还可以在其他第三方操作系统上运行“目录服务”。
DirectoryEntry AD = new DirectoryEntry("WinNT://" + SystemInformation.ComputerName + ",computer");
向目录树添加目录项
以下代码在 Active Directory 树中添加了一个 user 类型的、值为 TestUser1 的 DirectoryEntry。
设置新用户帐户的密码和说明
以下代码调用 Invoke 方法来调用 DirectoryEntry 对象的 SetPassword 和 Put 方法。 这将为用户帐户设置密码并分配说明。 此代码还调用 CommitChanges 方法保存这些更改。
NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
NewUser.CommitChanges();
将帐户添加到组
将帐户添加到组的第一步是定义 DirectoryEntry 类型的变量。 然后调用 ActiveDirectory 类 Children 成员的 Find 方法来填充变量。 在这种情况下,Guest 组是搜索目标。 此代码测试 Find 方法返回的值以确定是否已找到该组。 如果找到该组,新用户帐户便会添加到组中。
DirectoryEntry grp;
grp = AD.Children.Find("Guests", "group");
if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
http://www.cnblogs.com/tinawan/archive////html