我是一名自学成才的 Active Directory 网络管理员,负责管理约 30 台 PC 上的 Windows 登录。我从其他人那里继承了该系统,而他也没有接受过任何直接的 Microsoft 培训,因此我对一些事情一无所知。
网络本身只有一台 Windows Server 2008 R2 机器充当域控制器、DNS、文件共享等。登录工作正常,但我在禁用旧帐户的同时查看用户列表,发现一些我不太明白的东西。
以下是几个示例用户帐户:
登录名:约翰
名:约翰
姓:史密斯
显示名称:约翰·史密斯
对象的规范名称:domain.com/用户/john登录名:鲍勃
名:鲍勃
姓:法语
显示名称:鲍勃·弗伦奇
对象的规范名称:domain.com/Users/Bob French
当前域控制器是从另一个运行 Windows Server 2003 的域控制器换来的。第一个示例帐户是在 Server 2003 框作为 DC 时创建的,第二个是在较新的 Server 2008 R2 框作为 DC 时创建的。为什么规范名称不同,这有什么区别吗?
最让我恼火的是,活动目录浏览器中的用户列表中,一半账户名为“firstname”,另一半账户名为“firstname lastname”。
我可以做些什么让它们全部相同而不破坏有效帐户吗?
答案1
Active Directory 实际上并不关心用户帐户对象的 RDN(规范名称的最后一部分)如何与其他属性(例如显示名称或登录名)相关 - 只要每个单独属性的值不违反架构定义即可。
Active Directory 用户和计算机中的“新用户”表单的行为(以及许多其他对话框)在 Windows Server 2003 和 Windows Server 2008 R2 之间发生了很大变化 - 这可能是它们不一致的原因
您可以使用 PowerShell 移动非系统帐户,然后浏览用户并将其重命名为其显示名称:
# Create new OU named RegularUsers
New-ADOrganizationalUnit -Name RegularUsers -Path "dc=domain,dc=com"
# Retrieve all users that are not critical system objects
$users = Get-ADUser -SearchBase "CN=Users,DC=domain,DC=com" -SearchScope OneLevel -Filter {-not(isCriticalSystemObject -like '*')}
# Go through each and move to the new OU
foreach($user in $users){
Move-ADObject $user -TargetPath "OU=RegularUsers,DC=domain,DC=com"
}
# Retrieve all users in the new OU
$movedUsers = Get-ADUser -SearchBase "CN=Users,DC=domain,DC=com" -SearchScope OneLevel -Filter '*'
foreach($user in $movedUsers){
# Test if Display Name and object Name is the same, if not - rename
if($user.DisplayName -ne $user.Name)
{
Rename-ADObject $user -NewName "$($user.DisplayName)"
}
}
对于第一步,您也可以突出显示 ADUC 中的所有用户帐户,然后将其拖放到另一个位置。
答案2
对象的 CN/DN 并不那么重要,因为它仅供 AD 内部使用,并用于 LDAP 查询;最终用户(和管理员)很少看到它。当您移动对象时,它实际上会自行更改,因为它包含对象的完整 LDAP 路径。
如果你想标准化它,这可以做到,没有任何副作用;用户真正关心的只是他们的登录名,只要你不改变那,他们将继续照常登录。
要更改它,您可以使用 ADUC 控制台或 PowerShell 命令重命名-ADObject。
答案3
这移动命令应该能够为您更改规范名称。我在测试环境中这样做过,但从未在实际环境中这样做过,因此我建议谨慎行事。
此外,半相关的是,我建议实施另一个域控制器,以避免唯一的 DC 出现故障时出现麻烦。