共用方式為


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 值,例如:

傳回碼 Description
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
目標平台 Universal
標頭 ntifs.h (包含 Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport) PowerIrpDDis (wdm)

另請參閱

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx