次の方法で共有


アプリケーションからの作成ウィザードの呼び出し

アプリケーションまたはコンポーネントは、Active Directory 管理 MMC スナップインで使用されるのと同じディレクトリ サービス オブジェクト作成ウィザードを使用できます。これは、IDsAdminCreateObj インターフェイスを使用して実現されます。

IDsAdminCreateObj インターフェイスの使用

アプリケーションまたはコンポーネント (クライアント) は、CLSID_DsAdminCreateObj クラス識別子を使用して CoCreateInstance呼び出すことによって、IDsAdminCreateObj インターフェイスのインスタンスを作成します。 CoCreateInstance を呼び出す前に、CoInitialize 呼び出して COM を初期化する必要があります。

その後、クライアント IDsAdminCreateObj::Initialize を呼び出して、IDsAdminCreateObj オブジェクトを初期化します。 IDsAdminCreateObj::Initialize は、オブジェクトを作成するコンテナーと作成するオブジェクトのクラス名を表す IADsContainer インターフェイス ポインターを受け取ります。 ユーザー オブジェクトを作成するときに、新しいオブジェクトにコピーする既存のオブジェクトを指定することもできます。

IDsAdminCreateObj オブジェクトが初期化されると、クライアントは IDsAdminCreateObj::CreateModal を呼び出して、オブジェクト作成ウィザードを表示します。

ほとんどのクラス識別子とインターフェイス識別子とは異なり、CLSID_DsAdminCreateObjIID_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;
}