Метод IADsContainer::MoveHere (iads.h)

Метод IADsContainer::MoveHere перемещает указанный объект в контейнер, реализующий этот интерфейс. Метод можно использовать для переименования объекта .

Синтаксис

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

Параметры

[in] SourceName

Строка Юникода, завершающаяся null, которая указывает ADsPath перемещаемого объекта.

[in] NewName

Строка Юникода, заканчивающаяся null, указывающая относительное имя нового объекта в контейнере. Это значение может иметь значение NULL, и в этом случае объект перемещается. Если значение не равно NULL, объект переименовывается соответствующим образом в процессе.

[out] ppObject

Указатель на указатель на интерфейс IDispatch в перемещенном объекте.

Возвращаемое значение

Этот метод поддерживает стандартные возвращаемые значения, включая S_OK, для успешной операции. Дополнительные сведения о кодах ошибок см. в разделе Коды ошибок ADSI.

Комментарии

В Active Directory можно переместить объект в пределах одного домена или из разных доменов в том же лесу каталогов. При перемещении между доменами действуют следующие ограничения.

  • Целевой домен должен находиться в собственном режиме.
  • Перемещаемый объект должен быть конечным объектом или пустым контейнером.
  • NT LAN Manager (NTLM) не может выполнить проверку подлинности; использовать проверку подлинности kerberos или делегирование. Имейте в виду, что если проверка подлинности Kerberos не используется, пароль передается по сети в виде открытого текста. Чтобы избежать этого, используйте делегирование с безопасной проверкой подлинности.
  • Невозможно переместить субъекты безопасности (например, пользователя, группу, компьютер и т. д.), принадлежащие глобальной группе. При перемещении субъекта безопасности создается новый идентификатор безопасности для объекта в месте назначения. Однако его старый идентификатор безопасности из источника, хранящийся в атрибуте sIDHistory , сохраняется, а также пароль объекта .
Примечание Используйте служебную программу Movetree.exe для перемещения поддеревья между различными доменами. Чтобы переместить объекты из исходного домена в целевой с помощью программы командной строки Movetree, необходимо подключиться к контроллеру домена, на который находится роль RID исходного домена master. Если master RID недоступен, то объекты нельзя переместить в другие домены. Если вы пытаетесь переместить объект из одного домена в другой с помощью средства Movetree.exe и укажете исходный контроллер домена, который не является master RID, появится сообщение об ошибке "Сбой Movetree".
 
Примечание При использовании функции ADsOpenObject для привязки к объекту ADSI необходимо использовать флаг ADS_USE_DELEGATIONADS_AUTHENTICATION_ENUM в параметре dwReserved этой функции, чтобы создать перемещение между доменами с помощью IADsContainer::MoveHere. Функция ADsOpenObject эквивалентна методу IADsOpenDSObject::OpenDsObject . Аналогичным образом, используя метод OpenDsObject для привязки к объекту ADSI, параметр InReserved этого метода должен содержать флаг ADS_USE_DELEGATIONADS_AUTHENTICATION_ENUM , чтобы выполнять перемещение между доменами с помощью IADsContainer::MoveHere.
 
В следующем примере кода пользователь jeffsmith перемещается из домена South.Fabrikam.Com в домен North.Fabrikam.Com. Сначала он получает указатель IADsContainer на целевой контейнер, затем вызов MoveHere задает путь к перемещаемого объекта.
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)

Бессерверный ADsPath можно использовать как для источника, так и для назначения, либо для обоих.

Метод IADsContainer::MoveHere можно использовать для переименования объекта в одном контейнере или для перемещения объекта между разными контейнерами. При перемещении объекта сохраняется RDN объекта, а переименование объекта изменяет RDN.

Например, в следующем примере кода выполняется действие переименования.

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

В следующем примере кода выполняется перемещение.

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

В приложениях Visual Basic vbNullString можно передать в качестве второго параметра при перемещении объекта из одного контейнера в другой.

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

Однако вы не можете сделать то же самое с VBScript. Это связано с тем, что VBScript сопоставляет vbNullString с пустой строкой, а не со строкой NULL, как и в Visual Basic. Необходимо явно использовать RDN, как показано в предыдущем примере.

Примечание Поставщик WinNT поддерживает IADsContainer::MoveHere, но только для переименования пользователей & групп в домене.
 

Примеры

В следующем примере кода показано, как использовать этот метод для переименования объекта.

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

В следующем примере кода объект пользователя перемещается с помощью метода 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();

Требования

Требование Значение
Минимальная версия клиента Windows Vista
Минимальная версия сервера Windows Server 2008
Целевая платформа Windows
Header iads.h
DLL Activeds.dll

См. также раздел

Коды ошибок ADSI

ADS_AUTHENTICATION_ENUM

ADsOpenObject

IADsContainer

IADsContainer::CopyHere

IADsOpenDSObject::OpenDsObject

IDispatch