SQL Server Always On AG(WSFC)配置指南(3) - 创建和配置专用域账号(和gMSA二选一)
分类: SQL Server ◆ 标签: #SQL Server #SQL Server Always on AG ◆ 发布于: 2026-03-16 18:07:14
我们之前的文章专门介绍了创建和配置gMSA(Group Managed Service Account)用于运行SQL Server和SQL Agent服务,这也是微软官方推荐的方案,但是还是有部分场景要使用专用的域账号。
gMSA是微软在 Windows Server 2012 中引入的一种特殊类型的域账户,旨在解决传统“手动管理的服务账户”带来的安全和管理痛点。简单来说,它是服务账户的进化版,由 Active Directory 自动管理密码,并支持多台服务器共享同一个账户身份。
gMSA与传统服务账户的区别:
| 特征 | 传统服务账户(Domain User) | 托管服务账户(sMSA) | 组托管服务账户(gMSA) |
|---|---|---|---|
| 密码管理 | 人工管理,为了安全需定期修改,容易遗忘或者过期导致服务中断 | 自动管理,AD自动30天轮换一次,无需人工干预 | 自动管理,AD自动轮换,支持更复杂的轮换策略 |
| 多服务器支持 | 支持,同一账号密码可配置多台服务器 | 不支持,只能绑定到一台计算机 | 支持,核心优势:同一个gMSA可同时用在多台服务器 |
SPN管理 | 人工管理,需手动使用setspn注册和维护 | 自动管理,AD自动处理SPN注册 | 自动管理,AD自动处理SPN注册 |
| 安全性 | 低,密码可能会泄露,弱密码,长期不换 | 中,密码复杂且自动切换,但单点故障风险 | 高,密码是120+字符的随机值,自动轮换,防窃取 |
| 适用场景 | 遗留系统,简单单点服务 | 单台服务器上的独立服务 | 集群,负载均衡,Always on AG, IIS Farm架构 |
现在开始介绍如何创建域专用账户。
开始之前检查如下清单:
- 安装了
Windows Server - 已经配置了网络,禁止了
IPV6 - 创建了域控和
DNS - 将所有的节点都已经加入了域
- 安装了
SQL Server - 安装了故障转移集群
确认上述清单后,我们开始创建专用的域账号,基本步骤如下:
- 创建专用域账号
- 给账号分配
read ServicePrincipal和write servicePrincipal的权限 - 给域账号创建
SPN - 在各个
SQL节点上配置域账号作为服务登录 - 在各个
SQL节点上分配文件权限 - 在各个
SQL节点上为域账户在数据库里创建login并赋予sysadmin角色 - 使用
SQL Server Configuration Manager为SQL Server和SQL Server Agent配置运行账户为域账户。
创建专用域账号(在域控上运行)
确认登录到了域控,并且是终端管理员,运行如下的命令创建两个专用的域账户,这两个账户专门用于SQL Server服务和SQL Agent服务
New-ADUser -Name "svc-sql-engine" -SamAccountName "svc-sql-engine" -UserPrincipalName "svc-sql-engine@hong.cn" -AccountPassword (Read-Host -AsSecureString "Password") -Enabled $true -PasswordNeverExpires $true -CannotChangePassword $true
New-ADUser -Name "svc-sql-agent" -SamAccountName "svc-sql-agent" -UserPrincipalName "svc-sql-agent@hong.cn" -AccountPassword (Read-Host -AsSecureString "Password") -Enabled $true -PasswordNeverExpires $true -CannotChangePassword $true
- 账号
svc-sql-engine用于SQL Server服务 - 账号
svc-sql-agent用于SQL Agent服务 PasswordNeverExpires指明用户的密码永不过期(安全的漏洞,也可能不符合企业安全的合规性)CannotChangePassword指明用户不能更改密码
给账户分配read ServicePrincipal和write servicePrincipal的权限(在域控上运行)
在终端上运行:
PS C:\Users\Administrator> $user = Get-ADUser svc-sql-engine
PS C:\Users\Administrator> $user.DistinguishedName
CN=svc-sql-engine,CN=Users,DC=hong,DC=cn
PS C:\Users\Administrator> dsacls "CN=svc-sql-engine,CN=Users,DC=hong,DC=cn" /G "SELF:RPWP;servicePrincipalName"
PS C:\Users\Administrator> $agent = Get-ADUser svc-sql-agent
PS C:\Users\Administrator> $agent.DistinguishedName
CN=svc-sql-agent,CN=Users,DC=hong,DC=cn
PS C:\Users\Administrator> dsacls "CN=svc-sql-agent,CN=Users,DC=hong,DC=cn" /G "SELF:RPWP;servicePrincipalName"
给域账号创建SPN (域控上运行)
在终端上运行:
setspn -A MSSQLSvc/dbserver3.hong.cn:1433 hong\svc-sql-engine
setspn -A MSSQLSvc/dbserver4.hong.cn:1433 hong\svc-sql-engine
setspn -A MSSQLSvc/dbserver4.hong.cn hong\svc-sql-engine
setspn -A MSSQLSvc/dbserver3.hong.cn hong\svc-sql-engine
setspn -L hong\svc-sql-engine
setspn -L hong\svc-sql-agent
注意: 这里dbserver3.hong.cn和dbserver4.hong.cn是目前计划集群中的两台SQL节点,如果你有更多的节点,要按照上述命令设置
在各个SQL节点上配置两个账号作为服务登录
逐一登录到所有的SQL节点上,启动本地策略编辑器 secpol.msc, 按照下图添加域账号:

在各个SQL节点上给两个域账号文件权限
逐一登录到各个SQL节点上,以管理员启动终端,并运行如下命令:
icacls “C:\SQLData\" /grant 'HONG\svc-sql-engine:(OI)(CI)F'
icacls "C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA" /grant 'HONG\svc-sql-engine:(OI)(CI)F'
icacls “C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Log" /grant 'HONG\svc-sql-engine:(OI)(CI)F'
icacls “C:\SQLData\" /grant 'HONG\svc-sql-agent:(OI)(CI)F'
icacls "C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA" /grant 'HONG\svc-sql-engine:(OI)(CI)F'
icacls “C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Log" /grant 'HONG\svc-sql-engine:(OI)(CI)F'
C:\SQLData\用户自定义数据文件,日志文件,备份文件在这个目录里。C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA和C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Log默认安装的目录
用户应该要根据自己的实际情况来授予不同目录权限。
在各个SQL节点上为域账户在数据库里创建login并赋予sysadmin角色
使用工具,例如SSMS登陆到SQL Server, 运行下述命令:
CREATE LOGIN [HONG\svc-sql-engine] FROM WINDOWS;
ALTER SERVER ROLE sysadmin ADD MEMBER [HONG\svc-sql-engine];
CREATE LOGIN [HONG\svc-sql-agent] FROM WINDOWS;
ALTER SERVER ROLE sysadmin ADD MEMBER [HONG\svc-sql-agent];
赋予AG Endpoint权限
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint]
TO [HONG\svc-sql-engine];
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint]
TO [HONG\svc-sql-agent];
使用SQL Server Configuration Manager 为SQL Server和SQL Server Agent配置运行账户为域账户。
逐一在每个SQL节点上使用SQL Server Configuration Manager按照如下图配置SQL Server和SQL Agent的账户分别为svc-sql-engine和svc-sql-agent:

要记得两个账户分别对应SQL Server和SQL Agent