다음을 통해 공유


애플리케이션에서 만들기 마법사 호출

애플리케이션 또는 구성 요소는 Active Directory 관리 MMC 스냅인에서 사용하는 것과 동일한 디렉터리 서비스 개체 만들기 마법사를 사용할 수 있습니다. 이 작업은 IDsAdminCreateObj 인터페이스를 사용하여 수행됩니다.

IDsAdminCreateObj 인터페이스 사용

애플리케이션 또는 구성 요소(클라이언트)는 CLSID_DsAdminCreateObj 클래스 식별자를 사용하여 CoCreateInstance를 호출하여 IDsAdminCreateObj 인터페이스의 instance 만듭니다. CoCreateInstance가 호출되기 전에 CoInitialize를 호출하여 COM을 초기화해야 합니다.

그런 다음 클라이언트는 IDsAdminCreateObj::Initialize 를 호출하여 IDsAdminCreateObj 개체를 초기화합니다. IDsAdminCreateObj::Initialize 는 개체를 만들어야 하는 컨테이너와 만들 개체의 클래스 이름을 나타내는 IADsContainer 인터페이스 포인터를 허용합니다. 사용자 개체를 만들 때 새 개체에 복사할 기존 개체를 지정할 수도 있습니다.

IDsAdminCreateObj 개체가 초기화되면 클라이언트는 IDsAdminCreateObj::CreateModal을 호출하여 개체 만들기 마법사를 표시합니다.

대부분의 클래스 및 인터페이스 식별자와 달리 CLSID_DsAdminCreateObjIID_ADsAdminCreateObj 라이브러리 파일에 정의되지 않습니다. 즉, 애플리케이션 내에서 이러한 식별자에 대한 스토리지를 정의해야 합니다. 이렇게 하려면 dsadmin.h를 포함하기 직전에 initguid.h 파일을 포함해야 합니다. initguid.h 파일은 애플리케이션에 한 번만 포함되어야 합니다. 다음 코드 예제에서는 이러한 파일을 포함 하는 방법을 보여 있습니다.

#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;
}