在域帐户下运行的SQL Server无法注册其SPN

我正在尝试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:

  • 适用于:后代计算机对象
  • validation写入服务主体名称:允许
  • 读取servicePrincipalName:允许
  • 写入servicePrincipalName:允许

我已将此复制到所有域控制器,并使用有效权限选项卡和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
      • 应用于:后代用户对象
      • 读取servicePrincipalName:允许
      • 写入servicePrincipalName:允许

现在,当我启动我的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 servicePrincipalNameWrite 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