Şu anda belirli bir kullanıcının memberOf özniteliğini almak için C++ 'da bir LDAP sorgusu gerçekleştirmeye çalışıyorum. Sadece bir grupta olsaydı, özniteliği başarılı bir şekilde alan bir işlev var. Sorun şu ki, birden fazla grupta olduklarında sadece ilkini döndürüyorlar. Kullanıcıya Active Directory tarayıcısında baktığımda, onun MemberOf için 2 girdisi olduğunu söylediğini, ancak işlevimi kullandığımda yalnızca ilkini aldığımı görebiliyorum. Tüm girdileri geri çekmek için işlevimi değiştirmenin bir yolu var mı, yoksa tamamen yanlış yolda mıyım?C++ LDAP Sorgulamak için üyeOfile
bool FindADMembership(CStringArray* pUserArray,IDirectorySearch *pContainerToSearch, CString sAMAccountName){
if(pContainerToSearch==NULL||pUserArray==NULL)
return false;
CString strSearchFilter;
strSearchFilter.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName=%s))", sAMAccountName);
BSTR b = strSearchFilter.AllocSysString();
LPOLESTR pszSearchFilter = b;
ADS_SEARCHPREF_INFO SearchPrefs;
SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER;
SearchPrefs.vValue.Integer = ADS_SCOPE_SUBTREE;
DWORD dwNumPrefs = 1;
LPOLESTR pszColumn = NULL;
ADS_SEARCH_COLUMN col;
HRESULT hr;
IADs *pObj = NULL;
IADs * pIADs = NULL;
ADS_SEARCH_HANDLE hSearch = NULL;
hr = pContainerToSearch->SetSearchPreference(&SearchPrefs, dwNumPrefs);
if (FAILED(hr))
return false;
LPOLESTR pszNonVerboseList[] = {L"memberOf"};
LPOLESTR szName = new OLECHAR[MAX_PATH];
int iCount = 0;
hr = pContainerToSearch->ExecuteSearch(pszSearchFilter, pszNonVerboseList,sizeof(pszNonVerboseList)/sizeof(LPOLESTR),&hSearch);
if (SUCCEEDED(hr))
{
hr = pContainerToSearch->GetFirstRow(hSearch);
if (SUCCEEDED(hr))
{
while(hr != S_ADS_NOMORE_ROWS)
{
iCount++;
while(pContainerToSearch->GetNextColumnName(hSearch, &pszColumn) != S_ADS_NOMORE_COLUMNS)
{
hr = pContainerToSearch->GetColumn(hSearch, pszColumn, &col);
if (SUCCEEDED(hr))
{
if (0==wcscmp(L"memberOf", pszColumn))
{
wcscpy(szName,col.pADsValues->CaseIgnoreString);
pUserArray->Add(szName);
}
pContainerToSearch->FreeColumn(&col);
}
FreeADsMem(pszColumn);
}
hr = pContainerToSearch->GetNextRow(hSearch);
}
}
else
return false;
pContainerToSearch->CloseSearchHandle(hSearch);
}
else
return false;
return true; }
Düzenleme:
bu burada çalıştıktan sonra sonuçları yinelemenize kodudur
Sen sırayla her almak için üzerlerinden değerlerinin sayısını ve döngü kontrol etmeliyizif (0==wcscmp(L"memberOf", pszColumn)) {
for(int i = 0; i < col.dwNumValues; i++)
{
wcscpy(szName, col.pADsValues[i].CaseIgnoreString);
pUserArray->Add(szName);
}
}