CreateRestrictedToken 函数 (securitybaseapi.h)
CreateRestrictedToken 函数创建一个新的 访问令牌,该令牌是现有访问令牌的受限版本。 受限令牌可以禁用 安全标识符(SID)、已删除的权限和限制 SID 的列表。 有关详细信息,请参阅 受限令牌。
语法
BOOL CreateRestrictedToken(
[in] HANDLE ExistingTokenHandle,
[in] DWORD Flags,
[in] DWORD DisableSidCount,
[in, optional] PSID_AND_ATTRIBUTES SidsToDisable,
[in] DWORD DeletePrivilegeCount,
[in, optional] PLUID_AND_ATTRIBUTES PrivilegesToDelete,
[in] DWORD RestrictedSidCount,
[in, optional] PSID_AND_ATTRIBUTES SidsToRestrict,
[out] PHANDLE NewTokenHandle
);
参数
[in] ExistingTokenHandle
主 或 模拟令牌的句柄。 令牌也可以是受限令牌。 句柄必须具有对令牌 TOKEN_DUPLICATE 访问权限。
[in] Flags
指定其他特权选项。 此参数可以是零,也可以是以下值的组合。
价值 | 意义 |
---|---|
DISABLE_MAX_PRIVILEGE0x1 |
禁用新令牌中的所有特权,SeChangeNotifyPrivilege 特权除外。 如果指定了此值,则忽略 DeletePrivilegeCount 和 PrivilegesToDelete 参数。 |
SANDBOX_INERT0x2 |
如果使用此值,则系统不会检查 appLocker 规则 在安装过程中创建必须运行提取 DLL 的安装程序时,请使用 SaferComputeTokenFromLevel 函数中的标志 SAFER_TOKEN_MAKE_INERT。 可以使用 GetTokenInformation查询令牌是否存在此标志。 Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 安装了KB2532445的系统上,调用方必须以 LocalSystem 或 TrustedInstaller 或系统身份运行,否则系统将忽略此标志。 有关详细信息,请参阅 可以在运行 Windows 7 或 Windows Server 2008 R2的计算机上使用 Office 宏来规避 AppLocker 规则。 Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:不支持 AppLocker。 AppLocker 是在 Windows 7 和 Windows Server 2008 R2 中引入的。 |
LUA_TOKEN0x4 |
新令牌是 LUA 令牌。 Windows Server 2003 和 Windows XP: 不支持此值。 |
WRITE_RESTRICTED0x8 |
新令牌包含限制仅在评估写入访问时考虑的 SID。 WINDOWS XP SP2 及更高版本: 此常量的值 0x4 。 若要使应用程序与 Windows XP 与 SP2 及更高版本的操作系统兼容,应用程序应通过调用 GetVersionEx 函数来查询操作系统,以确定应使用哪个值。Windows Server 2003 和 Windows XP SP1 及更早版本:不支持 此值。 |
[in] DisableSidCount
指定 SidsToDisable 数组中的条目数。
[in, optional] SidsToDisable
指向 SID_AND_ATTRIBUTES 结构的数组的指针,该数组指定受限令牌中的“仅拒绝”SID。 系统使用仅拒绝 SID 拒绝访问安全对象。 缺少仅拒绝 SID 不允许访问。
禁用 SID 会打开 SE_GROUP_USE_FOR_DENY_ONLY,并关闭 SE_GROUP_ENABLED 和 SE_GROUP_ENABLED_BY_DEFAULT。 将忽略所有其他属性。
仅拒绝属性适用于现有令牌的 SID 的任何组合,包括具有SE_GROUP_MANDATORY属性的用户 SID 和组 SID。 若要获取与现有令牌关联的 SID,请使用具有 TokenUser 和 TokenGroups 标志的 GetTokenInformation 函数。 该函数忽略在现有令牌中未找到的数组中的任何 SID。
该函数忽略
如果未禁用任何 SID,则可以 NULL 此参数。
[in] DeletePrivilegeCount
指定 PrivilegesToDelete 数组中的条目数。
[in, optional] PrivilegesToDelete
指向 LUID_AND_ATTRIBUTES 结构的数组的指针,该数组指定要在受限令牌中删除的权限。
GetTokenInformation 函数可与 TokenPrivileges 标志一起使用,以检索现有令牌持有的特权。 该函数忽略数组中未由现有令牌持有的任何特权。
该函数忽略
如果不想删除任何特权,则可以 NULL 此参数。
如果调用程序在此数组中传递了过多的权限,CreateRestrictedToken 返回 ERROR_INVALID_PARAMETER。
[in] RestrictedSidCount
指定 SidsToRestrict 数组中的条目数。
[in, optional] SidsToRestrict
指向 SID_AND_ATTRIBUTES 结构的数组的指针,该数组指定了限制新令牌的 SID 的列表。 如果现有令牌是受限令牌,则限制新令牌的 SID 列表是此数组的交集,以及限制现有令牌的 SID 的列表。 不执行检查以删除放置在 SidsToRestrict 参数上的重复 SID。 重复的 SID 允许受限令牌在限制 SID 列表中具有冗余信息。
如果不想指定任何限制 SID,则可以 NULL 此参数。
[out] NewTokenHandle
指向接收新受限令牌句柄的变量的指针。 此句柄具有与 ExistingTokenHandle相同的访问权限。 新令牌的类型与现有令牌相同,主 或 模拟。 NewTokenHandle 中返回的句柄可以重复。
返回值
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
言论
CreateRestrictedToken 函数可以通过以下方式限制令牌:
- 将“仅拒绝”属性应用于令牌中的 SID,以便它们不能用于访问受保护的对象。 有关仅拒绝属性的详细信息,请参阅访问令牌中的
SID 属性。 - 从令牌中删除 特权。
- 指定限制 SID 的列表,系统在检查令牌对安全对象的访问权限时使用。 系统执行两次访问检查:一个使用令牌已启用的 SID,另一个使用限制 SID 的列表。 仅当两个访问检查都允许请求的访问权限时,才授予访问权限。
可以在 CreateProcessAsUser 函数中使用受限令牌来创建具有受限访问权限和权限的进程。 如果进程调用 CreateProcessAsUser 使用其自己的令牌的受限版本,则调用进程无需具有 SE_ASSIGNPRIMARYTOKEN_NAME 特权。
可以在 ImpersonateLoggedOnUser 函数中使用受限令牌。
警告
使用受限令牌的应用程序应在默认桌面以外的桌面上运行受限制的应用程序。 若要防止受限制的应用程序攻击(使用 SendMessage 或 PostMessage)攻击默认桌面上的不受限制的应用程序,则需要这样做。 如有必要,请为应用程序在桌面之间切换。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [仅限桌面应用] |
支持的最低服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | securitybaseapi.h (包括 Windows.h) |
库 | Advapi32.lib |
DLL | Advapi32.dll |