從您的應用程式叫用建立精靈
應用程式或元件可以使用 Active Directory 系統管理 MMC 嵌入式管理單元所使用的相同目錄服務物件建立精靈。這是使用標識碼完成的 管理員 CreateObj 介面。
使用標識碼 管理員 CreateObj 介面
應用程式或元件 (client) 會使用 CLSID_Ds管理員 CreateObj 類別標識符呼叫 CoCreateInstance,以建立標識碼 管理員 CreateObj 介面的實例。 呼叫 CoCreateInstance 之前,必須先呼叫 CoInitialize 來初始化 COM。
客戶端接著會呼叫標識碼 管理員 CreateObj::Initialize 來初始化標識碼 管理員 CreateObj 物件。 標識符 管理員 CreateObj::Initialize 接受 IADsContainer 介面指標,代表應該建立物件的容器,以及要建立之對象的類別名稱。 建立用戶物件時,也可以指定將複製到新對象的現有物件。
當標識子 管理員 CreateObj 物件初始化時,用戶端會呼叫標識碼 管理員 CreateObj::CreateModal 以顯示物件建立精靈。
與大多數類別和介面標識碼不同,CLSID_Ds管理員 CreateObj 和 IID_ADs管理員 CreateObj 不會在連結庫檔案中定義。 這表示您必須為應用程式內的這些識別碼定義記憶體。 若要這樣做,您必須在包含 dsadmin.h 之前立即包含 initguid.h 檔案。 initguid.h 檔案只能在應用程式中包含一次。 下列程式代碼範例示範如何包含這些檔案。
#include <initguid.h>
#include <dsadmin.h>
下列程式代碼範例示範如何建立標識碼 管理員 CreateObj 介面,並用來啟動使用者對象的物件建立精靈。
// 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;
}