服务如何组合其 SNS

服务可以使用两个函数来组合其 SPN:DsGetSpn 是用于组合 SPN 的常规用途函数,DsServerRegisterSpn 是用于为基于主机的服务编写和注册简单 SPN 的专用函数。

服务安装程序通常使用 DsGetSpn 函数来编写 SPN,然后使用 DsWriteAccountSpn 函数在服务的登录帐户上注册该函数。 DsGetSpn 可执行以下功能。

  • 使用基于主机的服务的“<服务类>/<主机>”格式创建简单的 SPN。
  • 创建一个复杂的 SPN,其中包括副本 (replica)ble 服务使用的“服务名称>”<组件或用于区分单个主机上服务多个实例的“端口>”<组件。
  • 默认情况下,创建一个 SPN,其中“<host>”组件设置为指定主机的名称或本地计算机的名称。
  • 为将在整个林中的多个主机上运行的多个服务实例创建 SPN 数组。 每个 SPN 指定服务实例的主机名称。
  • 为将在同一主机上运行的多个服务实例创建 SPN 数组。 每个 SPN 指定主机的名称和服务实例的端口号。

必须通过调用 DsFreeSpnArray 函数释放 DsGetSpn 返回的名称数组。

请注意,DsGetSpn、DsWriteAccountSpnDsServerRegisterSpn 函数不会验证 SPN 是否是唯一的。 由于如果客户端提供不唯一的 SPN,则相互身份验证失败,因此在注册 SPN 之前验证唯一性。 为此,请在全局目录(GC) 中搜索与 SPN 匹配的 servicePrincipalName 属性。 有关搜索 GC 的详细信息,请参阅 “搜索全局目录”。