首页/系统/Windows 运维速查/服务登录账户排查

服务登录账户排查

服务以哪个账户运行决定权限边界:LocalSystem/NetworkService/自定义域账户,权限与网络访问问题先核对它。

Windows 运维速查系统更新于 2026-10-13

服务登录账户为什么关键

Windows 服务以某个账户身份运行,这个账户就是它的权限边界:能读哪些目录、能不能写注册表、访问网络共享时以谁的身份、连数据库时用什么凭据。选错账户的典型表现是「服务能启动,但一访问共享或数据库就失败」。排查这类问题,第一步永远是先看清服务实际以哪个账户在跑,而不是先去改应用配置。

基本信息

适用平台Windows 全版本(sc.exe 与 PowerShell 通用)
查看配置sc qc <服务名>,重点看 SERVICE_START_NAME(运行账户)与 BINARY_PATH_NAME
查看状态sc query <服务名>、Get-Service <服务名>
PowerShellGet-CimInstance Win32_Service | Select-Object Name, StartName, StartMode, State
常用账户LocalSystem、LocalService、NetworkService、域服务账户、组托管服务账户
权限要求查看无需提权;修改账户与服务配置需要管理员

典型使用场景

  • 网络访问失败:服务读共享目录或连数据库失败,先核对运行账户
  • 迁移上线:新服务器上按旧环境配置服务账户,避免权限行为不一致
  • 权限收敛:把以 LocalSystem 运行的服务改成最小权限账户
  • 故障定位:服务启动失败提示「登录失败」,确认是账户口令问题还是权限问题
  • 审计核对:盘点全机服务运行账户,找出仍在使用高权限账户的项

常用示例

常用示例
sc qc Spooler                            # 查看服务配置,看 SERVICE_START_NAME
sc qc MySvc | findstr /i "SERVICE_START_NAME BINARY_PATH_NAME"   # 只看关键两行
sc query MySvc                           # 查看当前状态
sc queryex MySvc                         # 状态 + PID,便于对到进程
REM 修改运行账户(obj= 与 password= 后必须留一个空格再写值)
REM sc config MySvc obj= "DOMAIN\svc_app" password= "口令"
REM 改成内置账户
REM sc config MySvc obj= "NT AUTHORITY\NetworkService" password= ""
REM PowerShell 等价
REM Set-Service -Name MySvc -StartupType Automatic
REM Get-CimInstance Win32_Service -Filter "Name='MySvc'" | Select-Object Name, StartName, StartMode, State, PathName

常见账户的能力边界

账户本机权限网络身份
LocalSystem本机几乎全权,含内核对象访问以机器账户(机器名$)访问网络
NetworkService权限受限同样以机器账户访问网络
LocalService权限最小网络访问为匿名,多数共享会被拒
域服务账户由授权决定以该账户身份访问,可被授予精细权限
组托管服务账户由授权决定同上,但口令由系统托管自动轮换
改账户只是第一步:换账户后必须同步授予新账户对程序目录、日志目录、注册表分支、数据库与共享的权限,否则服务能起来但一执行具体动作就失败。
服务账户还需要「作为服务登录」这一用户权限。手工授予不当或组策略刷新后权限被收回时,服务会报登录失败(错误 1069),此时要检查本地安全策略与域策略。

核对与排错

核对与排错
Get-CimInstance Win32_Service | Where-Object { $_.StartName -like 'LocalSystem*' } | Select-Object Name, StartName   # 盘点高权限服务
Get-CimInstance Win32_Service -Filter "Name='MySvc'" | Select-Object Started, State, ExitCode, ServiceSpecificExitCode   # 看退出码
Get-WinEvent -LogName System -MaxEvents 50 | Where-Object Id -in 7000,7009,7011,7031   # 服务相关事件
sc qc MySvc | findstr SERVICE_START_NAME                                                 # 再看一次最终生效账户
在命令行里明文传服务账户口令,会留在命令历史、脚本文件与审计日志中。生产环境应改用服务管理器界面、组托管服务账户,或用受控的配置下发方式。

易错点

  • 服务以 LocalService 运行却要访问网络共享:网络身份为匿名,必然被拒,需换账户或调整共享授权
  • 改账户后不同步授权:服务能启动,但访问文件、注册表、数据库时失败,表现为「改完更糟」
  • 命令行明文写口令配置服务账户,口令泄漏且轮换困难,应改用托管服务账户
  • 只信服务属性页里配置的账户:实际生效还要看权限、SPN 与委派配置,判断依据应是进程令牌
  • 域账户口令过期后服务静默启动失败:事件日志报 1069,应改用组托管服务账户避免口令生命周期问题

数据来源与参考

  • Microsoft Learn:sc qc
  • Microsoft Learn:服务账户与权限

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌