我正在尝试configurationSQL Server的全新安装以在域帐户下运行。 但是,在尝试使用另一个域帐户连接到服务器时出现间歇性错误,而且我仍然看到The SQL Server Network Interface library could not register the Service Principal Name在拖曳ERRORLOG文件时The SQL Server Network Interface library could not register the Service Principal Name 。
我已经将我的服务帐户(不是托pipe服务帐户,只是普通用户帐户)添加到AD组(例如SQL Servers ),并且已经将ACE添加到我的域“ Computers容器的ACL中,对于此组,select:
我已将此复制到所有域控制器,并使用有效权限选项卡和dsacls CN=SERVER01,CN=Computers,DC=fabrikam,DC=local ,后者确认新的ACE到特定的计算机对象的inheritance其中包括:
Allow FABRIKAM\SQL Servers SPECIAL ACCESS for Validated write to service principal name <Inherited from parent> WRITE SELF Allow FABRIKAM\SQL Servers SPECIAL ACCESS for Validated write to service principal name <Inherited from parent> WRITE SELF WRITE PROPERTY READ PROPERTY
但是,当我重新启动SQL Server服务时,仍然看不到could not register the Service Principal Name消息。 我也重新启动了服务器,结果相同。
我已经使用Sysinternals进程资源pipe理器来检查正在运行的sqlservr.exe ; 那里的安全选项卡清楚地显示了正确的服务用户及其SQL Servers组的成员身份。
我知道我可以用setspn -A手动添加SPN,但这不是真正的重点。
还必须做些什么来确保服务帐户(以及我在SQL Servers组中放置的任何未来帐户)能够自动注册其自己的SPN而无需手动干预?
AND / OR
我怎样才能进一步诊断哪些特权/权限在这里丢失?
我find了。
我手动将SPN注册到服务帐户,然后使用ADSIEdit检查AD,结果发现手动注册的SPN未存储在计算机帐户的servicePrincipalName字段中,而是存储在特定用户帐户的servicePrincipalName字段中。
因此,我没有授予我的SQL Servers组权限来注册他们自己的SPN,而是(无意)授予他们更改在该计算机上以本地系统/networking服务帐户运行的服务所注册的SPN的权利。
我现在已经从Computers容器中删除了新的ACE,而是创build了一个新的SQL Servers组织单位。 我为此OU添加了一个用于SELF的ACE,并将其限制为适用于后代用户 :
SQL Servers OU ACL
SELF
现在,当我启动我的SQL Server实例时,我看到预期The SQL Server Network Interface library successfully registered the Service Principal Name ,Kerberos现在用于我的远程连接。
(现在要更新我们的内部stream程文档,所以它需要在新OU下创build新的SQL Server服务帐户,而不是添加到组中)
编辑:请注意,域pipe理员也可以使用setspn.exe手动将SPN注册到域帐户。
setspn -S MSSQLSvc/myhost.redmond.microsoft.com:1433 DOMAIN\User setspn -S MSSQLSvc/myhost.redmond.microsoft.com DOMAIN\User
注册Kerberos连接的服务主体名称(TechNet) 。
编辑2:如果Read servicePrincipalName和Write servicePrincipalName属性在ACE列表中不可见,请转到对象的“ 属性”对话框的“ 属性编辑器”选项卡,单击“ 筛选”button并确保以下内容:
(其他组合可能工作,但是这对我来说是什么)
你没有说你正在运行的SQL Server的版本,也没有服务帐户的权限(除了它不是一个托pipe服务帐户和写入SPN),但从您提供的信息,我相信该帐户doesn没有权力将自己注册为SPN。 尽pipe如此,你已经明确地授予了这一点。
显然, SQL 2012 需要 Server 2008上的虚拟帐户或托pipe服务帐户 :
当数据库引擎服务启动时,它将尝试注册服务主体名称(SPN)。 如果启动SQL Server的帐户没有在Active Directory域服务中注册SPN的权限,则此调用将失败,并且会在应用程序事件日志以及SQL Server错误日志中logging警告消息。 要注册SPN,数据库引擎必须在内置帐户下运行,例如本地系统(不推荐)或NETWORK SERVICE,或者有权注册SPN的帐户(例如域pipe理员帐户)。 当SQL Server在Windows 7或Windows Server 2008 R2操作系统上运行时,可以使用虚拟帐户或托pipe服务帐户(MSA)运行SQL Server。 虚拟账户和MSA都可以注册SPN。 如果SQL Server未在其中一个帐户下运行,则SPN在启动时未注册,并且域pipe理员必须手动注册SPN。
我希望有帮助。
如果SQL服务使用的AD帐户的名称长于20个字符,则SetSpn.exe将无法在AD中find它,而使用Kerberos进行身份validation的唯一方法是重新设置AD权限, SQL的重启。 不要试图通过缩短名称参数来欺骗SetSpn.exe -S:SetSpn.exe然后将find该帐户,但它将注册与Kerberos“不匹配”的名称
凯瑟琳Villyard
当数据库引擎服务启动时,它将尝试注册服务主体名称(SPN)。 如果启动SQL Server的帐户没有在Active Directory域服务中注册SPN的权限,则此调用将失败,并且会在应用程序事件日志以及SQL Server错误日志中logging警告消息。 要注册SPN,数据库引擎必须在内置帐户下运行,例如本地系统(不推荐)或NETWORK SERVICE,或者有权注册SPN的帐户(例如域pipe理员帐户)。 当SQL Server在Windows 7或Windows Server 2008 R2操作系统上运行时,可以使用虚拟帐户或托pipe服务帐户(MSA)运行SQL Server。 虚拟账户和MSA都可以注册SPN。 如果SQL Server未在其中一个帐户下运行,则SPN在启动时未注册,并且域pipe理员必须手动注册SPN。
所以我现在已经find了重复的SPN setspn -x
一个与服务器关联,再与域pipe理员帐户相关联。 计算机属性显示读/写SPN作为有效的权限和pipe理员帐户不显示。 尽pipe如此….我怎样才能确定哪个帐户删除相关的SPN从?
谢谢。 如果听起来很傻,请介意我的问题。
问候Rajen