在 .NET 中,我们可以使用 DirectoryEntry 类进行 Active Directory(AD)操作。DirectoryEntry 类提供了一种操作 AD 的方式,在这种操作方式中我们可以添加、更新、删除和检索 AD 中的对象。本文将介绍如何在 .NET Core 中使用 DirectoryEntry 类进行 AD 操作。
一、DirectoryEntry 类
DirectoryEntry 类提供了一种操作 AD 的方式。AD 是一种目录服务,它可用于跨网络验证用户、授权访问和分配权限。DirectoryEntry 类提供了一种静态的方式以便于使用 AD 中的所有属性。该类还提供了一些属性和方法,用于管理特定的目录项。
如果你已经熟悉了 DirectoryEntry 类,那么你可以跳过此章节。否则了解一下DirectoryEntry。
DirectoryEntry 类提供了一种访问和实现 AD 的方式。它是操作 AD 中的所有目录条目的基础。DirectoryEntry 类的构造函数有很多重载。在本文中,让我们看一下最常用的两个构造函数:
```C#
DirectoryEntry(string path)
DirectoryEntry(string path, string username, string password)
```
第一个构造函数使用指定的路径和默认域帐户(或匿名)来初始化 DirectoryEntry 实例;而第二个构造函数使用指定的路径和用户名和密码来初始化此实例。
使用 DirectoryEntry,我们可以打开 AD 中的目录条目,修改或添加属性或值,并关闭它。
二、实现AD操作
在 .NET Core 中,我们可以使用 DirectoryEntry 类来添加、修改、删除和检索 AD 中的对象。我们将使用 DirectoryEntry 类的以下方法:
1.新增:
```C#
public void Add(string name, string schemaClassName)
```
2.修改:
```C#
void CommitChanges ();
void RefreshCache ();
void MoveTo (DirectoryEntry newParent);
void Rename(string newName);
```
3.删除:
```C#
void DeleteTree ();
```
4.检索:
```C#
public SearchResultCollection FindAll();
public SearchResult FindOne();
```
五、示例代码
简单介绍了DirectoryEntry,现在,我们将介绍使用DirectoryEntry类进行AD操作的示例。在此示例中,我们将介绍如何连接到 AD,并使用 DirectoryEntry 实例添加和检索 AD 中的用户信息。首先,我们需要使用 DirectoryEntry 构建器来创建一个 DirectoryEntry 实例。
```C#
using System.DirectoryServices;
public class AD {
private string domain;
private string username;
private string password;
private DirectoryEntry _directoryEntry;
public DirectoryEntry directoryEntry
{
get { return _directoryEntry; }
set { _directoryEntry = value; }
}
public AD(string domain)
{
_directoryEntry = new DirectoryEntry(domain);
}
public AD(string domain, string user, string password)
{
_directoryEntry = new DirectoryEntry(domain,
user,
password);
}
}
```
在上面的代码中,我们创建了一个名为 AD 的类,它与特定的 AD 域相关联。我们还在构造函数中创建了一个 DirectoryEntry 实例,该实例与指定的 AD 域相关联。在我们的 AD 类中,我们还定义了一个名为 directoryEntry 的属性,它提供访问 DirectoryEntry 实例的方式。
现在我们已经有了一个 AD 对象并已连接到 AD,接下来我们添加和检索 AD 中的实体。
1. 添加用户:
```C#
public void addUser(string name, string firstName, string lastName)
{
if (_directoryEntry != null)
{
try
{
DirectoryEntry newUser = directoryEntry.Children.Add("CN=" + name, "user");
newUser.Properties["samAccountName"].Value = name;
newUser.Properties["givenName"].Value = firstName;
newUser.Properties["sn"].Value = lastName;
newUser.Properties["description"].Value = "Sample user";
newUser.CommitChanges();
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
}
}
```
在上面的代码中,我们定义了一个名为 addUser 的函数,该函数把用户信息添加到 AD 中。首先,我们创建一个名为 newUser 的 DirectoryEntry 实例,然后通过使用 Add 函数将其添加到 AD 中。
然后,我们更新了 samAccountName、givenName、sn 和 description 属性。最后,我们发送了 CommitChanges()函数,以确保 DirectoryEntry 实例的更改被提交到 AD 中。
2. 检索用户:
```C#
public SearchResult getUser(string name)
{
if (_directoryEntry != null)
{
try
{
DirectorySearcher search = new DirectorySearcher(_directoryEntry);
search.Filter = "(&(objectClass=user)(samaccountname=" + name + "))";
search.PropertiesToLoad.Add("givenName");
search.PropertiesToLoad.Add("sn");
search.PropertiesToLoad.Add("description");
SearchResult result = search.FindOne();
return result;
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
return null;
}
}
else
{
return null;
}
}
```
在上面的代码中,我们定义了一个名为 getUser 的函数,该函数从 AD 中检索用户信息。我们首先使用 DirectorySearcher 实例来获取 AD 中的所有用户信息。然后我们使用 Filter 属性过滤出需要的信息。
例如,我们在过滤器中使用(&(objectClass=user)(samaccountname=xuehua))来检索 samaccountname 为 xuehua 的用户。
在示例中,我们还指定了需要加载和显示的附加属性。搜索完成后,我们返回一个 SearchResult 对象。
我们已经通过DirectoryEntry操作AD。可以根据具体场景进行扩展。如果你仍然对DirectoryEntry有疑问,可以查看MSDN文档。