建立了一个测试的域,域内有用户6000,但是使用下面的代码段(从CSDN上面找到后修改出来的)列出所有的用户时出错了,只能显示出前面1000个用户.
long GetUserInfoList(LPOLESTR pszServer,LPUSERINFO &lpUserInfo,DWORD &dwUserCount)
{
IADs *pADs = NULL;
IDirectorySearch *pSearchBase = NULL;
OLECHAR szPath[MAX_PATH+1];
VARIANT var;
//for my purpose to pass the result out of the program
DWORD dwSizeofArray =200;
DWORD dwSizeIncrease =200;
LPOLESTR szAccountName =NULL;
LPOLESTR szName =NULL;
lpUserInfo = new UserInfo[dwSizeofArray]; wcscpy(szPath,L"LDAP://");
if(pszServer!=NULL && wcslen(pszServer))

wcscpy(&(szPath[wcslen(szPath)]),pszServer);
else
wcscpy(&(szPath[wcslen(szPath)]),L"rootDSE"); CoInitialize(NULL);
HRESULT hr = ADsOpenObject(szPath,// L"LDAP://rootDSE",
NULL,NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IADs,(void**)&pADs);

if(!SUCCEEDED(hr) || pADs == NULL)
{
return E_FAIL;
}
VariantInit(&var);
hr = pADs->Get(L"defaultNamingContext",&var);
if (!SUCCEEDED(hr))
{
pADs->Release();
return E_FAIL;
}
wcscpy(szPath,L"LDAP://");
wcscat(szPath,var.bstrVal);
VariantClear(&var);
if (pADs)
{
pADs->Release();
pADs = NULL;
}
// Bind to the root of the current domain.
hr = ADsOpenObject( szPath,NULL,NULL,
ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
IID_IDirectorySearch,
(void**)&pSearchBase);
if (!SUCCEEDED(hr))
{
return E_FAIL;
}
HRESULT hrObj = E_FAIL;
hr = E_FAIL;
if ((!pSearchBase))
{
return E_FAIL;
}
//Create search filter
OLECHAR pszSearchFilter[MAX_PATH+1];
OLECHAR szADsPath[MAX_PATH+1];
wcscpy(pszSearchFilter, L"(&(objectCategory=person)(objectClass=user))");
//Search entire subtree from root.
ADS_SEARCHPREF_INFO SearchPrefs;
SearchPrefs.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
SearchPrefs.vValue.dwType = ADSTYPE_INTEGER;
SearchPrefs.vValue.Integer = ADS_SCOPE_SUBTREE;

DWORD dwNumPrefs = 1;
// COL for iterations
ADS_SEARCH_COLUMN col;
// Handle used for searching
ADS_SEARCH_HANDLE hSearch;
// Set the search preference
hr = pSearchBase->SetSearchPreference( &SearchPrefs, dwNumPrefs);
if (FAILED(hr))
{
pSearchBase->Release();
return hr;
}
// Set attributes to return
CONST DWORD dwAttrNameSize = 1;
LPOLESTR pszAttribute[dwAttrNameSize] = {L"ADsPath"};
// Execute the search
hr = pSearchBase->ExecuteSearch(pszSearchFilter,
pszAttribute,
dwAttrNameSize,
&hSearch);
// INT iGroupCount = cNewGroupList.GetCount();
if (!SUCCEEDED(hr))
{
pSearchBase->Release();
return S_OK;
}
VARIANT varName;
BSTR bstrName = NULL;
OLECHAR *szComputerDisplayName;
OLECHAR *szComputerSAMName ;
OLECHAR *szComputerPrincipalName; //this parameter not used yet
DWORD dwCount =0;
while( pSearchBase->GetNextRow( hSearch) != S_ADS_NOMORE_ROWS )
{
szComputerDisplayName =new OLECHAR[MAX_PATH+1];
szComputerSAMName =new OLECHAR[MAX_PATH+1];
szComputerPrincipalName =new OLECHAR[MAX_PATH+1]; for (DWORD x = 0; x < dwAttrNameSize; x++)
{
// Get the data for this column
hr = pSearchBase->GetColumn( hSearch, pszAttribute[x], &col );
if ( !SUCCEEDED(hr) )
{//在第1000个时程序在这里出错了.
pSearchBase->CloseSearchHandle(hSearch);
pSearchBase->Release();
return E_FAIL;
}
............................

解决方案 »

  1.   

    看了MSDN是要设置页面的大小,上面说的很明白,总算理解了这个参数的意义了。  
    ADS_SEARCHPREF_INFO SearchPrefs[2]; SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
    SearchPrefs[0].vValue.dwType = ADSTYPE_INTEGER;
    SearchPrefs[0].vValue.Integer = 100; SearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
    SearchPrefs[1].vValue.dwType = ADSTYPE_INTEGER;
    SearchPrefs[1].vValue.Integer = ADS_SCOPE_SUBTREE;