다음을 통해 공유


도메인 브라우저

애플리케이션은 IDsBrowseDomainTree 인터페이스를 사용하여 도메인 브라우저 대화 상자를 표시하고 사용자가 선택한 도메인의 DNS 이름을 가져올 수 있습니다. 애플리케이션은 IDsBrowseDomainTree 인터페이스를 사용하여 포리스트 내의 모든 도메인 트리 및 도메인에 대한 데이터를 가져올 수도 있습니다.

아래와 같이 CLSID_DsDomainTreeBrowser 클래스 식별자를 사용하여 CoCreateInstance를 호출하여 IDsBrowseDomainTree 인터페이스의 instance 만듭니다.

IDsBrowseDomainTree::SetComputer 메서드를 사용하여 도메인 데이터를 검색하기 위한 기준으로 사용되는 컴퓨터와 자격 증명을 지정할 수 있습니다. 특정 IDsBrowseDomainTree instance SetComputer가 호출되면 SetComputer를 다시 호출하기 전에 IDsBrowseDomainTree::FlushCachedDomains를 호출해야 합니다.

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에는 자식 및 형제 데이터를 포함하여 도메인 트리의 단일 요소에 대한 데이터가 포함됩니다. 각 후속 DOMAINDESC 구조의 pdNextSibling 멤버에 액세스하여 도메인의 형제를 열거할 수 있습니다. 도메인의 자식은 각 후속 DOMAINDESC 구조의 pdChildList 멤버에 액세스하여 비슷한 방식으로 검색할 수 있습니다.

다음 코드 예제에서는 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();
}