• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1010
  • Last Modified:

ADsEnumerateNext failing enumerating Global Catalog

Hi all

I've been searching for a day now for information on why ADsEnumerateNext can fail enumerating the global catalog.  

I've a client whose debug log files show me that this function is failing with S_FALSE.  The code is below.

I just get a debug trace back with enumerated 0 objects.

The process is a system service, running in an account which has domain administrator privileges.

I'm wondering what the possible failure modes for this are, e.g.

1. There is nothing in the GC (is this even possible)?
2. Service does not have permission to enumerate the GC (but can connect to it?)
3. There's some referral required?
4. User is in wrong domain without proper trust relation to the forest

Any ideas to check?
IADsContainer *pCont = NULL;
HRESULT rc = ADsOpenObject( L"GC:", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsContainer, (void**)&pCont);
if( S_OK == rc )
{
	IEnumVARIANT *pEnum = NULL;
	FileTrace("[*] GetIADs -> Opened IID_IADsContainer");
	rc = ADsBuildEnumerator(pCont, &pEnum);
	if(S_OK == hResult) 
	{
		FileTrace("[*] GetIADs -> Built enumeration VARIANT");
		IDispatch *pDisp = NULL;
		ULONG lFetch = 0;
		VARIANT var;
		VariantInit( &var );
 
		// Now enumerate. There is only one child of the GC: object.
		rc = ADsEnumerateNext(pEnum, 1, &var, &lFetch);
		if (( rc == S_OK ) && ( lFetch == 1 ) )     
		{    
			FileTrace("[*] GetIADs -> Enumerated 1 object");
			pDisp = V_DISPATCH(&var);
			rc = pDisp->QueryInterface( IID_IADs, (void**)&pIADS); 
			if (pDisp)(pDisp)->Release();
		}
		else
		{
			FileTrace("[*] GetIADs -> Enumerated %d objects (hResult: %x)",lFetch,rc);
		}
 
		// clean up the variant.
		VariantClear(&var);
 
		if (pEnum) ADsFreeEnumerator(pEnum);
	}				
	else
	{
		FileTrace("[*] GetIADs -> ADsBuildEnumerator failed (rc: %x)", hResult);
	}
	if( pCont ) pCont->Release( );
}
else
{
	FileTrace("[*] GetIADs -> ADsOpenObject failed (hResult: %x)", rc);
}

Open in new window

0
Adrien de Croy
Asked:
Adrien de Croy
1 Solution
 
meugenCommented:
According to MSDN website: S_FALSE means The call succeeded, but the number of items returned is less than those requested.
Maybe this helps you: http://msdn.microsoft.com/en-us/library/aa772181(VS.85).aspx
0
 
Adrien de CroyAuthor Commented:
Hi

was already aware of that, since I was only asking for 1 item, to return S_FALSE would still mean there are no items.

Turns out the problem was to do with the client's AD configuration, they reinstalled their OS, and the problem went away
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now