如果您想使用 PowerShell 将 AD 用户移动到另一个 OU,最简单的方法是通过 Move-ADUser cmdlet。它帮助 IT 管理员根据组织需求(如部门调整)或合规原因(例如应用针对性的组策略或安全控制)将用户移动到不同的 OU。本文涵盖了高效移动单个和多个用户的实用示例,同时保持安全性和责任追踪。
Import-Module ActiveDirectory
Get-ADUser -Identity "username" | Move-ADObject -TargetPath "OU=TargetOU,DC=domain,DC=com"
$users = Get-ADUser -Filter * -SearchBase "OU=SourceOU,DC=contoso,DC=com" | Select-Object -Property DistinguishedName
foreach ($user in $users) {
Move-ADObject -Identity $user.DistinguishedName -TargetPath "OU=DestinationOU,DC=contoso,DC=com"
}
这会将用户帐户移动到同一域内的目标 OU:
Get-ADUser -Identity <sAMAccountName> | Move-ADObject -TargetPath "OU=<TargetOU>,DC=<domain>,DC=<tld>"
这直接使用用户的唯一名称将其从源 OU 移动到目标 OU:
Move-ADObject -Identity "CN=<UserCN>,OU=<SourceOU>,DC=<domain>,DC=<tld>" -TargetPath "OU=<TargetOU>,DC=<domain>,DC=<tld>"
这通过从 CSV 文件导入用户名,将多个用户移动到新的财务 OU:
Import-Csv "C:\UsersList.csv" | ForEach-Object {
Get-ADUser -Identity $_.SamAccountName | Move-ADObject -TargetPath "OU=Finance,DC=domain,DC=com"
}
这会将源 OU 中的所有用户移动到目标 OU:
Get-ADUser -SearchBase "OU=<SourceOU>,DC=<domain>,DC=<tld>" -Filter * | ForEach-Object { Move-ADObject -Identity $_.DistinguishedName -TargetPath "OU=<TargetOU>,DC=<domain>,DC=<tld>" }
这会将用户移动到主 OU 内的嵌套 OU:
Get-ADUser -Identity <sAMAccountName> | Move-ADObject -TargetPath "OU=<ChildOU>,OU=<ParentOU>,DC=<domain>,DC=<tld>"
以下是 Move-ADUser cmdlet 常用的一些参数:
| 参数 | 描述 |
|---|---|
| -Identity | 指定要移动的 AD 对象(用户、计算机、组等);您可以使用对象的唯一名称或全局唯一标识符 (GUID) |
| -TargetPath | 定义对象应移动到的目标 OU 或容器 |
| -Server | 指定用于执行移动操作的域控制器 (DC) 或 AD 域服务实例 |
| -Credential | 使用备用用户凭据运行命令,而不是当前登录帐户的凭据 |
| -Partition | 指定包含要移动对象的 AD 分区(例如,DC=domain,DC=com) |
| -PassThru | 命令运行后返回已移动的对象,便于验证或在后续命令中使用 |
| -Confirm | 在执行移动前提示确认,有助于避免意外更改 |
| -WhatIf | 模拟命令而不进行任何更改,让您事先查看结果 |
解决方案: 这意味着 $user 或 identity 变量为空或未正确获取。确保传递有效的对象或唯一名称。例如,使用 Get-ADUser $username 获取用户,并确认变量包含预期对象后再在 Move-ADUser 中使用。
解决方案: 当目标 OU 不存在、拼写错误或最近被删除时会发生此问题。仔细检查唯一名称,并使用 Get-ADOrganizationalUnit 验证 OU 是否存在。
解决方案: 当当前安全上下文缺少所需权限时会发生此问题,尤其是在跨域移动时。确保您拥有正确权限,考虑指定 -Credential 参数或使用具有足够权限的帐户重新认证。
解决方案: 跨域移动对象时,确保源和目标 DC 都是相对标识符 (RID) 主控。连接到适当的 DC,或在同时持有两个域 RID 主控角色的 DC 上执行移动。使用 netdom query fsmo 验证角色。
解决方案: 域本地组中的用户不能直接跨域移动。先将其从不兼容的组中移除,执行移动后再重新分配组成员身份。
解决方案: 运行命令的账户权限不足。请使用具有必要权限的账户执行 PowerShell:理想情况下为 Domain Admins 或相关 OU 的委派权限。
解决方案: 如果源 OU 和目标 OU 相同,会出现此情况。请在尝试移动前确认源和目标的区分名称不同。
AD Users and Computers (ADUC) 是移动 AD 用户的常用方法。
使用 ADManager Plus,您可以轻松地单独或批量在 OU 之间移动用户账户。
虽然使用 PowerShell 等本地工具将 AD 用户从一个 OU 移动到另一个看似简单,但存在一些限制:
ADManager Plus 通过单一直观的控制台,使 AD 管理更简单、更快捷。以下是它为何是 IT 团队更佳选择的原因:
使用 ADUC
在 ADUC 中移动计算机对象涉及的不仅是单一权限;需要在源 OU 上具有计算机对象的创建权限,在目标 OU 上具有计算机对象的删除权限。但这被视为高度特权访问。
为降低风险,请将这些权限委派给专门的安全组,并定期审查其成员资格:
使用 PowerShell
对源 OU 和目标 OU 运行相同的脚本:
# Replace values
$OU = 'OU=SourceOU,DC=yourdomain,DC=com'
$group = 'YOURDOMAIN\DelegatedGroup'
$groupSID = (New-Object System.Security.Principal.NTAccount($group)).Translate([System.Security.Principal.SecurityIdentifier]).Value
$ComputerObjectGUID = 'bf967a86-0de6-11d0-a285-00aa003049e2'
$rights = [System.DirectoryServices.ActiveDirectoryRights]::CreateChild -bor [System.DirectoryServices.ActiveDirectoryRights]::Delete
$rule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($groupSID, $rights, 'Allow', $ComputerObjectGUID, 'All')
$acl = Get-ACL "AD:\$OU"
$acl.AddAccessRule($rule)
Set-ACL "AD:\$OU" $acl
使用 ADManager Plus
或者,可以使用无脚本工具,如 ADManager Plus,只需几次点击即可完成相同操作:
跨域移动用户需要信任关系和迁移工具(如 AD Migration Tool (ADMT) 或 PowerShell)或点击式界面工具(如 ADManager Plus),因为仅使用 ADUC 无法处理密码、安全标识符(SID)历史记录或域特定属性复制。
使用 ADMT
使用 PowerShell
对于跨域或跨林迁移,可以使用导出和导入的方法。
Get-ADUser -Filter * -Properties * | Export-Csv C:\Temp\Users.csv -NoTypeInformation
Import-Csv C:\Temp\Users.csv | ForEach-Object {
New-ADUser -Name $_.Name -SamAccountName $_.SamAccountName -UserPrincipalName $_.UserPrincipalName -Path $_.OU -GivenName $_.GivenName -Surname $_.Surname -AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -Force) -Enabled $true
}
使用 ADManager Plus
对于无脚本、用户友好的选项: