最近需要读取AD中的用户列表以及组织架构,使用到一下的方式:BOOL ReadAdTree(LPWSTR strLDAPURL) { BOOL bRet = FALSE; HRESULT hr; IADsContainer *pContainer = NULL; IEnumVARIANT *pEnum = NULL; int pos = -1; VARIANT varChild; IADs *pADs1 = NULL; LPWSTR strName, strDisplayName, strNewURL; BSTR bstrValue; CComBSTR bstrGuid; VARIANT varLoginName; // 登陆名 LPWSTR strLoginName; //登陆名 LPWSTR strPrefix = L"LDAP://"; //前缀 int nt = wcslen(strPrefix); LPWSTR strObjUrl = strLDAPURL + nt; //地址 int nChildCount = 0; // // 打开对像 // hr = ADsGetObject( strLDAPURL, IID_IADsContainer, (void**) &pContainer ); if (S_OK != hr) { goto label_Exit; } // // 得到对象的枚举器 // hr = ADsBuildEnumerator (pContainer,&pEnum); if (S_OK != hr) { goto label_Exit; } // // 枚举对象下的子项 // while(1) { hr = ADsEnumerateNext (pEnum,1,&varChild,NULL); if (S_FALSE == hr) //如果子项为空,则退出 { bRet = TRUE; goto label_Exit; } nChildCount++; hr = varChild.pdispVal->QueryInterface (IID_IADs,(void **)&pADs1); if (S_OK != hr) //接口不支持 { continue ; } // // 对象名称 (格式: xx=???, xx表示类型, ???表示名称) // hr = pADs1->get_Name(&bstrValue); strName = bstrValue; // WCHAR c[512]; // swprintf((WCHAR *)c,L"/t HELL name --------LDAP://%s /n",strName); // OutputDebugStringW(c); // // 获取登陆名 // VariantInit(&varLoginName); hr=pADs1->Get(L"userPrincipalName",&varLoginName); switch (varLoginName.vt) { case VT_BSTR://字符串 { strLoginName = varLoginName.bstrVal; } break; default: strLoginName = L""; break; } // // 去掉 = 之前的字符 // LPWSTR lpsz = wcschr(strName , (_TUCHAR)'='); pos = (lpsz == NULL) ? -1 : (int)(lpsz - strName); if (pos > 0) { strDisplayName = strName + pos + 1; } else { strDisplayName = strName; } // end lpsz = wcsstr(strName , L"OU"); pos = (lpsz == NULL) ? -1 : (int)(lpsz - strName); if (!pos) { // todo } else { } // // 构造当前对象的 URL, 递归查找 // WCHAR cc[512] ; swprintf((WCHAR *)cc,L"LDAP://%s,%s",strName, strObjUrl); WCHAR ccc[512] ; swprintf((WCHAR *)ccc,L"/t HELL LADP --------LDAP://%s,%s /n",strName, strObjUrl); OutputDebugStringW(ccc); ReadAdTree(cc); // } label_Exit: if (pADs1) { pADs1->Release(); } // if (pEnum) //因为用的是 Smart Point , 不用手动 Release // { // pEnum->Release(); // } if (pContainer) { pContainer->Release(); } return bRet; } int wmain(int argc, char* argv[]) { CoInitialize(NULL); ReadAdTree(L"LDAP://ou=用户, DC=bydhq,DC=com,DC=cn"); CoUninitialize(); return 0; }