dsWriteAccountSpnA 函数 (ntdsapi.h)

DsWriteAccountSpn 函数将服务主体名称数组 (SPN) 写入Active Directory 域服务中指定用户或计算机帐户对象的 servicePrincipalName 属性。 函数可以注册或取消注册 SPN。

语法

NTDSAPI DWORD DsWriteAccountSpnA(
  [in] HANDLE          hDS,
  [in] DS_SPN_WRITE_OP Operation,
  [in] LPCSTR          pszAccount,
  [in] DWORD           cSpn,
  [in] LPCSTR          *rpszSpn
);

参数

[in] hDS

包含从 DSBind 或 DSBindWithCred 函数获取的目录服务句柄。

[in] Operation

包含指定 DsWriteAccountSpn 将执行的操作的DS_SPN_WRITE_OP值之一。

[in] pszAccount

指向以 null 结尾的常量字符串的指针,该字符串指定Active Directory 域服务中用户或计算机对象的可分辨名称。 调用方必须对此对象的 servicePrincipalName 属性具有写入访问权限。

[in] cSpn

指定 rpszSpn 中的 SPN 数。 如果此值为零,并且 Operation 包含 DS_SPN_REPLACE_SPN_OP,则函数将从指定帐户的 servicePrincipalName 属性中删除所有值。

[in] rpszSpn

指向以 null 结尾的常量字符串数组的指针,这些字符串指定要在 pszAccount 参数标识的帐户中添加或删除 SPN。 DsGetSpn 函数用于为服务编写 SPN。

返回值

如果成功 则返回ERROR_SUCCESS,如果失败,则返回 Win32、RPC 或目录服务错误。

注解

DsWriteAccountSpn 函数为服务的一个或多个实例注册 SPN。 客户端将 SPN 与受信任的身份验证服务结合使用,对服务进行身份验证。 为了防止应用程序或服务欺诈性地注册标识其他服务的 SPN 的安全攻击,在大多数情况下,用户和计算机帐户上的默认 DACL 仅允许域管理员注册 SPN。

此规则的一个例外是,在 LocalSystem 帐户下运行的服务可以调用 DsWriteAccountSpn 来注册“ServiceClass/Host:Port”形式的简单 SPN,前提是 SPN 中指定的主机是运行该服务的计算机的 DNS 或 NetBIOS 名称。

另一个例外是,计算机帐户上的默认 DACL 允许调用方在自身上注册 SPN,但受某些约束。 例如,计算机帐户可以具有相对于其计算机名称的 SPN,其格式为“host/<computername>”。 由于 computername 包含在 SPN 中,因此允许使用 SPN。

如果将 DSA 配置为允许写入任何 SPN,则上述规则均不适用。 但是,这会降低安全性,因此不建议这样做。

传递给 DsWriteAccountSpn 的 SPN 实际上会添加到 pszAccount 中计算机对象的 Service-Principal-Name 属性中。 此调用使用 RPC 对存储帐户对象的域控制器进行,以便它可以安全地对帐户上允许的 SPN 强制实施策略。 不允许使用 LDAP 直接写入 SPN 属性;所有写入都必须通过此 RPC 调用。 允许使用 LDAP 进行读取。

设置 SPN 所需的权限

若要在帐户上写入任意 SPN,编写器需要“写入 ServicePrincipalName”权限,默认情况下,该权限不会授予创建帐户的人员。 此人具有“写入验证 SPN”权限, (仅存在于) 的计算机帐户上。

下面是每个用户对计算机帐户的权限摘要:

用户类型 权限
创建帐户的人员 写入验证的 SPN
Account Operators 写入 SPN 和写入已验证的 SPN
经过身份验证的用户
(自) 写入验证的 SPN
 

在用户帐户上,没有“已验证的 SPN”属性或“写入 SPN”权限。 相反,“写入公共信息”属性集授予创建任意 SPN 的能力。

注意

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

要求

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

另请参阅

DS_SPN_WRITE_OP

域控制器和复制管理功能

DsBind

DsBindWithCred

DsGetSpn