1. 开工之前:域名规划与系统准备
AD域这活儿,说难不难,说简单也真不简单。很多新手一上来就装系统、加角色、一颗下一步点到底,结果域建完了,用户也建了,客户端一加域就各种报错,最后还得推倒重来。我前阵子在一套 Windows Server 2016 环境上重新搭了一个域环境,从用户账户创建、域登录,到域组和账户的全生命周期管理,整套流程走了一遍,今天把关键环节和踩过的一些坑记录下来。
开始之前,先花点时间说清楚环境规划和准备。这一步省了,后面全是麻烦。
1.1 硬件与系统版本怎么选
AD域控制器对硬件的要求其实不高,我这次用的是 4 核 CPU、16G 内存的虚拟机,磁盘给了 100G,跑 DNS 和域服务完全够用。如果你们公司规模不大,500 用户以内,一台 2016 标准版的虚机就能撑住。要注意的是,Server 2016 和后面的 2019、2022 在 AD 管理界面上差别不大,但林功能级别一旦定下来,后续升级是单向的,得考虑清楚。
我用的版本是 Windows Server 2016 Standard(桌面体验版),没有用 Server Core。生产环境如果追求稳定和减少攻击面,Core 版本确实更省资源,但如果你像我一样需要频繁用图形界面管理用户和组策略,桌面体验版会顺手很多。总之一句话:自己管得过来就选桌面版,图省心。
1.2 域名规划的两个硬性建议
域名怎么取?这里有个很多人不知道的坑。
我见过不少公司把内部 AD 域名直接取成xxx.com这种外部域名。如果公网域名也在用,内网 DNS 一抢答,外网邮件和网站解析就全乱了。正确做法是用一个子域或者独立的内网域名,比如外部域名是example.com,内部 AD 就用corp.example.com或者干脆叫ad.example.com。我这次用的是corp.example.com这种形式,既方便记忆,又不会和公网解析冲突。
第二个建议是 NetBIOS 名。安装时系统会让你填,默认会截取域名第一段CORP,这就行了,别搞特殊。NetBIOS 名太长会导致老协议不兼容,客户端加域时反而容易报错。
1.3 安装 AD 域服务角色
角色安装本身很常规,在“服务器管理器 - 添加角色和功能”里勾选“Active Directory 域服务”,一路下一步。这里不啰嗦,重点说一下安装完成后的配置。
装完角色只是第一步,服务器还只是个普通成员服务器,必须通过“部署向导”把它提升为域控制器。提升过程中有几步容易踩坑:
- DNS 选项:向导推荐同时安装 DNS 服务。生产环境我一般建议一起装上,域控同时当 DNS 服务器是最标准的做法。
- 林功能级别和域功能级别:2016 环境就选 2016。如果以后可能有 2019 的域控加进来,也可以选 2016,功能上几乎没影响。
- 目录服务还原模式密码(DSRM):这个密码一定要记牢。我见过太多人忘了它,等真正要恢复 AD 数据库的时候才发现进不去目录还原模式。
安装完角色后用 PowerShell 提升域控的命令示例: Install-ADDSForest ` -DomainName "corp.example.com" ` -DomainNetbiosName "CORP" ` -ForestMode "WinThreshold" ` -DomainMode "WinThreshold" ` -InstallDns:$true ` -SafeModeAdministratorPassword (ConvertTo-SecureString "你的强密码" -AsPlainText -Force)提升完会自动重启,重启后这台机器就是域控了。可以先在“Active Directory 用户和计算机”里看到默认的corp.example.com域结构,里面有 Computers、Domain Controllers、Users、Builtin 等容器和 OU,别急着乱动。
2. 用户账户创建:从图形界面到命令行
域建好后,第一件事就是创建用户账户。大部分初学者首选图形界面,这个没毛病。但我建议你尽早把 PowerShell 用起来,尤其是在批量建号、批量改属性的场景下,命令行和 GUI 的差距就是一天和一小时的差距。
2.1 图形界面创建的标准流程
打开“Active Directory 用户和计算机”,展开域名,右键 Users 容器或某个 OU,选择“新建 - 用户”,会弹出创建向导。这里需要填的信息有几个:
姓、名、姓名
用户登录名,这是登录时输入的 UPN 形式,比如
zhangsan@corp.example.com用户登录名(Windows 2000 以前版本),即 SAM 账户名,比如
CORP\zhangsan密码和密码选项
初次创建时密码策略往往还没设置,系统会让管理员手动输入两次密码。密码选项里最常用的是“用户下次登录时须更改密码”。这个选项适合首次创建员工账号时勾选,让员工自己设密码,管理员不用知道员工密码,安全上也说得过去。另一个“密码永不过期”慎用,除非是服务账户,普通用户账号挂这个选项等于给自己埋雷。
创建完成后,用户账户显示为一个带箭头的图标。双击它能设置更多属性,比如部门、电话、地址、所属组、登录时段、允许登录的计算机等。“隶属于”选项卡是控制权限的核心,后面讲组的时候会用到。
2.2 用户创建的核心属性字段
很多管理员的建号习惯是把能填的都填了,不能填的留空。我的经验是,以下这些字段必须填到位:
- 用户登录名:唯一,建议用拼音或英文名,公司有统一规范就按规范走
- 显示名称:格式建议“姓名(部门)”,在 Outlook 全局地址列表里看着清楚
- 电子邮件:如果要配 Exchange 或第三方邮件系统,这个字段必须正确
- 所属 OU:按组织结构放进对应 OU,后面组策略才能按部门差异化下发
- 所属组:先加部门组,再按项目组加项目组
还有一个容易被忽略的点:员工离职后,账户不要直接删除。AD 里删掉的用户对象,SID 不会自动回收,但所有 ACL 里引用这个 SID 的权限会变成孤立条目,而且你没法直接看出原来这个 SID 是谁的。正确做法是禁用账户,移到一个叫“离职员工”的 OU 里,等半年确认没有权限关联后再清理。这个我们后面细说。
2.3 用 PowerShell 批量创建用户
当你需要一次建 50 个账号,还在用“新建 - 用户”一下一下点,那就太落后了。PowerShell 的New-ADUser是批量创建的核心命令,配合 CSV 文件,效率能翻几十倍。
先准备一个 CSV 文件,字段自己定,常见的有name、samAccountName、userPrincipalName、password、department、manager。然后一行命令批量导入:
Import-Csv -Path C:\Users\admin\Desktop\users.csv | ForEach-Object { New-ADUser ` -Name $_.name ` -SamAccountName $_.samAccountName ` -UserPrincipalName "$($_.samAccountName)@corp.example.com" ` -AccountPassword (ConvertTo-SecureString $_.password -AsPlainText -Force) ` -Department $_.department ` -Enabled $true ` -Path "OU=IT部,OU=员工,DC=corp,DC=example,DC=com" ` -ChangePasswordAtLogon $true }这里有个我踩过的坑:CSV 编码。Excel 另存为 CSV 默认是 ANSI 编码,PowerShell 5.1 里Import-Csv默认按 UTF-8 读取,中文部门名全变成乱码。解决办法是保存 CSV 时选“CSV UTF-8 格式”,或者用记事本另存时选 UTF-8。这个细节不注意,部门字段写进 AD 全是“???”,还得一条条改回来。
另外,-ChangePasswordAtLogon $true对应 GUI 里的“用户下次登录时须更改密码”。如果你是导入之后再改密码策略,别漏了这一步,否则员工第一次登录还是用弱初始密码,存在风险。
2.4 初始密码规范与强制策略
初始密码建议统一格式,比如P@ssw0rd-工号或者Abc@入职年月日。目的不是让人长期用,而是给员工一个“必须改密码”的起点。更稳的做法是创建后就启用“用户下次登录时须更改密码”,这样初始密码其实只有几分钟的有效期,风险窗口很小。
域默认密码策略在“管理工具 - 组策略管理”里,默认组策略Default Domain Policy可以配置密码长度、复杂性、历史记录等。我第一次建域时直接启用了“密码必须符合复杂性要求”,结果很多人设置的密码老不合规,密码里必须包含大写、小写、数字和特殊字符,员工抱怨极多。建议先结合公司情况定策略:长度至少 8 位、历史记录保留 5 个左右、最长使用时间 90 天,至于复杂性可以放宽到要求不低于 8 位且包含两类字符,这样安全和易用平衡一些。
3. 域账户登录机制:原理、流程与排障
用户账号建好了,客户端要加域,员工要登录,这一块如果只管创建,不搞明白登录原理,后面问题一堆。
3.1 客户端加域与登录的基本流程
客户端电脑要加入域,有几个前提条件:
客户端能和域控网络互通,防火墙 445、389、88、53 等端口要通
客户端 DNS 指向域控地址,这是加域成败的关键
具备一个有权加域的账号,默认 Domain Admins 的成员可以加域,也可以委派普通用户加最多 10 台机器
加域时系统会在域控的 Computers 容器里创建计算机账户,并建立安全通道,也就是计算机和域控之间共享一个密钥。之后用户输入域凭据登录,客户端会通过 Kerberos 或 NTLM 协议向域控做认证。
具体流程大致是:用户在登录界面输入CORP\zhangsan或zhangsan@corp.example.com,客户端把凭据发给域控的认证服务。如果凭据正确,认证服务会签发一个票据(TGT),客户端用这个票据去访问域内资源。票据默认有效期 10 小时,这也是为什么网络里时间同步那么重要——Kerberos 对客户端和域控时间差容忍度只有 5 分钟,超过就报错。
3.2 登录脚本与文件夹重定向
账户创建本身不难,难的是登录之后让员工觉得“这域挺好用”。我建议在组策略里做两件事:
登录脚本映射网络驱动器,按部门把共享文件夹自动挂载成盘符
文件夹重定向,把“桌面”“文档”重定向到服务器共享目录,让员工换电脑不丢数据
登录脚本的设置路径是“用户配置 - Windows 设置 - 脚本(登录/注销)- 登录”。脚本内容类似:
net use Z: \\dc01\共享\IT部 /persistent:no net use M: \\dc01\个人目录\%username% /persistent:no脚本里%username%会自动替换成当前登录的域账号。文件夹重定向是在“用户配置 - Windows 设置 - 文件夹重定向”里设置“文档”指向\\dc01\个人目录\%username%\文档。
这里有个坑:重定向最好在用户第一次登录前就把组策略配好,否则用户已经在本地生成了一堆文档,重定向之后本地旧文件不会自动搬过去,员工发现文件“没了”马上找 IT 麻烦。实操时可以先重定向,再手动把本地文件拷到服务器目录里,最后一步要确认权限。
3.3 首次登录与密码修改流程
首次登录场景是:管理员创建账号时勾选了“用户下次登录时须更改密码”,员工输入初始密码登录,系统弹出“必须更改密码,新密码不能与旧密码相同”,改完就能正常进入系统。
这个流程本身没问题,但有三个常见故障点:
员工在登录界面输入的“旧密码”不对(初始密码记错或者大小写没对上)
密码修改成功后没记住新密码,下次登录又用旧密码,被锁定
用户不懂得在登录界面切换“其他用户”,输入的是本地账户而非域账户
前两个是教育问题,第三个可以在登录界面看到提示。员工报障“我输入了zhangsan却提示密码错误”,基本就是没切到域账户来源。运维在给员工开账号时可以顺便发一个简短的“域账号登录指南”,这个成本不高,省下来的求助工单很多。
3.4 登录慢或登录失败的排查顺序
登录慢这个问题,90% 和组策略里的“等待网络”配置以及客户端到域控的延迟有关。排查顺序我一般这样走:
- 确认客户端 DNS 指向是否正确,
nslookup dc01.corp.example.com能不能解析出域控 IP - 确认客户端和域控能否互相 ping 通,延迟高不高
- 检查事件查看器里登录相关事件,失败代码 0xC0000064 是密码过期,0xC0000234 是账户锁定,0xC000006A 是密码错误
- 检查域控日志,
netlogon服务有没有报错 - 如果登录特别慢,检查组策略对象里的驱动器映射脚本有没有引用不存在的共享路径,脚本等待超时会拖慢整个登录过程
我自己曾经遇到过登录慢到 5 分钟的情况,最后发现是登录脚本里映射了一个早已下线的文件服务器盘符,客户端一直在等超时。把脚本清理干净后,登录恢复到了 10 秒内。这种问题排查并不难,但前提是你得养成“多看事件日志”的习惯。
4. 域组体系:规划、创建与实战
用户账户管理只是基础,域里真正的灵魂是组。组用得好,权限管理能省一半力;用得乱,权限排查能让你加班到怀疑人生。
4.1 组类型、作用域一张表说清楚
AD 里组分两种类型:安全组和通讯组。安全组有 SID,可以用于授权;通讯组没有 SID,只能用于邮件的通讯组列表。平时我们管理权限用的都是安全组。
安全组的作用域有 3 种:
| 作用域 | 适用范围 | 典型使用场景 |
|---|---|---|
| 全局组 | 本域 | 放同类用户,比如“IT部全局组” |
| 域本地组 | 本域(可加其他域用户) | 放有某种访问权限的成员,比如“财务共享只读成员” |
| 通用组 | 林范围 | 跨域授权时使用,性能比全局组高但在多域环境下复制量大 |
用一个不太严谨但很好懂的类比:全局组是“人用的名片”,域本地组是“门禁卡的权限清单”。把用户加进全局组,再把全局组加入域本地组,最后给域本地组授予资源权限,这就是最经典的 AGDLP 模型。单域环境下,最常用的还是“直接建全局组 → 给组授权 → 把用户加进组”,简单清晰。
4.2 域组的创建与管理实操
创建组很简单,在 Users 容器或 OU 上右键“新建 - 组”,输入组名,选安全组和全局作用域就行。名称规范至少要包含部门或用途,比如G_财务_共享只读,让人看到名字就知道这个组干嘛的。
管理组成员,日常操作用 GUI 也没有太大压力,但如果要批量把人员加入组,用 PowerShell 更高效:
Add-ADGroupMember -Identity "G_财务_共享只读" -Members zhangsan,lisi,wangwu Get-ADGroupMember -Identity "G_财务_共享只读" | Select-Object name,SamAccountName这里我想特别提一下“组的管理者”属性。很多公司和 IT 部门纠结权限申请流程,其实 AD 组本来就有“管理者(ManagedBy)”字段。把组管理者指派给业务部门的主管,对方能在 Outlook 里直接管理组成员,IT 只需要负责审核。这个功能很多公司完全没用起来,太可惜了。
4.3 嵌套组与权限模型
嵌套组是指把组放进组里。我在实际项目中看到的最常见问题,就是管理员为了省事,把用户直接加进权限组,导致权限组成员越来越多,最后完全不知道谁能访问哪个共享。
规范做法是这样:
按部门建全局组,成员是用户:
G_财务_全员按资源权限建域本地组:
DL_财务共享_读写把
G_财务_全员加入DL_财务共享_读写给
DL_财务共享_读写赋共享文件夹 NTFS 权限
这样以后有人离职,只需把它从部门全局组里移除即可;新项目经理要求某个共享的完整权限,只需把对应全局组加入域本地组。权限审计时看几个组的成员就清楚了,不用对着几百个用户排查。
嵌套深度的原则是三到四层以内,过深会导致授权路径不透明,查看“有效访问”时也费劲。
4.4 利用组策略配合组下发配置
组建好了,不只是用 NTFS 权限控制共享,配合组策略可以做到更精细的差异化配置。
比如,销售部和研发部的电脑策略不一样。研发部可能需要映射自己部门的共享目录,销售部要隐藏控制面板。做法是在 AD 里按部门建 OU,比如OU=销售部,DC=corp,DC=example,DC=com和OU=研发部,...,然后分别链接组策略对象,用“安全筛选”指定只有对应域组(如G_研发部_全员)的成员才能应用该 GPO。
这里有个经典坑:默认每个 GPO 都筛选为“Authenticated Users”,如果你改成G_研发部_全员却没删掉原来的条目,所有域用户都能收到这个策略。改完一定要用“组策略建模向导”验证一下应用范围,不要凭感觉。
还有一个经验:GPO 数量别搞太多,能合并的尽量合并。每个 GPO 都有独立 GUID,处理策略时会按顺序处理,GPO 太多会造成登录慢和排障困难。同一类设置尽量放同一个 GPO 里,比如“密码策略”用一个、“账号锁定策略”用一个、“资源映射”用一个,别三天两头新建一个临时 GPO。
5. 域账户日常管理:生命周期、批量操作与审计
用户创建完不是结束,日常管理才是重头戏。离职、调岗、密码过期、锁定,每个场景都有对应的操作规范。
5.1 入职、调岗、离职三种场景的账户操作
入职场景:创建用户、加组、映射共享、指派邮箱。如果公司有 HR 系统或者工单系统,管理员应该尽量对接数据自动创建账号,减少人工输入的错误。
调岗场景:最常见的操作是把用户从旧部门 OU 移动到新部门 OU,同时调整组关系。注意一个细节:如果旧部门 OU 上挂了针对该部门的 GPO,用户移走后就不会再应用旧策略,新策略开始生效。组合员关系也要同步调整,否则可能残留旧部门的共享盘映射。
离职场景:我强烈建议流程固定为“禁用账户 → 移入离职 OU → 清除相关授权 → 邮件转发/托管 → 确认一段期限后删除”。禁用这一步不要手上留情,账户一旦禁用,所有域登录都会失败,员工就算知道密码也没用。
用 PowerShell 禁用/启用账户命令很简单:
Disable-ADAccount -Identity "zhangsan" Enable-ADAccount -Identity "zhangsan"5.2 密码策略与账户锁定策略
默认域策略里的密码设置,很多管理员根本不去看。但密码策略恰恰是域安全的门面,值得认真对待。
常用建议参数:
- 强制密码历史:5 个以上
- 密码最长使用期限:90 天
- 密码最短使用期限:1~3 天(防止员工立即改回旧密码)
- 账户锁定阈值:5 次错误尝试
- 账户锁定时间:30 分钟
- 重置锁定计数器:30 分钟后
锁定策略有个实际教训:如果只设“锁定阈值”没设“锁定时间”,默认策略会要求管理员手动解锁,批量脚本撞库测试时会把域内一半账户锁住,那天我通宵解锁就再也不干这种事了。稳妥做法是把锁定时间设为 15~30 分钟,让系统自动恢复。
5.3 批量设置与日常巡检脚本
域内用户几百上千时,日常巡检靠 GUI 肯定不现实。我维护环境时养成了一个习惯:每隔一段时间跑一遍状态检查脚本,批量导出所有启用的账户、密码过期时间、账户锁定状态、最近登录时间。
Get-ADUser -Filter {Enabled -eq $true} -Properties Name,SamAccountName,PasswordLastSet,LastLogonDate,BadLogonCount | Select-Object Name,SamAccountName,PasswordLastSet,LastLogonDate,BadLogonCount | Export-Csv C:\Temp\ad_users_report.csv -NoTypeInformation -Encoding UTF8最近登录时间这个字段要特别注意:LastLogonDate是多域环境下从所有域控汇总的近似值,不是实时的。更精确的做法是查每台域控的LastLogonTimeStamp,但大多数巡检场景用近似值也够用。
密码一个月后到期、或者是已经 180 天没登录的账户,都可以从这个报告里筛出来。自动给密码临期用户发邮件提醒,可以用 PowerShell 任务计划配合实现,这里不展开,但逻辑就是“查属性 → 判断时间差 → 发邮件”。
5.4 权限与成员关系的审计
组的成员变化,最好做到有据可查。AD 默认记录组策略和对象变化的审核日志,但默认没开,需要手动开启。
在“管理工具 - 本地安全策略/审核策略”里,开启“审核目录服务访问”的“成功”和“失败”设置,同时要在 AD 对象的“安全”选项卡里,给“Everyone”或相应管理组添加“写所有属性”审核。这样效果是每笔组成员变更都会写入域控安全日志,后续可以用事件 ID 4728(安全组新增成员)、4729(安全组移除)等来追溯。
另外建议给 IT 管理操作单独建一个“AD 管理员”组,不要每人都直接加 Domain Admins。日常建号、改密码、解锁账户用委派权限就够了,“域管理员”应该像核按钮一样谨慎使用。我把自己的日常操作账号和特权账号分开之后,权限事故明显减少,审计也轻松了很多。
6. 高频故障排查速查表与几点心得
域环境跑久了,你会遇到各种千奇百怪的问题。我把高频故障整理成一张排查表,方便遇到问题时对照处理。
| 症状 | 可能原因 | 排查/解决思路 |
|---|---|---|
| 加域时提示“找不到域” | 客户端 DNS 指向错误 | 把客户端 DNS 改成域控地址,nslookup 先解析域名 |
| 登录提示密码错误但密码肯定没错 | 用户没切换到域账户来源 | 登录界面用CORP\用户名格式输入 |
| Kerberos 报错 | 客户端和域控时间差超过 5 分钟 | 客户端启用自动时间同步,指向域控或 NTP 源 |
| 账户被锁定 | 密码错误次数超阈值 | 解锁并重置密码,检查是否有撞库脚本 |
| 无法访问某个共享 | 用户未加入对应组 | 检查组成员关系,注意关嵌套组层次 |
| 网络驱动器不显示 | 登录脚本路径无效或策略未应用 | 检查脚本路径和net use输出,用gpresult验证 GPO |
| 组策略不生效 | 安全筛选或 OU 位置不对 | 用“组策略结果”向导检查用户实际应用了哪些 GPO |
| 域控复制报错 | DNS 注册问题或网络不通 | repadmin /showrepl检查复制拓扑,确认 DNS 里 SRV 记录完整 |
这些故障里,最常见、最容易被人忽略的还是 DNS。AD 域几乎绑定 DNS 网关的通道,任何域名解析异常都会导致加域、登录、组策略、复制全线崩溃。我排查域问题时,十次有八次是从 DNS 查起。
再分享两点心得。
第一,做任何批量修改前,先备份。AD 里可以用 PowerShell 导出 OU、用户、组和组策略,也可以用 Windows Server Backup 备份系统状态。不怕一万就怕万一,改字段之前能导出就导出。
# 导出所有 OU Get-ADOrganizationalUnit -Filter * | Export-Csv C:\Temp\ous.csv -NoTypeInformation -Encoding UTF8 # 导出所有组及成员 Get-ADGroup -Filter * | ForEach-Object { Get-ADGroupMember -Identity $_.DistinguishedName | Select-Object @{N='Group';E={$_.DistinguishedName}}, SamAccountName } | Export-Csv C:\Temp\group_members.csv -NoTypeInformation -Encoding UTF8第二,域内时间同步自动化。我见过很多小公司忘了配置客户端时间同步,每天都有若干台电脑因为时钟偏差登录失败。最简单的做法是在默认域策略中加入一条 W32TM 设置:客户端指向域控作 NTP 服务器。域控多余一台时再配 PDC 模拟器对外时间源。
配置方法不复杂,但做完一定要w32tm /resync手动强制同步一次验证。否则策略倒是加了,客户端时间还歪着,用户继续报错。
再提一个小技巧,日常维护时如果界面操作卡顿,记得多用键盘快捷键和右键菜单,尤其时“Active Directory 用户和计算机”里的刷新(F5),比你重新打开窗口强多了。
结尾:域运维没有银弹,但有章法
AD 域管理这东西,最怕临时抱佛脚。用户建号靠手点、权限分配靠感觉、故障排查靠重启,那迟早要出事。我做这套实践的体会是:域环境维护是个系统性工程,做好规划、批量化脚本化、多积累日志排查经验,比什么都管用。
最后再说一个我自己特别受益的小习惯:每次处理完一个域环境问题,顺手记一段几百字的小结,记录问题现象、排查命令、解决过程和教训。时间久了,这本笔记就成了全公司最实用的运维手册,比网上搜到的资料贴合咱们环境多了。你从今天建第一批账号开始,也可以这么干。