Spring Boot作为Windows服务运行时提示DOMAIN\MACHINENAME$登录MSSQL失败
问题根因
核心原因是你开启了MSSQL的Windows集成认证,服务运行时使用的身份没有数据库访问权限:
- 连接串中
integratedSecurity=true参数代表JDBC驱动会直接使用当前Java进程对应的Windows系统身份访问数据库,不会读取任何配置里的SQL账号密码。 - 命令行直接启动jar时,进程继承的是你当前登录的域用户身份,该账号本身有MSSQL访问权限,所以运行正常。
- Winsw注册的Windows服务默认使用「本地系统账户」运行,域环境下该账户访问网络资源时会被识别为
域名\机器名$格式的计算机账户——也就是你报错里提示的登录用户,这个账户默认没有配置MSSQL的访问权限,所以抛出登录失败错误。
解决方法
按优先级从高到低选以下任意一种方案即可:
- 方案1:修改服务运行身份(推荐)
打开服务管理器(运行services.msc),找到对应Spring Boot服务,右键进入「属性-登录」页,选择「此账户」,填入你平时命令行运行jar时使用的、有MSSQL访问权限的域账号和密码,保存后重启服务即可。
如果是通过Winsw的XML配置文件定义服务,可以直接在配置中添加服务账号配置,避免手动修改:<serviceaccount> <domain>你的域名称</domain> <user>有权限的域账号用户名</user> <password>账号对应密码</password> <allowservicelogon>true</allowservicelogon> </serviceaccount> - 方案2:给计算机账户开数据库权限
登录MSSQL管理控制台,在安全-登录名中添加DOMAINNAME\MACHINENAME$这个计算机账户,给它分配目标数据库的对应访问权限即可。该方案权限粒度较粗,不推荐生产环境使用。 - 方案3:改用SQL账号认证
关闭集成认证,改用MSSQL的SQL账号密码模式登录,修改application.properties配置如下:
注意提前确认MSSQL服务端已开启「SQL Server和Windows身份认证混合模式」,否则会登录失败。spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource.url=jdbc:sqlserver://DB-SERVER:1433;databaseName=db_name; spring.datasource.username=你的SQL认证账号 spring.datasource.password=账号对应密码
内容的提问来源于stack exchange,提问作者KKFF
相关产品推荐
相关产品推荐

