簡體   English   中英

C ++ LDAP查詢以找到memberOf

[英]C++ LDAP Query to locate memberOf

我目前正在嘗試在c ++中執行LDAP查詢以獲取給定用戶的memberOf屬性。 我編寫了一個函數,如果它們僅在一組中,則可以成功獲取屬性。 問題在於,當它們在多個組中時,只會返回第一個。 當我在Active Directory瀏覽器中查看用戶時,我可以看到它說他們有2個memberOf條目,但是當我使用函數時,我只會得到第一個。 有沒有辦法修改我的功能以拉回所有條目,還是我完全走錯了路?

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; }

編輯:

完成此操作后,這里是遍歷結果的代碼

if (0==wcscmp(L"memberOf", pszColumn)) {
    for(int i = 0; i < col.dwNumValues; i++)
    {
        wcscpy(szName, col.pADsValues[i].CaseIgnoreString);
        pUserArray->Add(szName);
    }
}

您需要檢查值的數量並遍歷它們以依次獲取每個值pADSValues是一個數組,可以包含> 1個字符串。 該計數在dwNumValues返回。

if (0==wcscmp(L"memberOf", pszColumn))
{
    // This code should actually be a loop for i = 0 to dwNumValues - 1
    // with each loop checking the next array entry in the list pADsValues
    wcscpy(szName,col.pADsValues->CaseIgnoreString);
    pUserArray->Add(szName);
}

在這里查看文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM