我在一台服务器 (A) 上运行一项服务,该服务传统上在本地系统帐户下运行。现在 SQL Server 已从服务器 A 移至新服务器 B。
我尝试将服务器 a [domain\servera$] 的计算机帐户添加到服务器 B 上的 SQL 服务器,并授予其可能需要的所有权限 (sa),但服务仍然无法连接。
我当时在服务日志中发现的错误如下
enbase
ODBC database error:
Connect()
szSqlState = 28000
pfNativeError = 18456
szErrorMsg = [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
pcbErrorMsg = 100
LoginId = !!UnknownUser!!
ODBCRowNumber = 0
SSrvrLine = 0
SSrvrColumn = 0
SSrvrMsgState = 0
SSrvrSeverity = 0
SSrvrProcname =
SSrvrSrvname =
我不知道为什么该服务认为它正在以匿名登录身份登录。
有任何想法吗?
更新:我编写了一个在本地系统下运行的测试服务,它在 SQL 事件探查器中引发了此消息:
“用户‘NT AUTHORITY\ANONYMOUS LOGON’登录失败。原因:基于令牌的服务器访问验证因基础结构错误而失败。检查先前的错误。”
更新:我现在认为这是一个 Kerberos 问题。Kerberos 不起作用,因为 SQL 运行的域帐户无法注册其服务主体名称(setspn -L 显示了很多),因此无法使用 Kerberos 并使用 NTLM,而出于某种原因,NTLM 对 domain\computer$ 不起作用。
最后,ERRORLOG 显示 SQL Server 记录了无法为 SQL Server 服务注册 SPN 的错误。我认为这证实了我的理论。
更新:我认为解决方案是授予 SQL Server 正在运行的域帐户在 AD 中的信任委派,以便它可以在 SQL Server 启动时注册其 SPN。
答案1
用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败
您没有使用机器帐户进行连接...
登录 ID = !!未知用户!!
您没有提供正确的凭证。
NT Authority\Network Service
我希望您知道外部所称的 DOMAIN\MACHINE$ 在内部就是帐户:)
答案2
我相信通过为 SQL Server 运行的帐户创建 SPN 可以解决此问题。如果 SPN 存在,则客户端可以使用 Kerberos 进行身份验证,并以客户端计算机的域帐户 domain\clientcomputer$ 身份登录,该帐户可以被授予对 SQL Server 的适当访问权限。