IADsContainer::MoveHere 方法 (iads.h)

IADsContainer::MoveHere 方法将指定的对象移动到实现此接口的容器。方法可用于重命名 对象。

语法

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

参数

[in] SourceName

以 null 结尾的 Unicode 字符串,指定要移动的对象的 ADsPath

[in] NewName

以 null 结尾的 Unicode 字符串,指定容器中新对象的相对名称。 这可以是 NULL,在这种情况下,将移动对象。 如果它不是 NULL,则会在进程中相应地重命名对象。

[out] ppObject

指向指向移动对象上 IDispatch 接口的指针的指针。

返回值

此方法支持标准返回值(包括 S_OK)以成功执行操作。 有关错误代码的详细信息,请参阅 ADSI 错误代码

注解

在 Active Directory 中,可以移动同一域中的对象,也可以从同一目录林中的不同域移动对象。 对于跨域移动,以下限制适用:

  • 目标域必须处于本机模式。
  • 要移动的对象必须是叶对象或空容器。
  • NT LAN Manager (NTLM) 无法执行身份验证;使用 Kerberos 身份验证或委派。 请注意,如果未使用 Kerberos 身份验证,则密码通过网络以明文形式传输。 若要避免这种情况,请使用具有安全身份验证的委派。
  • 不能将安全主体 (,例如用户、组、计算机等) 属于全局组。 移动安全主体时,会在目标位置为对象创建新的 SID。 但是,将保留源中的旧 SID(存储在 sIDHistory 属性中)以及 对象的密码。
注意 使用 Movetree.exe 实用工具在不同域之间移动子树。 若要使用 Movetree 命令行工具将对象从源域移动到目标域,必须连接到持有源域的 RID 主机角色的域控制器。 如果 RID 主机不可用,则无法将对象移动到其他域。 如果尝试使用 Movetree.exe 工具将对象从一个域移到另一个域,并且指定了不是 RID 主机的源域控制器,则会出现非特定的“Movetree 失败”错误消息。
 
注意使用 ADsOpenObject 函数绑定到 ADSI 对象时,必须使用此函数的 dwReserved 参数中的 ADS_AUTHENTICATION_ENUMADS_USE_DELEGATION标志,以便使用 IADsContainer::MoveHere 创建跨域移动。 ADsOpenObject 函数等效于 IADsOpenDSObject::OpenDsObject 方法。 同样,使用 OpenDsObject 方法绑定到 ADSI 对象,此方法的 InReserved 参数必须包含ADS_AUTHENTICATION_ENUMADS_USE_DELEGATION 标志,以便使用 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
标头 iads.h
DLL Activeds.dll

另请参阅

ADSI 错误代码

ADS_AUTHENTICATION_ENUM

ADsOpenObject

IADsContainer

IADsContainer::CopyHere

IADsOpenDSObject::OpenDsObject

IDispatch