Platform SDK: Active Directory, ADSI, and Directory Services

Example Code for Getting the Distinguished Name for the Naming Context

The following code fragments contain a function that returns the distinguished name of the specified naming context (defined in the enumerated type NAMING_CONTEXT) using serverless binding and rootDSE.

[Visual Basic]
Function GetNamingContext(ByVal sPropertyName As String) As String
    Dim IADsRootDSE As IADs
    GetNamingContext = ""
    Set IADsRootDSE = GetObject("LDAP://rootDSE")
    GetNamingContext = IADsRootDSE.Get(sPropertyName)
    Set IADsRootDSE = Nothing
End Function
[C++]
typedef enum
{
    NC_CURRENT_DOMAIN = 0x0,
    NC_ROOT_OF_DOMAIN_TREE,
    NC_SCHEMA,
    NC_CONFIG
} NAMING_CONTEXT;
 
HRESULT GetNamingContextDN(
          NAMING_CONTEXT namingcontext,
          LPOLESTR *ppDNString
          )
{
    LPOLESTR pszDSPath = L"LDAP://rootDSE";
    LPOLESTR pszProperty = NULL;
    HRESULT hr = S_OK;
    VARIANT var;
    IADs *pObj = NULL;
 
    //Get the rootDSE.
    hr = ADsGetObject(pszDSPath,
                      IID_IADs,
                      (void**)&pObj);
    if (SUCCEEDED(hr))
    {
        //String to specify property to get based on namingcontext.
        switch (namingcontext)
        {
            //Ask for DN of root of domain tree that contains the current domain.
            case NC_ROOT_OF_DOMAIN_TREE:
                pszProperty = L"rootDomainNamingContext";
                break;
            //Ask for DN of schema container in the current domain.
            case NC_SCHEMA:
                pszProperty = L"schemaNamingContext";
                break;
            //Ask for DN of config container in the current domain.
            case NC_CONFIG:
                pszProperty = L"configurationNamingContext";
                break;
            //Ask for DN for current domain.
            case NC_CURRENT_DOMAIN:
            default:
                pszProperty = L"defaultNamingContext";
                break;
        }
        //Get the DN from the specified property of rootDSE.
        if (pszProperty)
        {
            hr = pObj->Get(pszProperty,&var);
            if (SUCCEEDED(hr))
            {
                *ppDNString = (OLECHAR *)CoTaskMemAlloc (sizeof(OLECHAR)*(wcslen(var.bstrVal)+1));
                if (*ppDNString)
                    wcscpy(*ppDNString, var.bstrVal);
            }
        }
    }
    // Clean up
    if (pObj)
        pObj->Release();
    VariantClear(&var);
    return hr;
    //The caller needs to call CoTaskMemFree on ppDNString.
}