Compartir a través de


Método IADsContainer::MoveHere (iads.h)

El método IADsContainer::MoveHere mueve un objeto especificado al contenedor que implementa esta interfaz. El método se puede usar para cambiar el nombre de un objeto.

Sintaxis

HRESULT MoveHere(
  [in]  BSTR      SourceName,
  [in]  BSTR      NewName,
  [out] IDispatch **ppObject
);

Parámetros

[in] SourceName

Cadena Unicode terminada en null que especifica el ADsPath del objeto que se va a mover.

[in] NewName

Cadena Unicode terminada en null que especifica el nombre relativo del nuevo objeto dentro del contenedor. Puede ser NULL, en cuyo caso se mueve el objeto. Si no es NULL, se cambia el nombre del objeto en consecuencia en el proceso.

[out] ppObject

Puntero a un puntero a la interfaz IDispatch del objeto movido.

Valor devuelto

Este método admite valores devueltos estándar, incluidos S_OK, para una operación correcta. Para obtener más información sobre los códigos de error, consulta Códigos de error adsi.

Comentarios

En Active Directory, puede mover un objeto dentro del mismo dominio o desde dominios diferentes en el mismo bosque de directorios. Para el traslado entre dominios, se aplican las restricciones siguientes:

  • El dominio de destino debe estar en modo nativo.
  • Los objetos que se van a mover deben ser un objeto hoja o un contenedor vacío.
  • NT LAN Manager (NTLM) no puede realizar la autenticación; use la autenticación o delegación de Kerberos. Tenga en cuenta que si no se usa la autenticación Kerberos, la contraseña se transmite en texto no cifrado a través de la red. Para evitar esto, use la delegación con autenticación segura.
  • No puede mover entidades de seguridad (por ejemplo, usuario, grupo, equipo, etc.) que pertenecen a un grupo global. Cuando se mueve una entidad de seguridad, se crea un nuevo SID para el objeto en el destino. Sin embargo, su ANTIGUO SID del origen, almacenado en el atributo sIDHistory , se conserva, así como la contraseña del objeto.
Nota Use la utilidad Movetree.exe para mover un subárbol entre distintos dominios. Para mover objetos de un dominio de origen a un dominio de destino mediante la herramienta de línea de comandos Movetree, debe conectarse al controlador de dominio que contiene el rol maestro rid del dominio de origen. Si el maestro rid no está disponible, los objetos no se pueden mover a otros dominios. Si intenta mover un objeto de un dominio a otro mediante la herramienta Movetree.exe y especifica un controlador de dominio de origen que no es el maestro rid, se produce un mensaje de error "Error de movetree" no específico.
 
Nota Al usar la función ADsOpenObject para enlazar a un objeto ADSI, debe usar la marca ADS_USE_DELEGATION del ADS_AUTHENTICATION_ENUM en el parámetro dwReserved de esta función para crear movimientos entre dominios con IADsContainer::MoveHere. La función ADsOpenObject es equivalente al método IADsOpenDSObject::OpenDsObject . Del mismo modo, el uso del método OpenDsObject para enlazar a un objeto ADSI, el parámetro InReserved de este método debe contener la marca ADS_USE_DELEGATION del ADS_AUTHENTICATION_ENUM con el fin de realizar movimientos entre dominios con IADsContainer::MoveHere.
 
En el ejemplo de código siguiente se mueve el usuario, "jeffsmith" del dominio "South.Fabrikam.Com" al dominio "North.Fabrikam.Com". En primer lugar, obtiene un puntero IADsContainer al contenedor de destino y, a continuación, la llamada a MoveHere especifica la ruta de acceso del objeto que se va a mover.
Set ou = GetObject("LDAP://server1/OU=Support,DC=North,DC=Fabrikam,DC=COM")
ou.MoveHere("LDAP://server2/CN=jeffsmith,OU=Sales,DC=South,DC=Fabrikam,DC=Com", vbNullString)

Se puede usar un ADsPath sin servidor para el origen o el destino o ambos.

El método IADsContainer::MoveHere se puede usar para cambiar el nombre de un objeto dentro del mismo contenedor o para mover un objeto entre contenedores diferentes. Al mover un objeto se conserva el RDN de objeto, mientras que al cambiar el nombre de un objeto se modifica el RDN.

Por ejemplo, en el ejemplo de código siguiente se realiza la acción cambiar nombre.

set cont = GetObject("LDAP://dc=dom,dc=com")
set newobj = cont.MoveHere("LDAP://cn=Jeff Smith,dc=dom,dc=com", "cn=Denise Smith")

En el ejemplo de código siguiente se realiza el traslado.

set cont = GetObject("LDAP://dc=dom,dc=com")
set newobj = cont.MoveHere("LDAP://cn=jeffsmith,ou=sales,dc=dom,dc=com", "cn=jeffsmith")

En las aplicaciones de Visual Basic, puede pasar vbNullString como segundo parámetro al mover un objeto de un contenedor a otro.

Set newobj =  cont.MoveHere("LDAP://cn=jeffsmith,ou=sale,dc=dom,dc=com", vbNullString)

Sin embargo, no puede hacer lo mismo con VBScript. Esto se debe a que VBScript asigna vbNullString a una cadena vacía en lugar de a una cadena nula, como hace Visual Basic. Debe usar el RDN explícitamente, como se muestra en el ejemplo anterior.

Nota El proveedor winNT admite IADsContainer::MoveHere, pero solo para cambiar el nombre de los usuarios & grupos dentro de un dominio.
 

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar este método para cambiar el nombre de un objeto.

Dim cont As IADsContainer
Dim usr As IADsUser

On Error GoTo Cleanup
' Rename an object.
Set cont = GetObject("LDAP://OU=Sales, DC=Fabrikam,DC=com")
Set usr = cont.MoveHere("LDAP://CN=jeffsmith,OU=Sales, DC=Fabrikam,DC=com", "CN=jayhenningsen")
 
' Move an object.
cont.MoveHere("LDAP://CN=denisesmith,OU=Engineer,DC=Fabrikam,DC=com", vbNullString)

Cleanup:
    If (Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If
    Set cont = Nothing
    Set usr = Nothing

En el ejemplo de código siguiente se mueve un objeto de usuario mediante el método IADsContainer::MoveHere .

/////////////////////////////////////////////
// First, bind to the destination container.
////////////////////////////////////////////
HRESULT hr;
IADsContainer *pCont=NULL;
CoInitialize(NULL);
hr = ADsGetObject(
        L"LDAP://OU=MCS,DC=windows2000,DC=mytest,DC=fabrikam,DC=com",
        IID_IADsContainer,
        (void**) &pCont );
 
if ( !SUCCEEDED(hr) )
{
    goto Cleanup;
}
 
//////////////////////////////////////////////////
// Second, move the object to the bound container.
//////////////////////////////////////////////////
IDispatch *pDisp=NULL;
 
hr = pCont->MoveHere(CComBSTR("LDAP://CN=Jeff Smith,OU=DSys,DC=windows2000,DC=mytest,DC=fabrikam,DC=com"), NULL, &pDisp );
pCont->Release();
 
if (SUCCEEDED(hr) )
{ 
// You can perform another operation here, such as updating attributes.
pDisp->Release();
}

Cleanup:
    if(pCont)
        pCont->Release(); 

    if(pDisp)
        pDisp->Release();

    CoUninitialize();

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista
Servidor mínimo compatible Windows Server 2008
Plataforma de destino Windows
Encabezado iads.h
Archivo DLL Activeds.dll

Consulte también

Códigos de error adsi

ADS_AUTHENTICATION_ENUM

ADsOpenObject

IADsContainer

IADsContainer::CopyHere

IADsOpenDSObject::OpenDsObject

IDispatch