使用System.DirectoryServices.Protocols实现对AD的简单操作

本文介绍如何使用System.DirectoryServices.Protocols.dll组件通过LDAP和DSML协议操作目录服务,包括连接、请求发送及响应处理,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 System.DirectoryServices.Protocols.dll是.NET2.0新增加的一个针对目录服务访问协议处理的组件,其下只有一个System.DirectoryServices.Protocols命名空间。在该命名空间下,主要有LDAP、DSML两种国际标准协议的一系列实现类。通过这些类,完全可以很方便地实现对目录的操作管理,这个实现步骤就有点类似你利用ADO.NET操作数据库一样方便。
       在System.DirectoryServices.Protocols命名空间里,主要有这样几个类:LdapConnection (LDAP协议方式的目录连接类,负责创建LDAP连接并绑定LDAP服务器)、DsmlSoapHttpConnection (DSML协议方式的目录连接类、负责创建DSML连接并绑定DSML服务器)、AddRequest/AddResponse、ModifyRequest/ModifyResponse、ModifyDNRequest/ModifyDNResponse、CompareRequest/CompareResponse、SearchRequest/SearchResponse、DeleteRequest/DeleteResponse、DsmlRequestDocument/DsmlResponseDocument。这些类在实际编程应用中的关系如下图:

        用户利用LdapConnection/DsmlSoapHttpConnection跟LDAP服务器/DSML服务器建立连接并绑定后,即可创建一系列相应的操作请求(如增加一新对象请求AddRequest),然后通过连接对象的SendRequest方法把请求命令发送到服务器,服务器根据请求进行相应处理后,把应答信息传回给客户端。需要指出的是,对于DSML方式的请求,还可以利用DsmlRequestDocument将AddRequest、ModifyRequest、ModifyDNRequest、CompareRequet、SearchRequest和DeleteRequest的任意几个请求组合组装起来,一并发送到DSML服务器进行处理。
        LdapConnection的使用
  1. 创建LDAP连接并进行绑定:
    NetworkCredential credential = new NetworkCredential("Administrator", "password");
     
    LdapConnection ldapConnection = new LdapConnection("192.168.0.6");
    ldapConnection.Credential = credential;
    ldapConnection.Bind();
  2. 创建一个请求,使其达到增加一个OU,其名称为MyOU的目的。创建后的MyOU其DN为OU=MyOU,DC=mydomain,DC=local:
    string targetDN = "DC=mydomain,DC=local";
     
    // 增加一个名为MyOU的组织单元
    string ou = "OU=MyOU," + targetDN;
    string objectClass = "organizationalUnit";
     
    AddRequest addRequest = new AddRequest(ou, objectClass);
  3. 把请求发送到服务器进行处理:
    ldapConnection.SendRequest(addRequest);
    执行完SendRequest()后,如果没有出现异常,那么MyOU已经成功增加了。当然,如果你还需要进一步对SendRequest()操作后的应答信息进行处理的话,也可以类似下面这样写,其中将在屏幕上输出“Success“的结果码:
    AddResponse addResponse = (AddResponse)ldapConnection.SendRequest(addRequest);
     
    Console .WriteLine(addResponse.ResultCode.ToString());
        至此,一个LDAP请求已经处理完毕。上面的完整代码可以 点这里进行查看。
        类似上面增加操作,还可以利用DeleteRequest进行删除操作、ModifyDNRequest进行重命名或移动操作、ModifyRequest进行修改对象属性操作、SearchRequest进行查询操作、CompareRequest进行验证比较操作。
        DsmlSoapHttpConnection的使用
  1. 关于DSML for Windows,可以通过http://www.microsoft.com/windows2000/server/evaluation/news/bulletins/dsml.asp进行下载。简单理解DSML,就是利用标准的HTTP/SOAP/XML对活动目录进行读写等一系列操作的技术。安装完DSML for Windows后,还需要执行“Microsoft DSML“程序组里的“Configuring DSML Services“。该程序里有三个步骤,很好理解和操作,这里省略。但需要指出,如果你不需要进行SSL连接服务器的话,需要在Step 1中把“Require SSL to connect to DSML server“取消。另外,如果你还需要执行除读取以外的权限,如写操作权限,还需要在Step 2中把“Make DSML Server readonly“取消。
  2. 建立DsmlSoapHttpConnection连接:
    NetworkCredential credential = new NetworkCredential("Administrator", "password");
     
    Uri dsmlServerUri = new Uri("http://192.168.0.6/dsml/adssoap.dsmlx");
    DsmlSoapHttpConnection dsmlSoapHttpConnection = new DsmlSoapHttpConnection(dsmlServerUri);
    dsmlSoapHttpConnection.Credential = credential;
  3. 创建一个请求,使其达到增加一个OU,其名称为MyOU的目的。创建后的MyOU其DN为OU=MyOU,DC=mydomain,DC=local。可以看到,这部分跟LDAP操作时一致的!
    string targetDN = "DC=mydomain,DC=local";
     
    // 增加一个名为MyOU的OU
    string ou = "OU=MyOU," + targetDN;
    string objectClass = "organizationalUnit";
     
    AddRequest addRequest = new AddRequest(ou, objectClass);
  4. 把请求发送到服务器进行处理:
    DsmlResponseDocument dsmlResponseDocument = dsmlSoapHttpConnection.SendRequest(addRequest);
     
    Console .WriteLine(dsmlResponseDocument[0].ResultCode.ToString());
    可以看到,DsmlResponseDocument可以包含多个应答信息,应该还需要指定下标,才能得到具体返回的结果码。
      至此,一个DSML请求已经处理完毕。上面的完整代码可以 点这里进行查看。
        另外,对于DSML的多条操作请求一起发送的情况,可以创建DsmlRequestDocument对象去包含各种操作请求,具体可以 参考这里的代码。
        感觉怎样?我想肯定舒服了很多,毕竟这样的编程逻辑对我们来说,是再熟悉也不错的了。另外,对于目录这块,.NET2.0还在System.DirectoryServices.dll组件里也增加了一个新的命名空间System.DirectoryServices.ActiveDirectory。顾名思义,该命名空间完成的功能就是对活动目录进行更完整的处理操作,比如对域林、域树、域、域控制器、目录复制、活动目录架构、域信任等的操作,让你尽可能完全在纯托管的代码中实现对活动目录的操作。
 
### Active Directory 导出功能封装库推荐 在处理 Active Directory(AD)相关任务时,选择合适的封装库可以显著提高开发效率。以下是几个常用的 AD 封装库推荐: #### 1. **AdFind** AdFind 是一个强大的命令行工具,用于查询和导出 Active Directory 的信息[^4]。它支持通过 LDAP 查询域用户、计算机和其他对象的详细信息。虽然 AdFind 本身是一个可执行文件而非库,但其灵活性使其成为许多脚本化任务的基础工具。例如: ```bash adfind.exe -h DNS_SERVER_IP -sc u:targetUser ``` 上述命令可以查询特定用户的详细信息。 #### 2. **PowerShell Module (ActiveDirectory)** PowerShell 提供了内置的 `ActiveDirectory` 模块,允许开发者直接与 AD 进行交互。该模块包含丰富的 cmdlet,例如 `Get-ADUser` 和 `Export-Csv`,可以直接用于导出用户信息[^4]。 ```powershell Import-Module ActiveDirectory Get-ADUser -Filter * -Properties * | Select-Object Name,SamAccountName,EmailAddress | Export-Csv -Path "Users.csv" -NoTypeInformation ``` #### 3. **SharpHound** SharpHound 是 BloodHound 项目的一部分,专注于收集 AD 环境中的数据,并以 JSON 格式导出[^4]。虽然其主要目的是安全审计,但它也可以用于常规的 AD 数据导出任务。 ```csharp // 示例代码片段:使用 SharpHound API 收集数据 var collector = new DataCollector(); collector.CollectData(); collector.ExportToJson("output.json"); ``` #### 4. **LdapConnection (System.DirectoryServices.Protocols)** 如果需要更底层的控制,可以使用 .NET Framework 中的 `System.DirectoryServices.Protocols` 命名空间。它提供了对 LDAP 协议的直接访问,适合构建自定义 AD 封装库。 ```csharp using System; using System.DirectoryServices.Protocols; LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier("ldap.example.com")); connection.SessionOptions.ProtocolVersion = 3; connection.AuthType = AuthType.Basic; connection.Bind(new NetworkCredential("username", "password")); SearchRequest request = new SearchRequest("DC=example,DC=com", "(objectClass=user)", SearchScope.Subtree, null); SearchResponse response = (SearchResponse)connection.SendRequest(request); foreach (SearchResultEntry entry in response.Entries) { Console.WriteLine(entry.DistinguishedName); } ``` #### 5. **pyad (Python)** 对于 Python 开发者,`pyad` 是一个简单易用的库,用于与 AD 进行交互。它可以轻松查询和导出用户信息。 ```python import pyad pyad.set_defaults(ldap_server="ldap.example.com", username="admin", password="password") user = pyad.aduser.ADUser.from_cn("targetUser") print(user.get_attributes(["mail", "sAMAccountName"])) ``` #### 6. **dsquery (Windows 工具)** `dsquery` 是 Windows 自带的命令行工具,用于查询 AD 对象。尽管它不是库,但在批处理脚本中非常实用。 ```cmd dsquery user -name targetUser -limit 0 > output.txt ``` --- ### 注意事项 在选择封装库时,请根据以下因素进行权衡: - **语言支持**:如果团队主要使用 C# 或 Python,可以选择对应的库。 - **性能需求**:对于大规模查询,建议使用低级接口如 `System.DirectoryServices.Protocols`。 - **安全性**:确保所选工具支持加密连接(如 LDAPS)以保护敏感数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值