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

包含从 DSBindDSBindWithCred 函数获取的目录服务句柄。

[in] Operation

包含一个 DS_SPN_WRITE_OP 值,该值指定 DsWriteAccountSpn 将执行的操作。

[in] pszAccount

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

[in] cSpn

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

[in] rpszSpn

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

返回值

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

注解

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

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

另一个例外是,计算机帐户上的默认 DACL 允许调用方自行注册 SPN,但受某些约束的约束。 例如,计算机帐户可以具有与其计算机名称(格式为“host/<computername>”)的 SPN。 由于计算机名称包含在 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