共用方式為


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 值,如下所示:

傳回碼 描述
STATUS_ACCESS_DENIED
因為作業限制,所以無法模擬用戶端。
STATUS_NO_MEMORY
記憶體不足,無法完成作業。

言論

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)

另請參閱

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx