Browser di dominio
Usando l'interfaccia IDsBrowseDomainTree , un'applicazione può visualizzare una finestra di dialogo del browser di dominio e ottenere il nome DNS del dominio selezionato dall'utente. Un'applicazione può anche usare l'interfaccia IDsBrowseDomainTree per ottenere dati su tutti gli alberi e i domini di dominio all'interno di una foresta.
Un'istanza dell'interfaccia IDsBrowseDomainTree viene creata chiamando CoCreateInstance con l'identificatore di classe CLSID_DsDomainTreeBrowser come illustrato di seguito.
Il metodo IDsBrowseDomainTree::SetComputer può essere usato per specificare il computer e le credenziali usati come base per il recupero dei dati del dominio. Quando SetComputer viene chiamato in una determinata istanza IDsBrowseDomainTree, iDsBrowseDomainTree::FlushCachedDomains devono essere chiamati prima di chiamare di nuovo SetComputer.
Il metodo IDsBrowseDomainTree::BrowseTo viene usato per visualizzare la finestra di dialogo del browser di dominio. Quando l'utente seleziona un dominio e fa clic sul pulsante OK , IDsBrowseDomainTree ::BrowseTo restituisce S_OK e il parametro ppszTargetPath contiene il nome del dominio selezionato. Quando la stringa del nome non è più necessaria, il chiamante deve liberare la stringa chiamando CoTaskMemFree.
Nell'esempio di codice seguente viene illustrato come usare l'interfaccia IDsBrowseDomainTree per visualizzare la finestra di dialogo del browser di dominio.
#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();
}
Il metodo IDsBrowseDomainTree::GetDomains viene usato per ottenere i dati dell'albero di dominio. I dati di dominio vengono forniti in una struttura DOMAINTR edizione Enterprise. La struttura DOMAINTR edizione Enterprise contiene le dimensioni della struttura e il numero di elementi di dominio nell'albero. La struttura DOMAINTR edizione Enterprise contiene anche una o più strutture DOMAINDESC. DOMAINDESC contiene dati relativi a un singolo elemento nell'albero di dominio, inclusi i dati figlio e di pari livello. È possibile enumerare gli elementi di pari livello di un dominio accedendo al membro pdNextSibling di ogni struttura DOMAINDESC successiva. Gli elementi figlio del dominio possono essere recuperati in modo simile accedendo al membro pdChildList di ogni struttura DOMAINDESC successiva.
Nell'esempio di codice seguente viene illustrato come ottenere e accedere ai dati dell'albero di dominio usando il metodo 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();
}