Directory Services

Example Code for Locating an Application Directory Partition Host Server

The following code example shows how to use the DsGetDcName function to locate a domain controller that hosts a replica of an application directory partition. The example also shows how to use the DsCrackNames function to convert the distinguished name of an application directory partition to a DNS name.

[C++]
/***************************************************************************

	AppPartitionDNToDNS()

	Converts the distinguished name of an application directory partition to 
	a DNS name for the partition.

	The caller must free the memory allocated to ppszDNS by calling 
	FreeADsMem when it is no longer required.

***************************************************************************/

DWORD AppPartitionDNToDNS(LPCTSTR pszDN, LPTSTR *ppszDNS)
{
	if(IsBadWritePtr(ppszDNS, sizeof(LPTSTR)))
	{
		return E_POINTER;
}

	DWORD dwRet;
	LPCTSTR rgpszNames[] = {pszDN};
	PDS_NAME_RESULT pResults;

	/*
	Convert the distinguished name to a DNS name using only syntactic 
	mapping. The DS_NAME_FLAG_SYNTACTICAL_ONLY flag allows DsCrackNames to 
	be called without binding.
	*/
	dwRet = DsCrackNames(NULL, 
		DS_NAME_FLAG_SYNTACTICAL_ONLY,
		DS_FQDN_1779_NAME,
		DS_CANONICAL_NAME,
		1,
		rgpszNames,
		&pResults);

	if(NO_ERROR == dwRet)
	{
		/*
		Allocate the memory and copy the DNS name of the partition.
		*/
		DWORD dwBytes = (lstrlen(pResults->rItems[0].pDomain) + 1) * sizeof(TCHAR);
		*ppszDNS = (LPTSTR)AllocADsMem(dwBytes);
		if(*ppszDNS)
		{
			lstrcpyn(*ppszDNS, pResults->rItems[0].pDomain, dwBytes);

			dwRet = NO_ERROR;
	}
		else
		{
			dwRet = ERROR_NOT_ENOUGH_MEMORY;
	}
	
		// Free the result set.
		DsFreeNameResult(pResults);
}

	return dwRet;
}

/***************************************************************************

	PrintDCFromAppPartition()

	Given the distinguished name of an application directory partition, 
	prints to the console the DNS name of a domain controller that hosts a 
	replica of the application directory partition.

***************************************************************************/

DWORD PrintDCFromAppPartition(LPCTSTR pszAppPartitionDN)
{
	DWORD dwRet;

	/*
	Convert the distinguished name of the partition to a DNS name so that 
	the DNS name can be passed to DsGetDcName.
	*/
	LPTSTR pszDNS;
	dwRet = AppPartitionDNToDNS(pszAppPartitionDN, &pszDNS);
	if(NO_ERROR == dwRet)
	{
		PDOMAIN_CONTROLLER_INFO pdci;

		/*
		Get the name of a domain controller that hosts a replica of the 
		application directory partition.
		*/
		dwRet = DsGetDcName(NULL, 
			pszDNS, 
			NULL, 
			NULL, 
			DS_ONLY_LDAP_NEEDED, 
			&pdci);

		if(NO_ERROR == dwRet)
		{
			// Print the DNS name of the domain controller.
			_tprintf(pdci->DomainControllerName);
		
			NetApiBufferFree(pdci);
	}

		FreeADsMem(pszDNS);
}

	return dwRet;
}