Freigeben über


Domänenbrowser

Mithilfe der IDsBrowseDomainTree Schnittstelle kann eine Anwendung ein Dialogfeld für einen Domänenbrowser 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 in einer Gesamtstruktur abzurufen.

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

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

Die IDsBrowseDomainTree::BrowseTo-Methode wird verwendet, um das Dialogfeld "Domänenbrowser" anzuzeigen. Wenn der Benutzer eine Domäne auswählt und auf die Schaltfläche OK klickt, gibt die IDsBrowseDomainTree::BrowseToS_OK zurück, und der ppszTargetPath Parameter enthält den Namen der ausgewählten Domäne. Wenn die Namenszeichenfolge nicht mehr erforderlich ist, muss der Aufrufer die Zeichenfolge freigeben, indem CoTaskMemFreeaufgerufen wird.

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. Die 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 aufgezählt werden, indem sie auf das pdNextSibling Member jeder nachfolgenden DOMAINDESC- Struktur zugreifen. Die untergeordneten Elemente der Domäne können auf ähnliche Weise abgerufen werden, indem sie auf das pdChildList Mitglied jeder nachfolgenden DOMAINDESC- Struktur zugreifen.

Das folgende Codebeispiel zeigt, wie Sie mithilfe der IDsBrowseDomainTree::GetDomains-Methode die Domänenstrukturdaten 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();
}