当我尝试运行涉及链接服务器的简单查询时,它失败了:
SELECT * FROM [server2].[DWH].[dbo].[SomeTable]
Msg 18456, Level 14, State 1, Line 1
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
但是,还有另一个用户可以毫无问题地运行此查询。
我们公司没有 SQL Server DBA,收购后我们从另一家公司继承了一些 SQL Server。
我是一名尝试运行一些查询的开发人员,我很难弄清楚如何正确配置访问。我真的不知道在哪里看,所以我会尽我所能解释当前的设置。
有Server1:
Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
Aug 15 2017 10:23:29
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
有Server2:
Microsoft SQL Server 2016 (SP1-CU15-GDR) (KB4505221) - 13.0.4604.0 (X64)
Jun 15 2019 07:56:34
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)
我们公司有一个域MAIN_DOMAIN
,我以MAIN_DOMAIN\my.name
. 当我在笔记本电脑上运行 SSMS 时,我可以同时连接到两者Server1
并Server2
使用 Windows 身份验证。
据我了解,我在两个 SQL Server 中的登录几乎都具有所有权限:
服务器1:
CREATE LOGIN [MAIN_DOMAIN\my.name] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
ALTER SERVER ROLE [sysadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [serveradmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [setupadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [processadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [diskadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
服务器2:
CREATE LOGIN [MAIN_DOMAIN\my.name] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
ALTER SERVER ROLE [sysadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [serveradmin] ADD MEMBER [MAIN_DOMAIN\my.name]
ALTER SERVER ROLE [setupadmin] ADD MEMBER [MAIN_DOMAIN\my.name]
Server1 和 Server2 本身不在MAIN_DOMAIN
,它们在other_domain.com
other_domain\my.name
我可以使用与我的主域用户密码不同的用户远程桌面到他们两个。
这是链接服务器的配置方式Server1
:
EXEC master.dbo.sp_addlinkedserver @server = N'server2', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'server2',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'rpc', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'rpc out', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'collation name', @optvalue=null
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'server2', @optname=N'remote proc transaction promotion', @optvalue=N'true'
在Server1
MSSQLSERVER 服务 (sqlservr.exe) 上运行在名为NT Service\MSSQLSERVER
.
在Server2
MSSQLSERVER 服务 (sqlservr.exe) 上运行在名为NT Service\MSSQLSERVER
.
这是 的输出setspn -l
。server1
当我在or上运行它时,我得到相同的输出server2
:
C:\Windows\system32>setspn -l SERVER2
Registered ServicePrincipalNames for CN=SERVER2,OU=Azure Resources,OU=Corporate,DC=other_domain,DC=com,DC=au:
MSSQLSvc/SERVER2.other_domain.com.au:1433
MSSQLSvc/SERVER2.other_domain.com.au
WSMAN/SERVER2
WSMAN/SERVER2.other_domain.com.au
TERMSRV/SERVER2
TERMSRV/SERVER2.other_domain.com.au
RestrictedKrbHost/SERVER2
HOST/SERVER2
RestrictedKrbHost/SERVER2.other_domain.com.au
HOST/SERVER2.other_domain.com.au
C:\Windows\system32>setspn -l SERVER1
Registered ServicePrincipalNames for CN=SERVER1,OU=Azure Resources,OU=Corporate,DC=other_domain,DC=com,DC=au:
MSSQLSvc/SERVER1.other_domain.com.au:1433
MSSQLSvc/SERVER1.other_domain.com.au
Microsoft Virtual Console Service/SERVER1.other_domain.com.au
Microsoft Virtual Console Service/SERVER1
Microsoft Virtual System Migration Service/SERVER1.other_domain.com.au
Microsoft Virtual System Migration Service/SERVER1
Hyper-V Replica Service/SERVER1.other_domain.com.au
Hyper-V Replica Service/SERVER1
WSMAN/SERVER1
WSMAN/SERVER1.other_domain.com.au
TERMSRV/SERVER1.other_domain.com.au
TERMSRV/SERVER1
RestrictedKrbHost/SERVER1
HOST/SERVER1
RestrictedKrbHost/SERVER1.other_domain.com.au
HOST/SERVER1.other_domain.com.au
不幸的是,我不明白这意味着什么。我在这里唯一能理解的是MAIN_DOMAIN
在任何地方都没有提到。
其他用户可以毫无问题地运行涉及链接服务器的查询。
他使用远程桌面登录Server1
并使用other_domain\his.name
. 他在上面运行 SSMSServer1
并使用 Windows 身份验证连接到 SQL Server。
他的登录Server1
也具有所有权限:
CREATE LOGIN [other_domain\his.name] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
ALTER SERVER ROLE [sysadmin] ADD MEMBER [other_domain\his.name]
ALTER SERVER ROLE [serveradmin] ADD MEMBER [other_domain\his.name]
我需要配置什么,以便在我使用笔记本电脑连接到 SQL Server 时运行涉及链接服务器的查询MAIN_DOMAIN\my.name
?
您必须验证这些要求:
抱歉,没有一个简单的答案,要设置所有这些内容,您必须拥有域管理员权限(甚至是林管理员)
您可以使用此 cmd 自行验证 spn 实例:
查看有关 kerberos 的以下信息:
如何停止在链接服务器中使用 sql server 登录凭据?