ドメイン ブラウザー
IDsBrowseDomainTree インターフェイスを使用して、アプリケーションはドメイン ブラウザーダイアログ ボックスを表示し、ユーザーが選択したドメインの DNS 名を取得できます。 アプリケーションでは、IDsBrowseDomainTree インターフェイスを使用して、フォレスト内のすべてのドメイン ツリーとドメインに関するデータを取得することもできます。
IDsBrowseDomainTree インターフェイスのインスタンスは、次に示すように、CLSID_DsDomainTreeBrowser クラス識別子 CoCreateInstance を呼び出すことによって作成されます。
IDsBrowseDomainTree::SetComputer メソッドを使用して、ドメイン データを取得するための基礎として使用するコンピューターと資格情報を指定できます。 SetComputer が特定の IDsBrowseDomainTree インスタンスで呼び出されると、SetComputer が再度呼び出される前に、IDsBrowseDomainTree::FlushCachedDomains 呼び出す必要があります。
IDsBrowseDomainTree::BrowseTo メソッドを使用して、ドメイン ブラウザーダイアログ ボックスを表示します。 ユーザーがドメインを選択して [OK] ボタンをクリックすると、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 構造体には、1 つ以上の DOMAINDESC 構造体も含まれています。 DOMAINDESC には、子データや兄弟データなど、ドメイン ツリー内の 1 つの要素に関するデータが含まれています。 ドメインの兄弟は、後続の各 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();
}