域浏览器
使用 IDsBrowseDomainTree 接口,应用程序可以显示域浏览器对话框,并获取用户选择的域的 DNS 名称。 应用程序还可以使用 IDsBrowseDomainTree 接口获取林中所有域树和域的数据。
通过使用 CLSID_DsDomainTreeBrowser 类标识符调用 CoCreateInstance,可以创建 IDsBrowseDomainTree 接口的实例,如下所示。
IDsBrowseDomainTree::SetComputer 方法可用于指定哪些计算机和凭据用作检索域数据的基础。 在特定的 IDsBrowseDomainTree 实例上调用 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();
}