一个关于AD编程的问题
我做的是基于LDAP协议的查询用户名的程序,但是通过LDAP协议总是连接不上,(用WINNTT已实现),请各位看看我的错误在哪里?
源代码:
void CAd2Dlg::OnCheck()
{
CoInitialize(NULL);
CString strName; //用户名
CString strProperty; //属性
HRESULT hr=S_OK; //状态字
VARIANT varGroupArray; //变量数组
VARIANT varGroupSingle; //所检索的元素数组
ULONG lFetch = 0; //检索时检索出的元素个数计数器
BSTR objName;
VARIANT objProperty,ojProperty;
IEnumVARIANT *pEnum = NULL; //枚举器对象接口指针
IADsContainer *pCont = NULL; //容器接口指针
IDispatch *pDisp = NULL;
IADs *pADs = NULL; //用户名指针
IADsGroup *pGroup = NULL;
UpdateData(TRUE);
m_List.ResetContent();//每次检索前先清空列表框的内容
//用当前凭证绑定到一个ADSI对象
//hr=ADsGetObject(L"WinNT://abc.com",
//IID_IADsContainer, (void**) &pCont); //用WINNT连接域中,已经实现
//hr=ADsGetObject(L"WinNT://tzp.abc.com,computer",
//IID_IADsContainer, (void**) &pCont); //连接本机,已经实现
hr=ADsGetObject(L"LDAP://DC=abc,DC=com",
IID_IADsContainer,(void**) &pCont); //用LDAP连接域中,尚未实现
//hr=ADsOpenObject(L:"LDAP://DC=abc,DC=com",wcyc_yp,123456789,"
if(FAILED(hr))
return;
//根据搜索过滤条件得到符合的用户组
LPWSTR pszGroup[] = {L"Users"}; //要的是Users
VariantInit(&varGroupArray); //当不确定所用变量是什么类型是最好先这样初始化
hr = ADsBuildVarArrayStr(pszGroup, 1,//sizeof(pszGroup)/sizeof(LPWSTR),
&varGroupArray); //由一个Unicode字符串数组建立一个变量数组
if(FAILED(hr))
return;
//把过滤得到的对象加入容器
hr = pCont->put_Filter( varGroupArray );
VariantClear(&varGroupArray);
if(FAILED(hr))
return;
//为容器建立一个枚举类对象
hr=ADsBuildEnumerator(pCont,&pEnum);
if(FAILED(hr))
return;
//循环输出符合条件的结果
while(hr==S_OK)
{
//使用从指定枚举器对象检索出的元素填充一个变量数组
hr=ADsEnumerateNext(pEnum,1,&varGroupSingle,&lFetch);
if(lFetch)
{
VariantInit(&varGroupSingle);
pDisp=V_DISPATCH(&varGroupSingle);
//查询其他接口的指针
hr=pDisp->QueryInterface(IID_IADs, (void**)&pADs);
if(!SUCCEEDED(hr))
return ;
VariantClear(&varGroupSingle);
::VariantInit(&objProperty);
::VariantInit(&ojProperty);
//通过ADSI得到对象的名字和属性
pADs->get_Name(&objName);
strName=objName;
pADs->Get(objName,&objProperty);
//把VRIANT类型转换成CSTRING
::VariantChangeType(&ojProperty,&objProperty,VARIANT_NOUSEROVERRIDE,VT_BSTR);
strProperty=ojProperty.bstrVal;
m_List.AddString(strName);
SysFreeString(objName);
//VariantClear(&objProperty);
//pGroup->Release();
pDisp->Release();
pADs->Release();
}//if
}//while
pCont->Release();
hr=ADsFreeEnumerator(pEnum);
CoUninitialize();
}