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常式可用來讓執行緒模擬使用者。

如需安全性和存取控制的詳細資訊,請參閱Microsoft Windows SDK中有關這些主題的檔。

規格需求

   
最低支援的用戶端 可在 Windows XP 和更新版本的 Windows 作業系統中使用。
目標平臺 環球
標頭 ntifs.h (包含 Ntifs.h)
程式庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport) PowerIrpDDis (wdm)

另請參閱

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx