Domänenbrowser

Mithilfe der IDsBrowseDomainTree-Schnittstelle kann eine Anwendung ein Domänenbrowserdialogfeld anzeigen und den DNS-Namen der vom Benutzer ausgewählten Domäne abrufen. Eine Anwendung kann auch die IDsBrowseDomainTree-Schnittstelle verwenden, um Daten zu allen Domänenstrukturen und Domänen innerhalb einer Gesamtstruktur abzurufen.

Eine instance der IDsBrowseDomainTree-Schnittstelle wird erstellt, indem CoCreateInstance mit dem CLSID_DsDomainTreeBrowser Klassenbezeichner aufgerufen wird, wie unten gezeigt.

Die IDsBrowseDomainTree::SetComputer-Methode kann verwendet werden, um anzugeben, welcher Computer und welche Anmeldeinformationen als Grundlage für das Abrufen der Domänendaten verwendet werden. Wenn SetComputer für eine bestimmte IDsBrowseDomainTree-instance aufgerufen wird, muss IDsBrowseDomainTree::FlushCachedDomains aufgerufen werden, bevor SetComputer erneut aufgerufen wird.

Die IDsBrowseDomainTree::BrowseTo-Methode wird verwendet, um das Dialogfeld des Domänenbrowsers anzuzeigen. Wenn der Benutzer eine Domäne auswählt und auf die Schaltfläche OK klickt, gibt IDsBrowseDomainTree::BrowseToS_OK zurück, und der ppszTargetPath-Parameter enthält den Namen der ausgewählten Domäne. Wenn die Namenszeichenfolge nicht mehr benötigt wird, muss der Aufrufer die Zeichenfolge durch Aufrufen von CoTaskMemFree freigeben.

Im folgenden Codebeispiel wird gezeigt, wie Sie die IDsBrowseDomainTree-Schnittstelle verwenden, um das Dialogfeld domänenbrowser anzuzeigen.

#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();
}

Die IDsBrowseDomainTree::GetDomains-Methode wird verwendet, um Domänenstrukturdaten abzurufen. Die Domänendaten werden in einer DOMAINTREE-Struktur bereitgestellt. Die DOMAINTREE-Struktur enthält die Größe der Struktur und die Anzahl der Domänenelemente in der Struktur. Die DOMAINTREE-Struktur enthält auch eine oder mehrere DOMAINDESC-Strukturen . DOMAINDESC enthält Daten zu einem einzelnen Element in der Domänenstruktur, einschließlich untergeordneter und gleichgeordneter Daten. Die gleichgeordneten Elemente einer Domäne können durch Zugriff auf den pdNextSibling-Member jeder nachfolgenden DOMAINDESC-Struktur aufgezählt werden. Die untergeordneten Elemente der Domäne können auf ähnliche Weise durch Zugriff auf das pdChildList-Element jeder nachfolgenden DOMAINDESC-Struktur abgerufen werden.

Im folgenden Codebeispiel wird gezeigt, wie Sie die Domänenstrukturdaten mithilfe der IDsBrowseDomainTree::GetDomains-Methode abrufen und darauf zugreifen.

//  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();
}