1. 故障现场:一个连不上的SSAS实例到底发生了什么
你遇到过这种情况吗?早上打开SSMS准备看一眼SSAS多维数据集昨天的处理情况,连接框转了两圈,直接红字报错。你以为只是服务重启一下的事,跑到服务管理器一看,SQL Server Analysis Services(你的实例名)状态是“已停止”,手动启动,Windows弹出一句“引用的账户当前已锁定,且可能无法登录”。这时候你才意识到,问题可能出在服务账户上,而不是分析服务“闹脾气”。
好多年前我第一次处理这个报错时,第一反应也是去检查SSAS端口、防火墙、服务是否正常运行,结果兜了一大圈。后来在AD域控上看到账户锁定审计日志,才明白报错里“账户”两个字指的是Windows服务账户,而不是SQL Server里某个用户名。这篇文章从一次真实故障切入,把SSAS报“账户已锁定”这类问题的完整排查链路和工程化预防手段梳理出来,适合数据平台运维、BI开发,以及所有需要管理SQL Server服务账号的工程师。
1.1 从SSMS报错到服务管理器:两条典型的故障轨迹
从业务侧看,故障轨迹通常分成两类。
第一类是服务还在运行,但所有客户端连接时失败。SSMS连接Analysis Services实例,转几秒后报“无法连接到服务器”或“在建立连接时发生错误”。Power BI刷新数据集、Excel透视表连接也会同步失败,服务器这边看起来“服务在线”,但实际已经无法提供查询。这种情形下,账户锁定不是直接让进程挂掉,而是让SSAS在特定身份验证动作上失败。
第二类是SSAS服务直接起不来。打开services.msc,找到SQL Server Analysis Services实例,状态通常是“已停止”,手动点“启动”,可能连启动都不成功,服务控制管理器直接返回错误:“引用的账户当前已锁定,且可能无法登录”。如果错误弹窗不够明显,还会在Windows事件查看器里看到服务控制管理器发出的事件ID 7000或7038,内容指向登录失败。
这两类轨迹对应的排查思路不一样:第一类要优先看SSAS客户端身份验证、连接串和模拟账户;第二类要优先看服务账户状态和SCM启动链路。本文下面说的“引用的账户当前已锁定”,主要指向第二类,但排查逻辑同样能覆盖第一类。
1.2 真正记录“账户已锁定”的三个现场
错误信息不会只出现在一个地方。遇到这类问题,至少要看三个日志现场:
- SSAS实例日志目录,默认在
C:\Program Files\Microsoft SQL Server\<实例ID>\OLAP\Log,以msmdsrv开头的日志文件记录了服务启动过程中的错误,锁定账户导致启动失败时,日志里会有一行类似“Logon failed for the referenced account”的描述。 - Windows事件查看器中的应用程序日志和系统日志。打开“Windows日志→系统”,筛选来源为“Service Control Manager”的事件,能看到服务启动失败的具体错误代码和关联账户。
- 如果账户是域账户,域控的“安全日志”会记录账户锁定事件,事件ID 4740是“已锁定账户”,里面包含调用方计算机名,这是找出“谁把账户锁了”的关键证据。
很多人只盯着SSMS返回的“连接失败”或服务管理器弹窗,忽略事件日志,结果在SSAS端口、权限、防火墙上面反复折腾。后面我会专门讲怎么把这些日志串成一条完整的证据链。
1.3 案例开头:一次凌晨ETL集体失败
说一个我实际参与过的场景。某客户环境里,凌晨3点左右,一批依赖SSAS的处理任务和报表刷新同时开始失败。值班同事通知我时,第一反应是SSAS是不是内存压力大或者连接数爆了。登录服务器看了一眼,SSAS进程其实还活着,但所有连接都认证失败。查看Windows事件日志,发现服务账户从凌晨3点开始被反复锁定,每10分钟一次。查AD发现密码还没到期,账户确实处于“LockedOut”状态。顺着域控4740事件里的来源计算机名,才定位到一台应用服务器上的旧报表订阅——它定期以旧密码尝试连接SSAS,成了整个故障的元凶。这个案例我后文还会反复提到,因为它的排查链路特别典型:先看SSAS,再看域控,最后找到隐藏的旧凭据依赖。
2. 报错信息解剖:谁在“引用”这个账户,是谁把它“锁”了
很多人看到“引用的账户当前已锁定,且可能无法登录”这句话,第一反应是“哪个账户被锁”?这个问题的答案,就藏在Windows服务启动机制里。
2.1 服务启动的登录会话机制:从SCM说起
Windows服务和我们平时双击运行的普通程序不一样。普通程序以你当前登录的Windows身份启动,而Windows服务由服务控制管理器(SCM)负责启动。SCM在启动服务时,会读取该服务在“登录”选项卡里配置的账户信息,然后调用Windows登录子系统创建对应的登录会话。
如果这个账户处于锁定状态,Windows会拒绝创建登录会话。SCM拿不到有效令牌,服务进程自然无法启动,系统就会返回那句“引用的账户当前已锁定,且可能无法登录”。这里“引用的账户”指的是服务登录身份里填写的那个账户,通常是形如域\svc_ssas的域账户,也可能是一台服务器上的本地账户。
有个容易被忽略的细节:这里的“锁定”是Windows账户状态(Locked Out),和SQL Server里的登录名锁定完全是两回事。SQL Server如果启用了“登录阈值”,密码尝试过多也会导致登录名被锁定,但那是SQL Server层面的控制,与Windows账户锁定相互独立。SSAS实例通常不维护域账户的锁定策略,它更像是Windows域策略的“受害者”。
2.2 三个容易混淆的概念:服务账户、连接账户、模拟账户
排查时总有人把三件事混在一起,导致方向跑偏。
- 服务账户:决定SSAS进程能否启动。被锁后,服务起不来,报“引用的账户当前已锁定”。
- 连接账户:客户端(SSMS、Power BI、Excel中使用的Windows账户)连接SSAS时使用的身份。这个账户被锁,表现为连接时认证失败,但服务本身可以正常跑。
- 模拟账户:SSAS处理分区或查询时,若要访问SQL Server等外部数据源,可能配置了Impersonation模式,指定某个账户去访问数据源。这个账户被锁时,SSAS报数据源连接失败或权限错误,而不是登录被锁。
实际生产中,最常见的是第一种(服务账户被锁);第二种也时有发生,常见于有人改密码后拿着旧密码反复连接;第三种较少见,但排查成本最高。还有一个场景容易被忽视:如果SSAS配置了通过IIS的HTTP访问(MSMDPUMA),IIS应用程序池使用的账户被锁,也会导致相似的连接失败。排查范围不能只盯着服务管理器。
2.3 “可能无法登录”这几个字的误导性
报错后半句“可能无法登录”非常容易把人带偏。它听上去像“登录不了某个数据库”,于是有人去SSMS里试账号、改数据库权限、重建连接,却不知道这里的“登录”指的是Windows登录会话,不是SQL Server登录名。
我见过运维同事在这个报错上折腾了大半天,最后发现只是域账号被锁。他们还反问:“为什么SSAS不直接写清楚是哪个账户被锁?”其实SSAS日志里通常有更详细的信息,但默认弹窗只会展示一句精简摘要。这也是为什么我强调“先看日志,再动手改配置”。
3. 账户为什么会被锁:域策略、密码过期与隐性凭据
搞清楚“谁引用账户”之后,下一个问题是:账户为什么会被锁?Windows不会无缘无故锁定一个账户,它背后一定有策略配置和失败登录尝试。
3.1 锁定阈值与时间窗口:一条组策略的连锁反应
Windows域环境中,账户锁定由以下三个策略共同控制:
| 策略项 | 默认值 | 作用 |
|---|---|---|
| 账户锁定阈值 | 0(不锁定) | 连续多少次错误密码后触发锁定 |
| 账户锁定时间 | 无(阈值>0时默认30分钟) | 锁定持续多久后自动恢复 |
| 重置账户锁定计数器时间 | 无(阈值>0时默认30分钟) | 多久之后清空失败计数 |
很多企业管理员为了防爆破,会把阈值设为5或更小。这本身没有错,但没有同步梳理服务账户的依赖关系,就会把“服务账户”变成“高风险账户”。一旦某个依赖方拿着旧密码反复重试,失败次数累加达到阈值,账户直接被锁定。服务账户不像人类用户那样会去看邮箱、通知管理员“我密码错了”,它只会默默被锁。
如果账户是本地账户,锁定机制也类似。在SSAS服务器上打开“本地安全策略”中的“账户锁定策略”,同样能看到阈值、锁定时间、重置时间。不过生产环境里SSAS服务账户用域账户更普遍,因为要访问网络上的数据源和其他域资源。
3.2 四种最常见的锁因
结合我处理过的案例,SSAS服务账户被锁,通常逃不出下面四种情况:
- 密码过期:如果服务账户没有设置“密码永不过期”,密码到期后,某些程序还在用旧密码持续连接。旧密码连续失败,触发锁定。
- 密码轮换清单不完整:运维在AD里修改了服务账户密码,但SSAS服务登录选项卡里的密码没有同步更新。SCM每次启动服务时都尝试用旧密码登录,失败N次后账户被锁。
- 依赖方存在旧凭据:某个报表订阅、SSIS包、计划任务、IIS应用池,存储着这个账户几个月前的密码。这些任务周期性运行,每次都用旧密码做认证,是典型的“定时锁账户”元凶。
- 安全扫描或弱密码探测:企业安全设备或第三方审计工具会尝试用弱密码登录所有账户。服务账户如果被命名成
svc_ssas这种一眼就能看出用途的名字,很容易被针对性地“测试”。
这里的共同点是:账户被锁往往不是SSAS自己造成的,而是某个“看不见的旧凭据”在持续尝试登录。所以我一直建议,排查账户锁定时,先找“谁在拿旧密码登录”,不要急着解锁。
3.3 真实锁因复盘:旧订阅凭据如何让服务账户被锁
回到文章开头那个凌晨ETL案例。我们当时查到服务账户每10分钟被锁一次,但奇怪的是,SSAS服务明明还在运行,为什么还会触发锁定?后来发现,问题出在一台应用服务器的旧版报表订阅上。
那个订阅是一个控制台程序,配置了SSAS连接字符串,其中硬编码了服务账户的用户名和密码。三个月前,客户按安全策略要求改了服务账户密码,但这个订阅程序没有同步更新,依然持有三个月前的旧密码。订阅周期设置为10分钟一次,每次尝试都用旧密码做身份验证。账户锁定阈值是5次,这意味着50分钟内必然触发锁定。
解锁后我们会立刻再观察,结果没过多久账户又被锁了,直到我们把那个订阅任务停掉,锁定才彻底消失。这个案例告诉我们:账户锁定的根因往往不在SSAS服务器上,而在所有可能使用该账户的外部系统里。只解锁不找原因,等于给故障按了暂停键,不是结束键。
4. 完整排查链路:从报错到解锁到复联的每一步
既然搞清楚了原理,接下来就是真正能落地的排查步骤。我把整个过程拆成五步,每一步都说明操作目的和注意事项。
4.1 第一步:确认错误来源,不跳步
遇到“引用的账户当前已锁定,且可能无法登录”,先别急着解锁。按下面顺序收集信息:
- 在services.msc里手动启动一次SSAS服务,拿到系统返回的完整错误文本。
- 打开SSAS日志目录
C:\Program Files\Microsoft SQL Server\<实例ID>\OLAP\Log,找最新的msmdsrv日志,搜索关键字“locked”“account”“logon”,确认错误上下文。 - 打开事件查看器,在“Windows日志→系统”中,筛选来源为“Service Control Manager”,找到关于SQL Server Analysis Services的事件,记录事件ID和错误描述。
- 如果账户是域账户,去域控上查看“安全日志”中的事件ID 4740,记录“调用方计算机名”和“账户名”。
提示:先把4个现场的证据固定下来,再动手改任何配置。这一步能避免你在排错过程中反复试错,也是后续复盘的基础。
4.2 第二步:查询账户真实状态
确认账户是否处于锁定状态,需要用命令行或AD管理工具直接查。
对于本地账户,在SSAS服务器上执行:
net user svc_ssas输出中的“账户时间”或“Account active”区域,如果出现“已锁定”或“账户锁定”字样,说明当前就是锁定状态。
对于域账户,执行:
net user svc_ssas /domain或者用PowerShell:
Get-ADUser -Identity svc_ssas -Properties LockedOut, AccountExpirationDate, PasswordExpired | Format-List *重点看LockedOut字段。如果值为True,账户就是锁定状态。同时看PasswordExpired和AccountExpirationDate,判断是不是密码过期叠加导致的问题。
4.3 第三步:追查锁定来源,先止血再解锁
这是整个排查中最关键、也最容易被跳过的一步。很多人在第2步看到账户确实被锁,咔嚓一下就解锁了,然后没过多久又锁上,陷入“解锁—被锁—再解锁—再被锁”的循环。
正确做法是:解锁之前先找到锁定的源头。
在域控的“安全日志”中,筛选事件ID 4740,事件属性里会显示“调用方计算机名”(Caller Computer Name),这就是发起失败登录的机器。如果日志量大,可以用PowerShell过滤:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 50 | Where-Object { $_.Message -like '*svc_ssas*' } | Format-List TimeCreated, Message拿到来源机器后,登录那台机器,检查以下几类可能性:
- 计划任务:
schtasks /query /fo LIST /v,筛选有没有使用该账户的任务。 - Windows服务:services.msc中查看是否有服务登录身份使用了该账户。
- IIS应用池:打开IIS管理器,看应用程序池的“进程模型→标识”是否引用了该账户。
- 数据源凭据:检查SSIS包、Excel连接文件、Power BI数据源配置中是否保存了旧密码。
把可疑的源停掉或改成新密码之后,再执行解锁操作。这里有个“先止血再解锁”的原则:如果来源还在持续尝试旧密码,解锁没有意义。
4.4 第四步:解锁并重启SSAS服务
确认没有持续失败来源后,执行解锁。
对于域账户,在域控上打开“Active Directory 用户和计算机”,右键该账户→属性→账户选项卡,如果账户被锁,会有一个“解锁账户”按钮,点击即可。命令行方式可以参考:
Set-ADUser -Identity svc_ssas -Replace @{lockoutTime=0}注意,net user svc_ssas /active:yes /domain只处理“禁用”状态,不能直接解除LockedOut状态。很多资料说它能解锁,其实它是把“启用/禁用”状态改为启用,真正的锁需要清lockoutTime属性。
对于本地账户,建议直接在“计算机管理→本地用户和组→用户”中,右键属性,取消勾选“账户已锁定”。命令行方式在本地账户上没有直接解锁的专用命令,需谨慎操作。
解锁后,重启SSAS服务。服务名通常是MSSQLServerOLAPService,如果实例名不是默认实例,服务名后面会带有$实例名。可以执行:
Restart-Service "MSSQLServerOLAPService" -Force再确认状态:
Get-Service "MSSQLServerOLAPService" | Format-List Status, Name, DisplayName服务状态为Running后,别急着交差。用SSMS连一次实例,刷新一两张有代表性的报表,跑一次处理任务,确认端到端链路恢复。
4.5 解锁后依然报“账户已锁定”的坑
有一种情况很烦人:账户明明已经解锁了,服务启动还是报同样的错误。这时候要排查几个点:
- 服务登录选项卡里的密码是否同步更新过。即使账户已解锁,如果服务里存的还是旧密码,SCM依然会拒绝创建会话。
- 服务管理器是否缓存了错误状态。有些时候需要先把服务从“停止”状态重新“启动”一次,而不是点“重启”。
- 配置文件是否覆盖了服务登录身份。有些SSAS部署会在
msmdsrv.ini或启动参数中显式指定账户信息,导致服务管理器里改了也没用。 - 是否同时存在多个实例或相关组件使用同一账户。解锁了一个账户,另一个服务或应用池还在反复尝试失败,很快又锁回去。
遇到这类问题,我一般会先把服务登录身份临时切到Local System或Network Service,让服务先起来,保住业务窗口,再回头处理账户密码和依赖关系。但这个方案只适合短期止血,因为这会引起权限模型变化,可能影响数据源访问或Kerberos双跳。
5. 防复发设计:把账户生命周期交给流程,而不是运气
这类故障最坑的不是出现一次,而是反复出现。如果不解决“为什么会有旧凭据”“为什么密码会过期”“为什么没人知道谁在用这个账户”这三个问题,下一次“引用的账户已锁定”只是时间问题。
5.1 服务账户独立化与最小权限矩阵
SSAS服务账户应该是一个独立的专用账户,不要用域管理员、普通员工账号,也不要让一个服务账户被十几个组件共享。我建议先做一次盘点,把SSAS相关的账户分成几类,分别建表管理:
| 账户类型 | 用途 | 权限建议 | 常见被锁场景 |
|---|---|---|---|
| 服务账户(主) | SSAS服务进程运行身份 | 作为服务登录、访问数据目录、备份目录 | 密码过期、旧凭据重试 |
| 模拟账户 | SSAS访问外部数据源时使用 | 仅授予数据源最小读取权限 | 数据源密码变更后未同步 |
| HTTP访问账户 | IIS应用池身份(如启用MSMDPUMA) | 应用池运行所需最小权限 | 应用池密码过期或改密未同步 |
把这个表格贴在运维文档里,每次变更密码前先对照表格,列出所有可能受影响的服务,再去改密码。
5.2 用gMSA把所有密码问题交给域控
如果运行环境是Windows Server 2012或更高版本,AD功能级别也在2012及以上,强烈建议给SSAS服务账户启用组托管服务账户(gMSA)。gMSA的密码由域控自动管理,默认每30天轮换一次,不会过期,也不会因为“忘记同步密码”而触发锁定。
简单来说,gMSA是“域控替你管密码”,不需要人工去重置、同步。配置步骤大致如下:
在域控上初始化密钥:
Add-KdsRootKey -EffectiveImmediately如果不想等待,可以用-EffectiveTime (Get-Date).AddHours(-10)回拨时间,具体看环境。
创建gMSA账户:
New-ADServiceAccount -Name svc_ssas -DNSHostName yourdomain.com -KerberosEncryptionType AES128, AES256在SSAS服务器上安装该账户:
Install-ADServiceAccount -Identity svc_ssas然后在服务登录身份中填写yourdomain\svc_ssas$,密码留空即可。注意gMSA名称末尾要加$,这是它和普通域账户最大的区别。
注意:gMSA要求所有使用该账户的服务器都安装同一gMSA,且服务账户要具备“作为服务登录”权限。SQL Server对gMSA的支持从SQL Server 2012 SP1开始,老版本请先确认兼容性。
使用gMSA后,密码过期和错密码重试这两类锁定诱因基本被从根上消除了。剩下要做的就是定期验证服务状态和监控。
5.3 监控、告警和变更SOP
账户锁定这种故障,最怕“发生的时候没人知道”。建议做三件事:
- 在域控上开启安全日志审计,把事件ID 4740订阅到集中日志平台或告警平台。任何账户被锁都能第一时间收到通知。
- 定期用PowerShell扫描所有AD账户锁定状态:
Search-ADAccount -LockedOut | Select-Object Name, DistinguishedName, LastLogonDate | Export-Csv locked_accounts.csv把这段脚本放进计划任务,每天跑一次,输出结果发给运维团队。
- 建立SSAS服务账户密码变更SOP。变更前先查依赖清单,变更后逐项重启相关服务并验证连接。流程里必须包含“旧凭据扫描”这一步:变更完成后,去IIS应用池、计划任务、SSIS目录里翻一遍,把还在用旧密码的凭据找出来。
5.4 推荐的临时止血方案
最后说一个很现实的问题:生产环境出了这种事,业务不可能等你一步步查完再恢复。我的建议是:
- 如果你的AD环境允许,先通过域控把账户解锁,同时把服务登录身份临时切到
Local System或Network Service,让SSAS先起来。这样业务能立刻恢复。 - 等闲下来,再慢慢排查“是谁在拿旧密码登录”,定位后清理掉旧凭据,再把服务登录身份切回专用域名账户。
这个方案不优雅,但很实用。我踩过几次坑之后,对这种故障已经形成条件反射:先恢复,再追因。只要业务窗口还开着,排查工作就不会因为着急而出错。
最后再分享一点个人实战体会:SSAS出现“引用的账户当前已锁定”,十次里有八次不是因为SSAS本身故障,而是因为账户生命周期管理出了问题。我后来处理这类问题,第一步永远是先问“这个账户的密码最近有没有被人改过”“这个账户还被哪些服务用着”,而不是急着去点解锁。把这两个问题想清楚,再配合gMSA改造和事件告警,基本能把这类故障的复发率压到很低。