广告位 · 页头(后台-模块管理-新建模块后替换此区域)

AD域中计算机账户与用户账户如何管理?

在Active Directory(AD)域中,账户是最基础的安全对象。日常登录使用的用户账户大家都很熟悉,但计算机账户的存在感却低得多。实际上,一台计算机要想以域成员身份参与Kerberos认证、接收组策略下发,靠的正是它在域控制器中注册的计算机账户。理解计算机账户与用户账户的设计差异、生命周期和管理方式,是做好域运维的基本功,也是排查登录故障、脱域问题的关键前提。

AD域中计算机账户与用户账户如何管理?

一、先分清:计算机账户与用户账户的本质区别

无论是用户账户还是计算机账户,本质上都是存储在域控制器NTDS.dit数据库中的安全主体,都拥有唯一的SID、都可以被加入安全组、都可以被授予资源访问权限。但两者从创建那一刻起就走上了不同的道路。计算机账户的sAMAccountName固定以美元符号$结尾,例如一台名为PC-FINANCE-01的计算机,其账户名实际是PC-FINANCE-01$,这个后缀就是为了在命名空间上与用户账户区分开,避免重名冲突。

两者的密码机制差异更值得注意。用户账户的密码由用户自己设置,长度、复杂度、有效期都受域密码策略约束;计算机账户的密码则是在加域时由操作系统随机生成的一串超长字符,默认每30天由计算机主动向域控制器发起更换,整个过程对用户完全透明。这串密码的本地副本保存在注册表HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC键值中,同时以密文形式同步到域控制器。当两边的密码对不上时,安全通道就会断裂,机器随之脱域,这也是大量脱域故障的根源。

从认证角度看,用户账户代表的是人,计算机账户代表的是机器本身。Kerberos协议中,客户端访问远程主机上的服务时,需要拿到以host/计算机名形式标识的服务票据,这张票据的加密密钥正是计算机账户的密码。也就是说,没有计算机账户,基于主机的服务认证(比如SMB文件共享、远程管理)根本无法完成。另外,计算机账户不允许交互式登录,系统内部的SYSTEM身份在访问域资源时,就是借用本机计算机账户的凭据完成的。

对比项用户账户计算机账户
账户名特征zhangweiPC-FINANCE-01$,固定以$结尾
密码来源用户自行设置加域时系统随机生成
密码更换受域密码策略约束默认每30天自动更换
主要用途人员身份认证机器身份与主机服务认证
交互式登录允许不允许

二、计算机账户的生命周期:从加域到退役

加域的过程比表面看到的复杂一些。在图形界面输入域名并提交管理员凭据后,客户端会通过LDAP协议在域控制器的默认容器CN=Computers中创建计算机对象(也可以预先在指定OU中手动建好),随后生成一个随机密码写入该对象,并与DC建立Netlogon安全通道。整个流程走完,这台机器才算真正拥有了域内身份。值得一提的是,域属性ms-DS-MachineAccountQuota默认值为10,意味着普通域用户也有权限把最多10台计算机加入域,这个值在安全要求较高的环境里建议改为0,把加域操作收敛到管理员或专门委派的账号手中。

计算机账户的密码轮换由Netlogon服务负责,默认30天一次,相关开关位于注册表HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters路径下,其中DisablePasswordChange设为1可以禁止自动换密码,MaximumPasswordAge用于调整轮换周期。需要提醒的是,随意禁用密码轮换会降低安全性,除非是为了配合某些不支持机器密码刷新的镜像或快照方案,否则不建议改动。

对于批量部署场景,离线加域是个好选择。djoin命令可以在机器尚未联网进入域环境前,先把计算机账户预创建好并生成一个配置文件,装机时直接导入即可完成加域,省去了在部署过程中输入域管理员密码的环节:

# 在域内机器上执行,预置计算机账户并生成离线加域文件
djoin /provision /domain corp.contoso.com /machine PC-NEW-01 /machineou "OU=Sales,DC=corp,DC=contoso,DC=com" /savefile C:\scripts\pc-new-01.txt
# 在待加域的裸机上执行,导入配置完成离线加域
djoin /requestODJ /loadfile C:\scripts\pc-new-01.txt /windowspath C:\Windows /localos

退役环节同样有讲究。机器报废或重装系统前,应当先在AD中禁用对应计算机账户,观察一段时间确认无业务依赖后再删除。直接删除的做法风险在于:一旦该SID被引用在某些资源的ACL里,后续重建同名账户也不会恢复原有权限,因为SID变了。

三、用户账户的日常管理要点

用户账户管理要抓住两条主线:身份属性和生命周期。身份属性方面,sAMAccountName是旧格式登录名(域名\用户名)所用的名称,UPN(用户主体名称)则是形如zhangwei@corp.contoso.com的现代登录名,两者都要保证全局唯一。创建用户时建议同步填写部门、职位、直属上级等扩展属性,这些信息不仅是全局通讯录的来源,后续做基于属性的动态组、访问审计时也全靠它们。

密码与锁定策略决定了账户的安全基线。默认域策略中的密码策略作用于全域,如果不同部门需要差异化强度,可以借助细粒度密码策略(PSO)针对特定组单独设置,比如给管理员组配置更短的密码有效期和更低的锁定阈值。账户锁定策略要平衡安全与可用性,锁定阈值过低容易被撞库攻击者故意锁死,配合4740事件的审计可以快速定位锁定来源。

生命周期管理上,入职、转岗、离职三个节点要有明确的操作规范。离职处理尤其推荐先禁用而非删除:禁用账户保留了SID和所有历史关联,万一有遗留权限需要追查或恢复,成本远低于重建。长期不登录的账户则应定期清理,避免成为攻击者眼中的隐形入口。

四、用PowerShell完成批量账户管理

图形工具Active Directory用户和计算机(dsa.msc)适合零散操作,一旦涉及批量场景,PowerShell的效率优势就体现出来了。先安装RSAT中的Active Directory模块,然后就可以用一条命令创建用户:

# 创建单个域用户,首次登录强制改密
New-ADUser -Name "张伟" -GivenName "Wei" -Surname "Zhang" `
    -SamAccountName "zhangwei" `
    -UserPrincipalName "zhangwei@corp.contoso.com" `
    -Path "OU=Employees,DC=corp,DC=contoso,DC=com" `
    -AccountPassword (Read-Host -AsSecureString "输入初始密码") `
    -Enabled $true -ChangePasswordAtLogon $true

批量导入时把数据整理成CSV,配合循环语句即可完成。下面这段脚本从C:\scripts\new_users.csv读取名单,逐行创建账户,适合新项目组集中入职的场景:

# CSV列:Name,Sam,OU,Password
Import-Csv -Path C:\scripts\new_users.csv -Encoding UTF8 | ForEach-Object {
    New-ADUser -Name $_.Name -SamAccountName $_.Sam -Path $_.OU `
        -AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -Force) `
        -Enabled $true -ChangePasswordAtLogon $true
}

计算机账户同样支持预创建。提前在目标OU里建好账户,客户端加域时会直接复用同名对象,这样机器一入域就落在正确的OU里,组策略即刻生效,省去了事后搬移对象的麻烦:

# 预创建计算机账户到指定OU
New-ADComputer -Name "PC-FINANCE-01" `
    -Path "OU=Finance,DC=corp,DC=contoso,DC=com" `
    -Description "财务部台式机" -Enabled $true

清理僵尸账户是域健康度维护的常规动作。Search-ADAccount能按未登录时长筛选出闲置的计算机账户,结合LastLogonDate字段人工确认后批量禁用,比在图形界面里一台台翻查高效得多:

# 查找超过90天未登录的计算机账户并导出清单
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -ComputersOnly |
    Select-Object Name, LastLogonDate, Enabled, DistinguishedName |
    Export-Csv -Path C:\scripts\stale_computers.csv -Encoding UTF8
# 确认无误后批量禁用
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -ComputersOnly |
    Disable-ADAccount

五、常见故障排查:脱域与账户锁定

客户端提示信任关系失败、无法登录域,是最典型的脱域症状,本质是本机保存的机器密码与域控制器记录不一致。常见诱因包括系统还原到旧快照、计算机对象被误删、长时间离线错过多次密码轮换等。排查时先用Test-ComputerSecureChannel验证安全通道状态,返回False即确认断裂,加-Repair参数可以直接尝试修复:

# 检查安全通道
Test-ComputerSecureChannel -Verbose
# 修复安全通道,需要提供域管理员凭据
Test-ComputerSecureChannel -Repair -Credential (Get-Credential corp\administrator)
# 也可以用Reset-ComputerMachinePassword直接重置机器密码
Reset-ComputerMachinePassword -Server DC01.corp.contoso.com `
    -Credential (Get-Credential corp\administrator)

如果PowerShell模块不可用,传统的netdom命令同样能解决问题,在故障机上以本地管理员身份运行,效果与重置机器密码等同:

netdom resetpwd /Server:DC01 /UserD:corp\administrator /PasswordD:*

用户账户反复锁定则是另一类高频问题。排查思路是先在域控制器上查安全日志中的4740事件,它记录了锁定发生的时间和来源主机名,顺着来源主机往往能找到真正的元凶,常见的有保存了旧密码的映射驱动器、移动设备上的邮箱客户端、浏览器缓存的旧凭据、计划任务里写死的过期密码等。定位到来源后清掉旧凭据,锁定自然停止:

# 在域控制器上查询最近的账户锁定事件
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 20 |
    Select-Object TimeCreated,
        @{n='被锁账户';e={$_.Properties[0].Value}},
        @{n='来源主机';e={$_.Properties[1].Value}}

最后补充一个容易忽略的细节:修改计算机名之后一定要重启让加域状态生效,重命名操作会同步更新域中的计算机对象,但安全通道要等Netlogon服务重新初始化后才恢复正常。日常运维中把计算机账户当作和用户账户同等重要的资产来对待,建立定期巡检和清理机制,域环境的稳定性和安全性都会有明显提升。

广告位 · 文章底部(后台-模块管理替换此区域)