執行緒安全性和存取權限

Microsoft Windows 可讓您控制執行緒物件的存取。 如需安全性的詳細資訊,請參閱 存取控制模型

呼叫CreateProcessCreateProcessAsUserCreateProcessWithLogonWCreateThreadCreateRemoteThread函式時,您可以指定執行緒的安全性描述項。 如果您指定 Null,執行緒會取得預設的安全性描述元。 執行緒的預設安全性描述元中的 ACL 來自建立者的主要或模擬權杖。

若要擷取執行緒的安全性描述元,請呼叫 GetSecurityInfo 函 式。 若要變更執行緒的安全性描述元,請呼叫 SetSecurityInfo 函 式。

CreateThread函式所傳回的控制碼具有線程物件的THREAD_ALL_ACCESS存取權。 當您呼叫 GetCurrentThread 函式時,系統會傳回具有線程安全性描述項允許呼叫端之最大存取權的虛擬手寫。

執行緒物件的有效存取權限包括 標準存取權限 和某些執行緒特定的存取權限。 下表列出所有物件所使用的標準存取權限。

意義
DELETE (0x00010000L) 刪除物件的必要專案。
READ_CONTROL (0x00020000L) 需要讀取物件之安全描述元中的資訊,不包括 SACL 中的資訊。 若要讀取或寫入 SACL,您必須要求 ACCESS_SYSTEM_SECURITY 存取權限。 如需詳細資訊,請參閱 SACL 存取權限
SYNCHRONIZE (0x00100000L) 使用同步物件的權限。 這可讓執行緒等到物件處於訊號狀態為止。
WRITE_DAC (0x00040000L) 需要修改 物件之安全描述元中的 DACL。
WRITE_OWNER (0x00080000L) 變更物件之安全描述元中擁有者的必要專案。

 

下表列出執行緒特定的存取權限。

意義
SYNCHRONIZE (0x00100000L) 可讓您在任何 等候函式中使用執行緒控制碼。
THREAD_ALL_ACCESS 執行緒物件的所有可能存取權限。Windows Server 2003 和 Windows XP: windows Server 2008 和 Windows Vista 上增加 THREAD_ALL_ACCESS 旗標的值。 如果針對 Windows Server 2008 和 Windows Vista 編譯的應用程式是在 Windows Server 2003 或 Windows XP 上執行, 則THREAD_ALL_ACCESS 旗標包含不支援的存取位,且指定此旗標的函式 會失敗並ERROR_ACCESS_DENIED。 若要避免這個問題,請指定作業所需的最小存取權限集。 如果必須使用 THREAD_ALL_ACCESS ,請將 _WIN32_WINNT 設定為應用程式 (目標的最低作業系統,例如) #define _WIN32_WINNT _WIN32_WINNT_WINXP 。 如需詳細資訊,請參閱 使用 Windows 標頭
THREAD_DIRECT_IMPERSONATION (0x0200) 模擬用戶端的伺服器執行緒需要 。
THREAD_GET_CONTEXT (0x0008) 必須使用 GetThreadCoNtext讀取執行緒的內容。
THREAD_IMPERSONATE (0x0100) 需要直接使用執行緒的安全性資訊,而不需使用提供模擬服務的通訊機制來呼叫它。
THREAD_QUERY_INFORMATION (0x0040) 需要從執行緒物件讀取特定資訊,例如結束代碼 (請參閱 GetExitCodeThread) 。
THREAD_QUERY_LIMITED_INFORMATION (0x0800) 需要從執行緒物件讀取特定資訊 (請參閱 GetProcessIdOfThread) 。 具有 THREAD_QUERY_INFORMATION 存取權限的控制碼會自動授 與THREAD_QUERY_LIMITED_INFORMATIONWindows Server 2003 和 Windows XP: 不支援此存取權限。
THREAD_SET_CONTEXT (0x0010) 必須使用 SetThreadCoNtext寫入執行緒的內容。
THREAD_SET_INFORMATION (0x0020) 必須線上程物件中設定特定資訊。
THREAD_SET_LIMITED_INFORMATION (0x0400) 必須線上程物件中設定特定資訊。 具有 THREAD_SET_INFORMATION 存取權限的控制碼會自動授與 THREAD_SET_LIMITED_INFORMATIONWindows Server 2003 和 Windows XP: 不支援此存取權限。
THREAD_SET_THREAD_TOKEN (0x0080) 使用 SetThreadToken為執行緒設定模擬權杖的必要專案。
THREAD_SUSPEND_RESUME (0x0002) 需要暫停或繼續執行緒 (請參閱 SuspendThreadResumeThread) 。
THREAD_TERMINATE (0x0001) 必須使用 TerminateThread終止執行緒。

 

如果您想要讀取或寫入物件的 SACL,您可以要求執行緒物件的 ACCESS_SYSTEM_SECURITY 存取權限。 如需詳細資訊,請參閱 存取控制清單 (ACL) SACL 存取權限

受保護的處理程序

受保護的程式 可增強對 Digital Rights Management 的支援。 系統會限制對受保護進程的存取,以及受保護進程的執行緒。

Windows Server 2003 和 Windows XP: 已從 Windows Vista 開始新增受保護的進程。

下列特定存取權限不允許從進程到受保護進程的執行緒:

THREAD_ALL_ACCESS
THREAD_DIRECT_IMPERSONATION
THREAD_GET_CONTEXT
THREAD_IMPERSONATE
THREAD_QUERY_INFORMATION
THREAD_SET_CONTEXT
THREAD_SET_INFORMATION
THREAD_SET_TOKEN
THREAD_TERMINATE

引進 了THREAD_QUERY_LIMITED_INFORMATION 許可權,以提供透過 THREAD_QUERY_INFORMATION取得資訊的子集存取權。