IADsContainer ::MoveHere, méthode (iads.h)

La méthode IADsContainer ::MoveHere déplace un objet spécifié vers le conteneur qui implémente cette interface. La méthode peut être utilisée pour renommer un objet.

Syntaxe

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

Paramètres

[in] SourceName

Chaîne Unicode terminée par null qui spécifie l’ADsPath de l’objet à déplacer.

[in] NewName

Chaîne Unicode terminée par null qui spécifie le nom relatif du nouvel objet dans le conteneur. Cela peut être NULL, auquel cas l’objet est déplacé. S’il n’est pas NULL, l’objet est renommé en conséquence dans le processus.

[out] ppObject

Pointeur vers un pointeur vers l’interface IDispatch sur l’objet déplacé.

Valeur retournée

Cette méthode prend en charge les valeurs de retour standard, y compris les S_OK, pour une opération réussie. Pour plus d’informations sur les codes d’erreur, consultez Codes d’erreur ADSI.

Remarques

Dans Active Directory, vous pouvez déplacer un objet dans le même domaine ou à partir de différents domaines dans la même forêt d’annuaires. Pour le déplacement inter-domaines, les restrictions suivantes s’appliquent :

  • Le domaine de destination doit être en mode natif.
  • Les objets à déplacer doivent être un objet feuille ou un conteneur vide.
  • NT LAN Manager (NTLM) ne peut pas effectuer l’authentification ; utiliser l’authentification ou la délégation Kerberos. N’oubliez pas que si l’authentification Kerberos n’est pas utilisée, le mot de passe est transmis en texte clair sur le réseau. Pour éviter cela, utilisez la délégation avec l’authentification sécurisée.
  • Vous ne pouvez pas déplacer les principaux de sécurité (par exemple, utilisateur, groupe, ordinateur, etc.) appartenant à un groupe global. Lorsqu’un principal de sécurité est déplacé, un nouveau SID est créé pour l’objet à destination. Toutefois, son ancien SID de la source, stocké dans l’attribut sIDHistory , est conservé, ainsi que le mot de passe de l’objet.
Note Utilisez l’utilitaire Movetree.exe pour déplacer une sous-arborescence entre différents domaines. Pour déplacer des objets d’un domaine source vers un domaine de destination à l’aide de l’outil en ligne de commande Movetree, vous devez vous connecter au contrôleur de domaine qui détient le rôle RID master du domaine source. Si le master RID n’est pas disponible, les objets ne peuvent pas être déplacés vers d’autres domaines. Si vous tentez de déplacer un objet d’un domaine à un autre à l’aide de l’outil Movetree.exe et que vous spécifiez un contrôleur de domaine source qui n’est pas le master RID, un message d’erreur non spécifique « Movetree failed » s’affiche.
 
Note Lorsque vous utilisez la fonction ADsOpenObject pour établir une liaison à un objet ADSI, vous devez utiliser l’indicateur ADS_USE_DELEGATION du ADS_AUTHENTICATION_ENUM dans le paramètre dwReserved de cette fonction afin de créer des déplacements inter-domaines avec IADsContainer ::MoveHere. La fonction ADsOpenObject est équivalente à la méthode IADsOpenDSObject ::OpenDsObject . De même, en utilisant la méthode OpenDsObject pour établir une liaison à un objet ADSI, le paramètre InReserved de cette méthode doit contenir l’indicateur ADS_USE_DELEGATION du ADS_AUTHENTICATION_ENUM afin d’effectuer des déplacements inter-domaines avec IADsContainer ::MoveHere.
 
L’exemple de code suivant déplace l’utilisateur« jeffsmith » du domaine « South.Fabrikam.Com » vers le domaine « North.Fabrikam.Com ». Tout d’abord, il obtient un pointeur IADsContainer vers le conteneur de destination, puis l’appel MoveHere spécifie le chemin d’accès de l’objet à déplacer.
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)

Un ADsPath serverless peut être utilisé pour la source ou la destination ou les deux.

La méthode IADsContainer ::MoveHere peut être utilisée pour renommer un objet dans le même conteneur ou pour déplacer un objet entre différents conteneurs. Le déplacement d’un objet conserve l’objet RDN, tandis que le changement de nom d’un objet modifie le RDN.

Par exemple, l’exemple de code suivant effectue l’action de renommage.

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

L’exemple de code suivant effectue le déplacement.

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

Dans les applications Visual Basic, vous pouvez passer vbNullString comme deuxième paramètre lors du déplacement d’un objet d’un conteneur à un autre.

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

Toutefois, vous ne pouvez pas faire de même avec VBScript. Cela est dû au fait que VBScript mappe vbNullString à une chaîne vide plutôt qu’à une chaîne null, comme le fait Visual Basic. Vous devez utiliser le RDN explicitement, comme indiqué dans l’exemple précédent.

Note Le fournisseur WinNT prend en charge IADsContainer ::MoveHere, mais uniquement pour renommer les utilisateurs & groupes au sein d’un domaine.
 

Exemples

L’exemple de code suivant montre comment utiliser cette méthode pour renommer un objet.

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

L’exemple de code suivant déplace un objet utilisateur à l’aide de la méthode 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();

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista
Serveur minimal pris en charge Windows Server 2008
Plateforme cible Windows
En-tête iads.h
DLL Activeds.dll

Voir aussi

Codes d’erreur ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

IADsContainer

IADsContainer ::CopyHere

IADsOpenDSObject ::OpenDsObject

IDispatch