Skip to main content

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 ServerSQL 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 AGIIS Farm架构

现在开始介绍如何创建域专用账户。

开始之前检查如下清单:

  1. 安装了Windows Server
  2. 已经配置了网络,禁止了IPV6
  3. 创建了域控和DNS
  4. 将所有的节点都已经加入了域
  5. 安装了SQL Server
  6. 安装了故障转移集群

确认上述清单后,我们开始创建专用的域账号,基本步骤如下:

  1. 创建专用域账号
  2. 给账号分配read ServicePrincipalwrite servicePrincipal的权限
  3. 给域账号创建SPN
  4. 在各个SQL节点上配置域账号作为服务登录
  5. 在各个SQL节点上分配文件权限
  6. 在各个SQL节点上为域账户在数据库里创建login并赋予sysadmin角色
  7. 使用SQL Server Configuration Manager 为SQL ServerSQL 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 ServicePrincipalwrite 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.cndbserver4.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\DATAC:\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 ServerSQL Server Agent配置运行账户为域账户。

逐一在每个SQL节点上使用SQL Server Configuration Manager按照如下图配置SQL ServerSQL Agent的账户分别为svc-sql-enginesvc-sql-agent



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