Directory Services

Example Code for Ranging with IDirectoryObject

The following C++ code example contains a function that uses ranging to retrieve the members of a group using the IDirectoryObject interface.

//***************************************************************************
//
//  EnumGroupWithIDirectoryObject()
//
//***************************************************************************

HRESULT EnumGroupWithIDirectoryObject(LPCWSTR pwszGroupDN, 
									LPCWSTR pwszUsername, 
									LPCWSTR pwszPassword)
{
	if(NULL == pwszGroupDN)
	{
		return E_POINTER;
}

	HRESULT hr;
	IDirectoryObject *pdo;

	hr = ADsOpenObject( pwszGroupDN,
						pwszUsername,
						pwszPassword,
						ADS_SECURE_AUTHENTICATION,
						IID_IDirectoryObject, 
						(void**)&pdo);

	if(SUCCEEDED(hr))
	{
		PADS_ATTR_INFO pAttrInfo;
		const DWORD dwStep = 1000;
		DWORD dwLowRange;
		DWORD dwHighRange;
		DWORD dwRetrieved;
		WCHAR wszAttr[MAX_PATH];
		LPWSTR rgAttrs[1];

		rgAttrs[0] = wszAttr;

		dwLowRange = 0;
		dwHighRange = dwLowRange + (dwStep - 1);
		 
		do
		{
			wsprintfW(wszAttr, L"member;range=%d-%d", dwLowRange, dwHighRange);
			hr = pdo->GetObjectAttributes(rgAttrs, 1, &pAttrInfo, &dwRetrieved); 
			if(SUCCEEDED(hr))
			{
				DWORD i;
			
				for(i = 0; i < dwRetrieved; i++)
				{
					DWORD x;

					for(x = 0; x < pAttrInfo[i].dwNumValues; x++)
					{
						wprintf(L"%s\n", pAttrInfo[i].pADsValues[x].CaseIgnoreString);
				}
			}

				FreeADsMem(pAttrInfo);

				dwLowRange = dwHighRange + 1;
				dwHighRange = dwLowRange + (dwStep - 1);
		}

			if(0 == dwRetrieved)
			{
				break;
		}

	}while(SUCCEEDED(hr));
	
		pdo->Release();
}

	return hr;
}