Navegador de Domínio
Usando a interfaceIDsBrowseDomainTree, um aplicativo pode exibir uma caixa de diálogo do navegador de domínio e obter o nome DNS do domínio selecionado pelo usuário. Um aplicativo também pode usar a interface IDsBrowseDomainTree para obter dados sobre todas as árvores de domínio e domínios dentro de uma floresta.
Uma instância da interfaceIDsBrowseDomainTree é criada chamando CoCreateInstance com o identificador de classe CLSID_DsDomainTreeBrowser, conforme mostrado abaixo.
O método IDsBrowseDomainTree::SetComputer pode ser usado para especificar quais computadores e credenciais são usados como base para recuperar os dados de domínio. Quando SetComputer é chamado em uma instância deIDsBrowseDomainTreeespecífica, IDsBrowseDomainTree::FlushCachedDomains deve ser chamado antes que SetComputer seja chamado novamente.
O método IDsBrowseDomainTree::BrowseTo é usado para exibir a caixa de diálogo do navegador de domínio. Quando o usuário seleciona um domínio e clica no botão OK, o parâmetro IDsBrowseDomainTree::BrowseTo retorna S_OK e o parâmetro ppszTargetPath contém o nome do domínio selecionado. Quando a cadeia de caracteres de nome não for mais necessária, o chamador deverá liberar a cadeia de caracteres chamando CoTaskMemFree.
O exemplo de código a seguir mostra como usar a interfaceIDsBrowseDomainTreepara exibir a caixa de diálogo do navegador de domínio.
#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();
}
O método IDsBrowseDomainTree::GetDomains é usado para obter dados de árvore de domínio. Os dados de domínio são fornecidos em uma estrutura deDOMAINTREE. A estrutura DOMAINTREE contém o tamanho da estrutura e o número de elementos de domínio na árvore. A estrutura de DOMAINTREE também contém uma ou mais estruturas deDOMAINDESC. O DOMAINDESC contém dados sobre um único elemento na árvore de domínio, incluindo dados filho e irmão. Os irmãos de um domínio podem ser enumerados acessando o membro pdNextSibling de cada estrutura de DOMAINDESC subsequente. Os filhos do domínio podem ser recuperados de maneira semelhante acessando o pdChildList membro de cada estrutura de DOMAINDESC subsequente.
O exemplo de código a seguir mostra como obter e acessar os dados da árvore de domínio usando o métodoIDsBrowseDomainTree::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();
}