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
包含一个 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,则返回 ERROR_SUCCESS RPC 或目录服务错误(如果失败)。
言论
DsWriteAccountSpn 函数为一个或多个服务实例注册 SPN。 客户端将 SPN 与受信任的身份验证服务结合使用来对服务进行身份验证。 为了防止应用程序或服务欺诈性地注册标识其他服务的 SPN 的安全攻击,用户和计算机帐户上的默认 DACL 仅允许域管理员在大多数情况下注册 SPN。
此规则的一个例外是,如果 SPN 中指定的主机是运行该服务的计算机的 DNS 或 NetBIOS 名称,则 LocalSystem 帐户下运行的服务可以调用 DsWriteAccountSpn 注册“ServiceClass/Host:Port”形式的简单 SPN。
另一个例外是计算机帐户上的默认 DACL 允许调用方自行注册 SPN,但受某些约束的约束。 例如,计算机帐户可以具有相对于其计算机名称的 SPN,其格式为“host/<computername>”。 由于计算机名包含在 SPN 中,因此允许 SPN。
如果 DSA 配置为允许写入任何 SPN,则上述规则均不适用。 但是,这样可以降低安全性,因此不建议这样做。
传递给 DsWriteAccountSpn 的 SPN 实际上会添加到 pszAccount中计算机对象的 Service-Principal-Name 属性。 此调用使用 RPC 对存储帐户对象的域控制器进行,以便它可以安全地对帐户上允许的 SPN 实施策略。 不允许使用 LDAP 直接写入 SPN 属性;所有写入都必须通过此 RPC 调用。 允许使用 LDAP 读取。
设置 SPN 所需的权限
若要在帐户上编写任意 SPN,编写器需要“写入 ServicePrincipalName”权限,默认情况下不会向创建帐户的人员授予该权限。 该人员具有“写入验证的 SPN”权限(仅在计算机帐户上显示)。
下面是计算机帐户上每个用户的权限摘要:
用户类型 | 权利 |
---|---|
创建帐户的人员 | 写入验证的 SPN |
帐户操作员 | 写入 SPN 和写入验证的 SPN |
经过身份验证的用户 | 没有 |
(自我) | 写入验证的 SPN |
在用户帐户上,没有“已验证的 SPN”属性或“写入 SPN”权限。 相反,“写入公共信息”属性集授予创建任意 SPN 的能力。
注意
ntdsapi.h 标头将 DsWriteAccountSpn 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows Vista |
支持的最低服务器 | Windows Server 2008 |
目标平台 | 窗户 |
标头 | ntdsapi.h |
库 | Ntdsapi.lib |
DLL | Ntdsapi.dll |