Platform SDK: Active Directory, ADSI, and Directory Services

Example Code for Reading a Constructed Property

The following code fragments read the canonicalName property of the Administrator.

[C++]
//Read the canonicalName of Administrator
#include <wchar.h>
#include <objbase.h>
#include <activeds.h>

void wmain( int argc, wchar_t *argv[ ])
{

//Intialize COM
CoInitialize(NULL);
HRESULT hr = S_OK;
//Get rootDSE and the domain container's DN.
IADs *pObject = NULL;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
VARIANT var;
hr = ADsOpenObject(L"LDAP://rootDSE",
                 NULL,
                 NULL,
                 ADS_SECURE_AUTHENTICATION, //Use Secure Authentication
                 IID_IADs,
                 (void**)&pObject);
if (FAILED(hr))
{
   wprintf(L"Not Found. Could not bind to the domain.\n");
   if (pObject)
     pObject->Release();
   return;
}

hr = pObject->Get(L"defaultNamingContext",&var);
if (SUCCEEDED(hr))
{
    wcscpy(szPath,L"LDAP://");
    wcscat(szPath,L"cn=Administrator,cn=Users,");
    wcscat(szPath,var.bstrVal);
    VariantClear(&var);
    if (pObject)
    {
       pObject->Release();
       pObject = NULL;
    }
    //Bind to the Administrator user object.
    hr = ADsOpenObject(szPath,
                     NULL,
                     NULL,
                     ADS_SECURE_AUTHENTICATION, //Use Secure Authentication
                     IID_IADs,
                     (void**)&pObject);
    if (SUCCEEDED(hr))
    {
        //
        LPOLESTR pwszArray[] = {L"canonicalName"};
        DWORD dwArrayItems = sizeof(pwszArray)/sizeof(LPOLESTR);
        VARIANT vArray;
        VariantInit(&vArray);
        // Build a Variant of array type, using the specified string array.
        hr = ADsBuildVarArrayStr(pwszArray, dwArrayItems, &vArray);
        if (SUCCEEDED(hr))
        {
            hr = pObject->GetInfoEx(vArray,0L);
            hr = pObject->Get(L"canonicalName", &var);
            if (SUCCEEDED(hr))
                wprintf(L"canonicalName: %s\n",var.bstrVal);
            else
                wprintf(L"Get failed with hr: %x\n",hr);
            VariantClear(&var);
        }
    }
    if (pObject)
        pObject->Release();
}

//Uninitialize COM
CoUninitialize();

    return;
}
[Visual Basic]
'Read the canonicalName of Administrator
Dim rootDSE As IADs
Dim user As IADs

sPrefix = "LDAP://"
Set rootDSE = GetObject(sPrefix & "rootDSE")
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on GetObject method"
End If
sDomain = rootDSE.Get("defaultNamingContext")
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on Get method"
End If
sUserDN = "cn=Administrator,cn=users," + sDomain
'''''''''''''''''''''''''''''''''''''''
'Bind to the Administrator user
'''''''''''''''''''''''''''''''''''''''
Set user = GetObject(sPrefix & sUserDN)
user.GetInfoEx Array("canonicalName"), 0
strText = "Canonical Name: " & user.Get("canonicalName")
If (Err.Number <> 0) Then
  BailOnFailure Err.Number, "on Get method"
End If
show_items strText, sComputer
 
'''''''''''''''''''''''''''''''''''''''
'Display subroutines
'''''''''''''''''''''''''''''''''''''''
Sub show_items(strText, strName)
    MsgBox strText, vbInformation, "Get canonicalName for Administrator"
End Sub
 
Sub BailOnFailure(ErrNum, ErrText)    strText = "Error 0x" & Hex(ErrNum) & " " & ErrText
    MsgBox strText, vbInformation, "ADSI Error"
    WScript.Quit
End Sub