Invocar asistentes para la creación desde la aplicación
Una aplicación o componente puede usar los mismos asistentes para la creación de objetos de servicio de directorio usados por los complementos MMC administrativos de Active Directory. Esto se logra con la interfaz IDsAdminCreateObj .
Usar la interfaz IDsAdminCreateObj
Una aplicación o componente (cliente) crea una instancia de la interfaz IDsAdminCreateObj llamando a CoCreateInstance con el identificador de clase CLSID_DsAdminCreateObj . COM debe inicializarse llamando a CoInitialize antes de llamar a CoCreateInstance .
A continuación, el cliente llama a IDsAdminCreateObj::Initialize para inicializar el objeto IDsAdminCreateObj . IDsAdminCreateObj::Initialize acepta un puntero de interfaz IADsContainer que representa el contenedor en el que se debe crear el objeto y el nombre de clase del objeto en el que se va a crear. Al crear objetos de usuario, también es posible especificar un objeto existente que se copiará en el nuevo objeto.
Cuando se ha inicializado el objeto IDsAdminCreateObj , el cliente llama a IDsAdminCreateObj::CreateModal para mostrar el asistente para la creación de objetos.
A diferencia de la mayoría de los identificadores de clase e interfaz, CLSID_DsAdminCreateObj y IID_ADsAdminCreateObj no se definen en un archivo de biblioteca. Esto significa que debe definir el almacenamiento para estos identificadores dentro de la aplicación. Para ello, debe incluir el archivo initguid.h inmediatamente antes de incluir dsadmin.h. El archivo initguid.h solo debe incluirse una vez en una aplicación. En el ejemplo de código siguiente se muestra cómo incluir estos archivos.
#include <initguid.h>
#include <dsadmin.h>
En el ejemplo de código siguiente se muestra cómo se puede crear la interfaz IDsAdminCreateObj y usarse para iniciar el Asistente para la creación de objetos para un objeto de usuario.
// 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;
}