PsImpersonateClient 函式 (ntifs.h)
PsImpersonateClient 例程會導致伺服器線程模擬用戶端。
語法
NTSTATUS PsImpersonateClient(
[in, out] PETHREAD Thread,
[in] PACCESS_TOKEN Token,
[in] BOOLEAN CopyOnOpen,
[in] BOOLEAN EffectiveOnly,
[in] SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);
參數
[in, out] Thread
模擬用戶端之伺服器線程的指標。
[in] Token
要指派為模擬令牌之令牌的指標。 此令牌可以是主要令牌或模擬令牌。 設定為 NULL 結束模擬。
[in] CopyOnOpen
指定是否可以直接開啟令牌。 設定為 TRUE,以指定無法直接開啟令牌。 在此情況下,令牌必須重複,並改用重複的令牌。 設定為 FALSE,以允許直接開啟令牌。
[in] EffectiveOnly
設定為 FALSE,以允許伺服器啟用用戶端安全性內容中目前停用的群組和許可權,否則 為 TRUE。
[in] ImpersonationLevel
SECURITY_IMPERSONATION_LEVEL 值,指定伺服器要存取令牌的模擬層級。
傳回值
PsImpersonateClient 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,如下所示:
傳回碼 | 描述 |
---|---|
|
因為作業限制,所以無法模擬用戶端。 |
|
記憶體不足,無法完成作業。 |
言論
PsImpersonateClient 會導致指定的伺服器線程模擬指定的用戶端。
呼叫 PsImpersonateClient 時,伺服器線程可能已經模擬用戶端。 如果是這種情況,表示該用戶端的令牌參考計數會遞減。 若要保留此令牌以供日後使用,驅動程式應該先呼叫 PsReferenceImpersonationToken,再呼叫 PsImpersonateClient 並儲存 psReferenceImpersonationToken 所傳回的指標。
若要結束新的模擬,並將伺服器線程傳回先前的模擬,請再次呼叫 PsImpersonateClient,並傳遞 Token 參數的已儲存指標。 若要結束所有模擬,請呼叫 PsRevertToSelf 例程。
否則,若要結束模擬,並將伺服器線程傳回其原始安全性內容(也就是其主要令牌所代表的模擬內容),請再次呼叫 PsImpersonateClient,並傳遞 Token 參數的 NULL 指標。
PsImpersonateClient 例程如果線程已經模擬或有作業限制,就無法成功將伺服器線程傳回先前的模擬。
例程會檢查各種條件,包括下列各項,以確保客戶端模擬是否可實際發生:
- 呼叫端傳遞的令牌沒有匿名驗證標識碼
- 從伺服器線程和指定權杖參考的行程權杖具有相等的安全性識別碼 (SID)
- 兩個令牌都不受限制
如果不符合任何條件,則例程會建立傳遞至呼叫的現有令牌複本,並將新複製的令牌指派為模擬令牌,但具有有限的安全性模擬層級:也就是說,伺服器線程只能取得客戶端的相關信息。 如果無法複製令牌,則例程會因為NTSTATUS程式代碼而失敗。
提高不受信任用戶線程的許可權狀態非常不安全(例如,採用使用者的線程並模擬 LocalSystem)。 如果未受信任的用戶線程已提高其許可權,則用戶可以在提升線程令牌之後擷取線程令牌,並顛覆整個系統的安全性。
如果需要較高的許可權狀態,工作應該分派至工作佇列,讓系統背景工作線程可以安全地處理工作。 如此一來,就不需要模擬。
SeImpersonateClientEx 例程可用來讓線程模擬使用者。
如需安全性和訪問控制的詳細資訊,請參閱 適用於驅動程式開發人員的 Windows 安全性模型,以及 Windows SDK 中這些主題的檔。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP |
目標平臺 | 普遍 |
標頭 | ntifs.h (include Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport),PowerIrpDDis(wdm) |