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