使用 OLE DB 进行搜索

对于使用 ActiveX 数据对象 (ADO) 的自动化客户端和所有非自动化客户端,ADSI 都提供了一个支持 OLE DB 查询接口子集的 OLE DB 提供程序。 已经使用 OLE DB 接口进行查询的客户端代码可以使用相同的接口来查询目录服务。

在 OLE DB 实现中,目录服务是作为数据源对象公开的。 数据源对象是会话对象的工厂,支持使用 IDBInitialize 连接到目录,使用 IDBCreateSession 创建会话对象,使用 IDBProperties 向基础命名空间提供验证数据并提供查询命令,以及使用 IPersist 将创建数据源对象所需的数据保存到基础目录服务。

使用 OLE DB 执行 Active Directory 查询

  1. 从 OLE DB 提供程序读取 IDBInitialize 接口。 如果是 Active Directory,请使用类标识符 CLSID_ADsDSOObject
  2. 构建一个包含用于指定用户名和密码的连接数据的 DBPROP 数组。
  3. IDBProperties 接口查询步骤 1 中获取的 IDBInitialize 接口。
  4. 调用 IDBProperties::SetProperties 方法,传入在步骤 2 中创建的 DBPROP 数组。
  5. 调用 IDBInitialize::Initialize 方法建立与 OLE DB 提供程序的连接;在本例中,它就是 Active Directory 提供程序。
  6. IDBCreateSession 接口查询 IDBInitialize 接口。
  7. 调用 IDBCreateSession::CreateSession 方法,请求创建 IDBCreateCommand 类型的新接口。
  8. 调用 IDBCreateCommand::CreateCommand 方法以创建 ICommandText 接口。
  9. 调用 ICommandText::SetCommandText 方法。 传入首选方言和该方言中的实际查询命令文本。 可以使用 DBGUID_LDAPDialectDBGUID_DBSQL 作为方言。
  10. 调用 ICommand::Execute;将返回 IRowset 接口,它是结果集的接口。
  11. IColumnsInfo 接口查询 IRowset 接口。
  12. 调用 IColumnsInfo::GetColumnInfo 方法以检索有关结果集的列数据。
  13. 填充 DBBINDING 结构的数组,向 OLE DB 提供程序说明如何按列向应用程序代码公开数据类型。 通过此步骤,你可以指定特定列中包含的 TYPE。 此外,列相对于返回行的偏移量也是在这里逐列设置的。
  14. IAccessor 接口查询 IRowset 接口。
  15. 调用 IAccessor::CreateAccessor 方法,该方法会返回一个访问器句柄数组。 然后使用该数组访问结果集的行。
  16. 调用 IRowset::GetNextRows 传入行句柄和要获取的行数。
  17. 调用 IRowset::GetData,传入步骤 16 中返回的集中的行句柄。 将返回指向该行的原始指针。

有关搜索筛选器语法的详细信息,请参阅搜索筛选器语法

要读取返回的未处理行数据,请使用步骤 13 中创建的 DBBINDING 结构,计算步骤 17 中返回的未处理数据指针中的列偏移量。 读取列的状态部分,以获取该列的检索结果。

有关详细信息以及如何使用 ADSI OLE DB 提供程序搜索 Active Directory 的代码示例,请参阅使用 OLE DB 搜索 Active Directory 的示例代码