使用IDirectoryObject而非IADs的理由

ADSI(Active DirectoryServices Interface)是一组COM对象的集合,它为Active Directory或其他LDAP目录中的对象和属性提供了便捷的访问方式。大多数程序员在编程时会使用IADs接口,但对于C++程序员来说,使用非脚本接口IDirectoryObject可以提高性能和简化编码(如果使用脚本语言和/或Visual Basic,别无选择,只能使用IADs接口)。所有ADSI提供者都必须实现IADs和IDirectoryInterface,因此为什么不利用IDirectoryObject接口的特性呢?

IADs与IDirectoryObject的主要区别

IDirectoryObject与IADs的主要区别在于,IDirectoryObject可以直接访问目录。IADs使用属性缓存,通过Get()、get_*和put_*方法读取和写入属性,并且必须接受所有数据都是以VARIANT数据类型交付的。IDirectoryObject允许通过单个请求直接读取和写入对象。

示例

以下是三个代码片段,它们几乎做了相同的事情:使用给定的GUID检索Active Directory中用户的distinguishedName属性。这些示例可以在上面下载。

以下示例显示了一个消息框,显示distinguishedName,是用VBScript编写的。

Dim oObject As IADs Dim vValue As Variant Set oObject = GetObject("GC://") vValue = oObject.Get("distinguishedName")

以下示例在控制台中打印distinguishedName,是用C++编写的。

IADs* pObject; HRESULT hr; VARIANT vValue; hr = ADsGetObject(CComBSTR(L"GC://"), IID_IADs, (void**)&pObject); if (SUCCEEDED(hr)) { hr = pObject->Get(CComBSTR(L"distinguishedName"), &vValue); if (SUCCEEDED(hr)) { USES_CONVERSION; printf("distinguishedName is %s\n", W2A(vValue.bstrVal)); VariantClear(&vValue); } pObject->Release(); }

与上述相同,但现在使用IDirectoryObject。编码更多,但速度略快!

IDirectoryObject* pObject; HRESULT hr; PADS_ATTR_INFO pAttributeEntries; LPWSTR ppAttributeNames[] = {L"distinguishedName"}; DWORD dwAttributesReturned = 0; hr = ADsGetObject(CComBSTR(L"GC://"), IID_IDirectoryObject, (void**)&pObject); if (SUCCEEDED(hr)) { hr = pObject->GetObjectAttributes(ppAttributeNames, 1, &pAttributeEntries, &dwAttributesReturned); if (SUCCEEDED(hr)) { if (dwAttributesReturned > 0) { printf("distinguishedName is %S\n", pAttributeEntries->pADsValues[0].CaseIgnoreString); } FreeADsMem(pAttributeEntries); // Free up ADSI memory resources } pObject->Release(); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485