Explorateur de domaines
À l’aide de l’interface IDsBrowseDomainTree , une application peut afficher une boîte de dialogue de navigateur de domaine et obtenir le nom DNS du domaine sélectionné par l’utilisateur. Une application peut également utiliser l’interface IDsBrowseDomainTree pour obtenir des données sur toutes les arborescences de domaines et domaines au sein d’une forêt.
Une instance de l’interface IDsBrowseDomainTree est créée en appelant CoCreateInstance avec l’identificateur de classe CLSID_DsDomainTreeBrowser comme indiqué ci-dessous.
La méthode IDsBrowseDomainTree::SetComputer peut être utilisée pour spécifier l’ordinateur et les informations d’identification utilisés comme base pour récupérer les données de domaine. Lorsque SetComputer est appelé sur un instance IDsBrowseDomainTree particulier, IDsBrowseDomainTree::FlushCachedDomains doit être appelé avant que SetComputer ne soit appelé à nouveau.
La méthode IDsBrowseDomainTree::BrowseTo est utilisée pour afficher la boîte de dialogue du navigateur de domaine. Lorsque l’utilisateur sélectionne un domaine et clique sur le bouton OK , IDsBrowseDomainTree::BrowseTo retourne S_OK et le paramètre ppszTargetPath contient le nom du domaine sélectionné. Lorsque la chaîne de nom n’est plus requise, l’appelant doit libérer la chaîne en appelant CoTaskMemFree.
L’exemple de code suivant montre comment utiliser l’interface IDsBrowseDomainTree pour afficher la boîte de dialogue de l’navigateur de domaine.
#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();
}
La méthode IDsBrowseDomainTree::GetDomains est utilisée pour obtenir des données d’arborescence de domaine. Les données de domaine sont fournies dans une structure DOMAINTREE . La structure DOMAINTREE contient la taille de la structure et le nombre d’éléments de domaine dans l’arborescence. La structure DOMAINTREE contient également une ou plusieurs structures DOMAINDESC . Le DOMAINDESC contient des données relatives à un seul élément dans l’arborescence de domaine, y compris les données enfants et frères. Les frères et sœurs d’un domaine peuvent être énumérés en accédant au membre pdNextSibling de chaque structure DOMAINDESC suivante. Les enfants du domaine peuvent être récupérés de la même manière en accédant au membre pdChildList de chaque structure DOMAINDESC suivante.
L’exemple de code suivant montre comment obtenir et accéder aux données de l’arborescence de domaine à l’aide de la méthode 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();
}