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 和 |
SANDBOX_INERT0x2 |
如果使用這個值,系統不會檢查 AppLocker 規則,或套用 軟體限制原則。 針對 AppLocker,此旗標會停用所有四個規則集合的檢查:可執行檔、Windows Installer、腳本和 DLL。 在安裝期間建立必須執行擷取 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,請使用 GetTokenInformation 函式搭配 TokenUser 和 TokenGroups 旗標。 函式會忽略陣列中未在現有令牌中找到的任何SID。
函式會忽略
如果未停用任何 SID,則可以 NULL 此參數。
[in] DeletePrivilegeCount
指定 PrivilegesToDelete 陣列中的項目數目。
[in, optional] PrivilegesToDelete
LUID_AND_ATTRIBUTES 結構的陣列指標,指定要在受限制令牌中刪除的許可權。
GetTokenInformation 函式可以搭配 TokenPrivileges 旗標使用,以擷取現有令牌所持有的許可權。 函式會忽略陣列中未由現有令牌持有的任何許可權。
函式會忽略 屬性LUID_AND_ATTRIBUTES 結構的成員。
如果您不想刪除任何許可權,這個參數可以 NULL。
如果呼叫程式在此陣列中傳遞太多許可權,CreateRestrictedToken 會傳回 ERROR_INVALID_PARAMETER。
[in] RestrictedSidCount
指定 SidsToRestrict 陣列中的項目數。
[in, optional] SidsToRestrict
SID_AND_ATTRIBUTES 結構的陣列指標,指定限制新令牌的SID清單。 如果現有的令牌是受限制的令牌,新令牌的限制 SID 清單就是這個陣列的交集,以及限制現有令牌的 SID 清單。 不會執行任何檢查,以移除放置在 SidsToRestrict 參數上的重複 SID。 重複的 SID 可讓受限制的令牌在限制 SID 清單中有多餘的資訊。
屬性SID_AND_ATTRIBUTES 結構的成員必須是零。 限制 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 |