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

O método IADsContainer::MoveHere move um objeto especificado para o contêiner que implementa essa interface. O método pode ser usado para renomear um objeto .

Sintaxe

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

Parâmetros

[in] SourceName

A cadeia de caracteres Unicode terminada em nulo que especifica o ADsPath do objeto a ser movido.

[in] NewName

A cadeia de caracteres Unicode terminada em nulo que especifica o nome relativo do novo objeto dentro do contêiner. Isso pode ser NULL, caso em que o objeto é movido. Se não for NULL, o objeto será renomeado adequadamente no processo.

[out] ppObject

Ponteiro para um ponteiro para a interface IDispatch no objeto movido.

Retornar valor

Esse método dá suporte a valores retornados padrão, incluindo S_OK, para uma operação bem-sucedida. Para obter mais informações sobre códigos de erro, consulte Códigos de erro ADSI.

Comentários

No Active Directory, você pode mover um objeto dentro do mesmo domínio ou de domínios diferentes na mesma floresta de diretório. Para a movimentação entre domínios, as seguintes restrições se aplicam:

  • O domínio de destino deve estar no modo nativo.
  • Os objetos a serem movidos devem ser um objeto folha ou um contêiner vazio.
  • O NTLM (NT LAN Manager) não pode executar a autenticação; use a autenticação ou delegação Kerberos. Lembre-se de que, se a autenticação Kerberos não for usada, a senha será transmitida em texto não criptografado pela rede. Para evitar isso, use a delegação com autenticação segura.
  • Você não pode mover entidades de segurança (por exemplo, usuário, grupo, computador e assim por diante) pertencentes a um grupo global. Quando uma entidade de segurança é movida, um novo SID é criado para o objeto no destino. No entanto, seu SID antigo da origem, armazenado no atributo sIDHistory , é preservado, bem como a senha do objeto.
Nota Use o utilitário Movetree.exe para mover uma subárvore entre domínios diferentes. Para mover objetos de um domínio de origem para um domínio de destino usando a ferramenta de linha de comando Movetree, você deve se conectar ao controlador de domínio que contém a função RID master do domínio de origem. Se o master RID não estiver disponível, os objetos não poderão ser movidos para outros domínios. Se você tentar mover um objeto de um domínio para outro usando a ferramenta Movetree.exe e especificar um controlador de domínio de origem que não seja o master RID, uma mensagem de erro não específica "Falha de movetree".
 
Nota Ao usar a função ADsOpenObject para associar a um objeto ADSI, você deve usar o sinalizador ADS_USE_DELEGATION do ADS_AUTHENTICATION_ENUM no parâmetro dwReserved dessa função para criar movimentações entre domínios com IADsContainer::MoveHere. A função ADsOpenObject é equivalente ao método IADsOpenDSObject::OpenDsObject . Da mesma forma, usando o método OpenDsObject para associar a um objeto ADSI, o parâmetro InReserved desse método deve conter o sinalizador ADS_USE_DELEGATION do ADS_AUTHENTICATION_ENUM para fazer movimentos entre domínios com IADsContainer::MoveHere.
 
O exemplo de código a seguir move o usuário , "jeffsmith" do domínio "South.Fabrikam.Com" para o domínio "North.Fabrikam.Com". Primeiro, ele obtém um ponteiro IADsContainer para o contêiner de destino e, em seguida, a chamada MoveHere especifica o caminho do objeto a ser movido.
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)

Um ADsPath sem servidor pode ser usado para a origem ou o destino ou ambos.

O método IADsContainer::MoveHere pode ser usado para renomear um objeto dentro do mesmo contêiner ou para mover um objeto entre contêineres diferentes. Mover um objeto retém o RDN do objeto, enquanto renomear um objeto altera o RDN.

Por exemplo, o exemplo de código a seguir executa a ação renomear.

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

O exemplo de código a seguir executa a movimentação.

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

Em aplicativos do Visual Basic, você pode passar vbNullString como o segundo parâmetro ao mover um objeto de um contêiner para outro.

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

No entanto, você não pode fazer o mesmo com o VBScript. Isso ocorre porque o VBScript mapeia vbNullString para uma cadeia de caracteres vazia em vez de para uma cadeia de caracteres nula, assim como o Visual Basic. Você deve usar o RDN explicitamente, conforme mostrado no exemplo anterior.

Nota O provedor WinNT dá suporte a IADsContainer::MoveHere, mas somente para renomear usuários & grupos em um domínio.
 

Exemplos

O exemplo de código a seguir mostra como usar esse método para renomear um 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

O exemplo de código a seguir move um objeto de usuário usando o 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 Valor
Cliente mínimo com suporte Windows Vista
Servidor mínimo com suporte Windows Server 2008
Plataforma de Destino Windows
Cabeçalho iads.h
DLL Activeds.dll

Confira também

Códigos de erro ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

IADsContainer

IADsContainer::CopyHere

IADsOpenDSObject::OpenDsObject

IDispatch