Браузер домена

С помощью интерфейса IDsBrowseDomainTree приложение может отобразить диалоговое окно браузера домена и получить DNS-имя домена, выбранного пользователем. Приложение также может использовать интерфейс IDsBrowseDomainTree для получения данных обо всех деревах домена и доменах в лесу.

Экземпляр интерфейса IDsBrowseDomainTree создается путем вызова CoCreateInstance с идентификатором класса CLSID_DsDomainTreeBrowser, как показано ниже.

Метод IDsBrowseDomainTree::SetComputer можно использовать для указания компьютера и учетных данных, используемых в качестве основы для получения данных домена. При вызове SetComputer для определенного экземпляра IDsBrowseDomainTree необходимо вызвать идентификаторы IDsBrowseDomainTree::FlushCachedDomains перед вызовом SetComputer снова.

Метод IDsBrowseDomainTree::BrowseTo используется для отображения диалогового окна браузера домена. Когда пользователь выбирает домен и нажимает кнопку "ОК ", идентификатор IDsBrowseDomainTree::BrowseTo возвращает S_OK , а параметр ppszTargetPath содержит имя выбранного домена. Если строка имени больше не требуется, вызывающий объект должен освободить строку, вызвав CoTaskMemFree.

В следующем примере кода показано, как использовать интерфейс IDsBrowseDomainTree для отображения диалогового окна браузера домена.

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

Метод IDsBrowseDomainTree::GetDomains используется для получения данных дерева домена. Данные домена предоставляются в структуре DOMAINTREE. Структура DOMAINTREE содержит размер структуры и количество элементов домена в дереве. Структура DOMAINTREE также содержит одну или несколько структур DOMAINDESC. DOMAINDESC содержит данные об одном элементе в дереве домена, включая дочерние и одноуровневые данные. Одноуровневые элементы домена можно перечислить путем доступа к члену pdNextSibling каждой последующей структуры DOMAINDESC . Дочерние элементы домена можно получить аналогичным образом, доступ к члену pdChildList каждой последующей структуры DOMAINDESC .

В следующем примере кода показано, как получить и получить доступ к данным дерева домена с помощью метода 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();
}