Share via


Explorador de dominios

Con la interfaz IDsBrowseDomainTree , una aplicación puede mostrar un cuadro de diálogo del explorador de dominios y obtener el nombre DNS del dominio seleccionado por el usuario. Una aplicación también puede usar la interfaz IDsBrowseDomainTree para obtener datos sobre todos los árboles de dominio y dominios de un bosque.

Se crea una instancia de la interfaz IDsBrowseDomainTree llamando a CoCreateInstance con el identificador de clase CLSID_DsDomainTreeBrowser como se muestra a continuación.

El método IDsBrowseDomainTree::SetComputer se puede usar para especificar qué equipo y credenciales se usan como base para recuperar los datos del dominio. Cuando se llama a SetComputer en una instancia determinada de IDsBrowseDomainTree , se debe llamar a IDsBrowseDomainTree::FlushCachedDomains antes de llamar a SetComputer de nuevo.

El método IDsBrowseDomainTree::BrowseTo se usa para mostrar el cuadro de diálogo del explorador de dominios. Cuando el usuario selecciona un dominio y hace clic en el botón Aceptar , el identificadorSBrowseDomainTree::BrowseTo devuelve S_OK y el parámetro ppszTargetPath contiene el nombre del dominio seleccionado. Cuando la cadena de nombre ya no es necesaria, el autor de la llamada debe liberar la cadena llamando a CoTaskMemFree.

En el ejemplo de código siguiente se muestra cómo usar la interfaz IDsBrowseDomainTree para mostrar el cuadro de diálogo del explorador de dominios.

#include <shlobj.h>
#include <dsclient.h>

void main(void)
{
    HRESULT     hr;

    hr = CoInitialize(NULL);
    if(FAILED(hr)) 
    {
        return;
    }

    IDsBrowseDomainTree *pDsDomains = NULL;

    hr = ::CoCreateInstance(    CLSID_DsDomainTreeBrowser,
                                NULL,
                                CLSCTX_INPROC_SERVER,
                                IID_IDsBrowseDomainTree,
                                (void **)(&pDsDomains));
    
    if(SUCCEEDED(hr))
    {
        LPOLESTR    pstr;        

        hr = pDsDomains->BrowseTo(  GetDesktopWindow(),
                                    &pstr,
                                    0);
        
        if(S_OK == hr)
        {
            wprintf(pstr);
            wprintf(L"\n");
            CoTaskMemFree(pstr);
        }

        pDsDomains->Release();
    }

    CoUninitialize();
}

El método IDsBrowseDomainTree::GetDomains se usa para obtener datos de árbol de dominio. Los datos de dominio se proporcionan en una estructura DOMAINTREE . La estructura DOMAINTREE contiene el tamaño de la estructura y el número de elementos de dominio del árbol. La estructura DOMAINTREE también contiene una o varias estructuras DOMAINDESC . DOMAINDESC contiene datos sobre un único elemento del árbol de dominio, incluidos los datos secundarios y del mismo nivel. Los elementos del mismo nivel de un dominio se pueden enumerar accediendo al miembro pdNextSibling de cada estructura DOMAINDESC posterior. Los elementos secundarios del dominio se pueden recuperar de forma similar mediante el acceso al miembro pdChildList de cada estructura DOMAINDESC posterior.

En el ejemplo de código siguiente se muestra cómo obtener y acceder a los datos del árbol de dominio mediante el método IDsBrowseDomainTree::GetDomains .

//  Add dsuiext.lib to the project.

#include "stdafx.h"
#include <shlobj.h>
#include <dsclient.h>

//The PrintDomain() function displays the domain name
void PrintDomain(DOMAINDESC *pDomainDesc, DWORD dwIndentLevel)
{
    DWORD i;

    // Display the domain name.
    for(i = 0; i < dwIndentLevel; i++)
    {
        wprintf(L"  ");
    }
    wprintf(pDomainDesc->pszName);
    wprintf(L"\n");
}

//The WalkDomainTree() function traverses the domain tree and prints the current domain name
void WalkDomainTree(DOMAINDESC *pDomainDesc, DWORD dwIndentLevel = 0)
{
    DOMAINDESC  *pCurrent;

    // Walk through the current item and any siblings it may have.
    for(pCurrent = pDomainDesc; 
        NULL != pCurrent; 
        pCurrent = pCurrent->pdNextSibling)
    {
        // Print the current domain name.
        PrintDomain(pCurrent, dwIndentLevel);

        // Walk the child tree, if one exists.
        if(NULL != pCurrent->pdChildList)
        {
            WalkDomainTree(pCurrent->pdChildList, 
                           dwIndentLevel + 1);
        }
    }
}

//  Entry point for application
int main(void)
{
    HRESULT hr;
    IDsBrowseDomainTree *pBrowseTree;
    CoInitialize(NULL);

    hr = CoCreateInstance(CLSID_DsDomainTreeBrowser,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IDsBrowseDomainTree,
                          (void**)&pBrowseTree);

    if(SUCCEEDED(hr))
    {
        DOMAINTREE  *pDomTreeStruct;
        hr = pBrowseTree->GetDomains(&pDomTreeStruct, 
                                     DBDTF_RETURNFQDN);
        if(SUCCEEDED(hr))
        {
            WalkDomainTree(&pDomTreeStruct->aDomains[0]);
            hr = pBrowseTree->FreeDomains(&pDomTreeStruct);
        }
        pBrowseTree->Release();
    }
    CoUninitialize();
}