アプリケーションからの作成ウィザードの呼び出し
アプリケーションまたはコンポーネントは、Active Directory管理MMCスナップインで使用されるのと同じディレクトリサービスオブジェクト作成ウィザードを使用できます。これは、IDsAdminCreateObjインターフェイスを使用して実現されます。
IDsAdminCreateObjインターフェイスの使用
アプリケーションまたはコンポーネント (クライアント) は、CLSID_DsAdminCreateObjクラス識別子を使用してCoCreateInstanceを呼び出すことによって、IDsAdminCreateObjインターフェイスのインスタンスを作成します。 CoCreateInstance が呼び出される前にCoInitializeを呼び出すことによって、COMを初期化する必要があります。
次に、クライアントはIDsAdminCreateObj::Initializeを呼び出してIDsAdminCreateObjオブジェクトを初期化します。 IDsAdminCreateObj :: Initializeは、オブジェクトを作成するコンテナーを表すIADsContainerインターフェイスポインターと、作成するオブジェクトのクラス名を受け取ります。 ユーザーオブジェクトを作成するときに、新しいオブジェクトにコピーされる既存のオブジェクトを指定することもできます。
IDsAdminCreateObj オブジェクトが初期化されると、クライアントはIDsAdminCreateObj::CreateModalを呼び出して、オブジェクト作成ウィザードを表示します。
ほとんどのクラス識別子とインターフェイス識別子とは異なり、CLSID_DsAdminCreateObjとIID_ADsAdminCreateObj はライブラリファイルで定義されていません。 つまり、アプリケーション内でこれらの識別子のストレージを定義する必要があります。 これを行うには、dsadmin.hを含める直前にinitguid.hファイルを含める必要があります。 initguid.hファイルは、アプリケーションに1回だけ含める必要があります。 これらのファイルを含める方法を次のコード例に示します。
#include <initguid.h>
#include <dsadmin.h>
次のコード例は、IDsAdminCreateObjインターフェイスを作成し、ユーザーオブジェクトのオブジェクト作成ウィザードを開始するために使用する方法を示しています。
// Add activeds.lib to your project
// Add adsiid.lib to your project
#include "stdafx.h"
#include <atlbase.h>
#include <atlstr.h>
#include "activeds.h"
#include <initguid.h> // Only include this in one source file
#include <dsadmin.h>
// GetUserContainer() function binds to the user container
IADsContainer* GetUserContainer(void)
{
IADsContainer *pUsers = NULL;
HRESULT hr;
IADs *pRoot;
// Bind to the rootDSE.
hr = ADsGetObject(L"LDAP://rootDSE", IID_IADs, (LPVOID*)&pRoot);
if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
CComBSTR sbstr(L"defaultNamingContext");
// Get the default naming context (domain) DN.
hr = pRoot->Get(sbstr, &var);
if(SUCCEEDED(hr) && (VT_BSTR == var.vt))
{
CStringW sstr(L"LDAP://CN=Users,");
sstr += var.bstrVal;
// Bind to the User container.
hr = ADsGetObject(sstr, IID_IADsContainer, (LPVOID*)&pUsers);
VariantClear(&var);
}
}
return pUsers;
}
// The LaunchNewUserWizard() function launches the user wizard.
HRESULT LaunchNewUserWizard(IADs** ppAdsOut)
{
if(NULL == ppAdsOut)
{
return E_INVALIDARG;
}
HRESULT hr;
IDsAdminCreateObj* pCreateObj = NULL;
hr = ::CoCreateInstance(CLSID_DsAdminCreateObj,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDsAdminCreateObj,
(void**)&pCreateObj);
if(SUCCEEDED(hr))
{
IADsContainer *pContainer;
pContainer = GetUserContainer();
if(pContainer)
{
hr = pCreateObj->Initialize(pContainer, NULL, L"user");
if(SUCCEEDED(hr))
{
HWND hwndParent;
hwndParent = GetDesktopWindow();
hr = pCreateObj->CreateModal(hwndParent, ppAdsOut);
}
pContainer->Release();
}
pCreateObj->Release();
}
return hr;
}
// Entry point to the application
int main(void)
{
HRESULT hr;
IADs *pAds = NULL;
CoInitialize(NULL);
hr = LaunchNewUserWizard(&pAds);
if((S_OK == hr) && (NULL != pAds))
{
pAds->Release();
}
CoUninitialize();
return 0;
}