DsGetSpnA 函数 (ntdsapi.h)

DsGetSpn 函数构造一个或多个服务主体名称(SPN)的数组。 数组中的每个名称标识服务的实例。 可以使用 DsWriteAccountSpn 函数向目录服务(DS)注册这些 SPN。

语法

NTDSAPI DWORD DsGetSpnA(
  [in]           DS_SPN_NAME_TYPE ServiceType,
  [in]           LPCSTR           ServiceClass,
  [in, optional] LPCSTR           ServiceName,
  [in]           USHORT           InstancePort,
  [in]           USHORT           cInstanceNames,
  [in, optional] LPCSTR           *pInstanceNames,
  [in, optional] const USHORT     *pInstancePorts,
  [out]          DWORD            *pcSpn,
  [out]          LPSTR            **prpszSpn
);

参数

[in] ServiceType

标识要撰写的 SPN 的格式。 ServiceType 参数可以具有以下值之一。

DS_SPN_DNS_HOST、DS_SPN_DN_HOST、DS_SPN_NB_HOST

SPN 采用以下格式。

ServiceClass/ InstanceName: InstancePort

ServiceName 参数必须 NULL。 这是基于主机的服务的 SPN 格式,它提供通过主机标识的服务。 InstancePort 组件是可选的。

DS_SPN_DOMAIN,DS_SPN_NB_DOMAIN

SPN 采用以下格式。

ServiceClass/ InstanceName: InstancePort/ ServiceName

ServiceName 参数必须是域的 DNS 名称或 DN。 此格式用于向指定域提供服务的可复制服务。

DS_SPN_SERVICE

SPN 采用以下格式。

ServiceClass/ InstanceName: InstancePort/ ServiceName

ServiceName 参数必须是标识服务实例的规范 DN 或 DNS 名称。 例如,它可以是 SRV 记录的 DNS 名称,也可以是此服务实例的服务连接点的可分辨名称。

[in] ServiceClass

指向指定服务类的常量 null 终止字符串的指针;例如 http。 通常,这可以是服务唯一的任何字符串。

[in, optional] ServiceName

指向常量以 null 结尾的字符串的指针,该字符串指定服务的 DNS 名称或可分辨名称(DN)。 基于主机的服务不需要 ServiceName。 有关详细信息,请参阅 ServiceType 参数的说明,了解 ServiceName的可能值。

[in] InstancePort

指定服务实例的端口号。 如果此值为零,SPN 不包括端口号。

[in] cInstanceNames

指定 pInstanceNamespInstancePorts 数组中的元素数。 如果此值不为零,pInstanceNames 必须指向 cInstanceNames 字符串的数组,pInstancePorts 可以是 NULL,也可以是指向 cInstanceNames 端口号数组的指针。 如果此值为零,DsGetSpn 仅返回 prpszSpn 数组中的一个 SPN,并忽略 pInstanceNamespInstancePorts

[in, optional] pInstanceNames

指向指定额外实例名称(不用于主机名)的以 null 结尾的字符串数组的指针。 如果 cInstanceNames 为零,则忽略此参数。 在这种情况下,如果指定 DS_SPN_NB_HOSTDS_SPN_NB_DOMAIN,SPN 的 InstanceName 组件默认为本地计算机的完全限定 DNS 名称或 NetBIOS 名称。

[in, optional] pInstancePorts

指向额外实例端口数组的指针。 如果此值为非NULL,则必须指向 cInstanceNames 端口号的数组。 如果此值 NULL,则 SPN 不包括端口号。 如果 cInstanceNames 为零,则忽略此参数。

[out] pcSpn

指向接收 prpszSpn中包含的 SPN 数的变量的指针。

[out] prpszSpn

指向接收指向 SPN 数组的指针的变量的指针。 必须使用 DsFreeSpnArray释放此数组。

返回值

如果函数返回 SPN 数组,则返回值 ERROR_SUCCESS

如果函数失败,则返回值可以是以下错误代码之一。

言论

为在多台主计算机上运行的复制服务的多个实例创建 SPN

  1. cInstanceNames 设置为实例数。
  2. pInstanceNames 数组中指定主机的名称。

为在同一台主计算机上运行的多个服务实例创建 SPN

  1. cInstanceNames 设置为实例数。
  2. pInstanceNames 数组中的每个条目设置为主计算机的 DNS 名称。
  3. 使用 pInstancePorts 参数为每个实例指定唯一端口号数组,以消除 SPN 的歧义。
字符串参数不能包含正斜杠(/),用于分隔 SPN 的组件。

具有适当权限的应用程序(通常是域管理员)可以调用 DsWriteAccountSpn 函数,在运行服务的用户或计算机帐户上注册一个或多个 SPN。 然后,客户端可以使用 SPN 对服务进行身份验证。

注意

ntdsapi.h 标头将 DsGetSpn 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows Vista
支持的最低服务器 Windows Server 2008
目标平台 窗户
标头 ntdsapi.h
Ntdsapi.lib
DLL Ntdsapi.dll

另请参阅

域控制器和复制管理功能

DsFreeSpnArray

DsWriteAccountSpn