Domain Browser

Menggunakan antarmuka IDsBrowseDomainTree, aplikasi dapat menampilkan kotak dialog browser domain dan mendapatkan nama DNS domain yang dipilih oleh pengguna. Aplikasi juga dapat menggunakan antarmuka IDsBrowseDomainTree untuk mendapatkan data tentang semua pohon domain dan domain dalam forest.

Instans antarmuka IDsBrowseDomainTree dibuat dengan memanggil CoCreateInstance dengan pengidentifikasi kelas CLSID_DsDomainTreeBrowser seperti yang ditunjukkan di bawah ini.

Metode IDsBrowseDomainTree::SetComputer dapat digunakan untuk menentukan komputer dan kredensial mana yang digunakan sebagai dasar untuk mengambil data domain. Ketika SetComputer dipanggil pada instans IDsBrowseDomainTree tertentu, IDsBrowseDomainTree::FlushCachedDomains harus dipanggil sebelum SetComputer dipanggil lagi.

Metode IDsBrowseDomainTree::BrowseTo digunakan untuk menampilkan kotak dialog browser domain. Saat pengguna memilih domain dan mengklik tombol OK , IDsBrowseDomainTree::BrowseTo mengembalikan S_OK dan parameter ppszTargetPath berisi nama domain yang dipilih. Ketika string nama tidak lagi diperlukan, pemanggil harus membebaskan string dengan memanggil CoTaskMemFree.

Contoh kode berikut menunjukkan cara menggunakan antarmuka IDsBrowseDomainTree untuk menampilkan kotak dialog browser domain.

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

Metode IDsBrowseDomainTree::GetDomains digunakan untuk mendapatkan data pohon domain. Data domain disediakan dalam struktur DOMAINTREE. Struktur DOMAINTREE berisi ukuran struktur dan jumlah elemen domain di pohon. Struktur DOMAINTREE juga berisi satu atau beberapa struktur DOMAINDESC. DOMAINDESC berisi data tentang satu elemen di pohon domain, termasuk data anak dan saudara. Saudara kandung domain dapat dijumlahkan dengan mengakses anggota pdNextSibling dari setiap struktur DOMAINDESC berikutnya. Anak-anak domain dapat diambil dengan cara yang sama dengan mengakses anggota pdChildList dari setiap struktur DOMAINDESC berikutnya.

Contoh kode berikut menunjukkan cara mendapatkan dan mengakses data pohon domain menggunakan metode 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();
}