線程安全性和訪問許可權
Microsoft Windows 可讓您控制線程物件的存取。 如需安全性的詳細資訊,請參閱 Access-Control 模型。
當您呼叫 CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW、CreateThread或 CreateRemoteThread 函式時,您可以指定線程 安全性描述元。 如果您指定 NULL,線程會取得預設的安全性描述元。 線程的預設安全性描述元中的 ACL 來自建立者的主要或模擬令牌。
若要擷取線程的安全性描述元,請呼叫 GetSecurityInfo 函式。 若要變更線程的安全性描述元,請呼叫 SetSecurityInfo 函式。
CreateThread 函式所傳回的句柄具有線程物件的 THREAD_ALL_ACCESS 存取權。 當您呼叫 GetCurrentThread 函式時,系統會傳回具有線程安全性描述元允許呼叫端之最大存取權的虛擬手寫。
線程物件的有效訪問許可權包括 標準訪問許可權 和一些線程特定的訪問許可權。 下表列出所有物件所使用的標準訪問許可權。
價值 | 意義 |
---|---|
DELETE (0x00010000L) | 需要刪除物件。 |
READ_CONTROL (0x00020000L) | 需要讀取 物件之安全描述元中的資訊,不包括 SACL 中的資訊。 若要讀取或寫入 SACL,您必須要求 ACCESS_SYSTEM_SECURITY 訪問許可權。 如需詳細資訊,請參閱 SACL 存取權。 |
SYNCHRONIZE (0x001000000L) | 使用物件進行同步處理的權利。 這可讓線程等候對象處於訊號狀態。 |
WRITE_DAC (0x00040000L) | 在對象的安全性描述元中修改 DACL 的必要專案。 |
WRITE_OWNER (0x00080000L) | 需要變更 物件之安全性描述元中的擁有者。 |
下表列出線程特定的訪問許可權。
價值 | 意義 |
---|---|
SYNCHRONIZE (0x001000000L) | 允許在任何 等候函式中使用線程句柄,。 |
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_INFORMATION。Windows Server 2003 和 Windows XP: 不支援此訪問許可權。 |
THREAD_SET_CONTEXT (0x0010) | 使用 SetThreadContext寫入線程內容的必要專案。 |
THREAD_SET_INFORMATION (0x0020) | 必須在線程物件中設定特定資訊。 |
THREAD_SET_LIMITED_INFORMATION(0x0400) | 必須在線程物件中設定特定資訊。 具有 THREAD_SET_INFORMATION 訪問許可權的句柄會自動授與 THREAD_SET_LIMITED_INFORMATION。Windows Server 2003 和 Windows XP: 不支援此訪問許可權。 |
THREAD_SET_THREAD_TOKEN (0x0080) | 必須使用 setThreadToken 設定線程的模擬令牌。 |
THREAD_SUSPEND_RESUME (0x0002) | 暫停或繼續線程的必要專案(請參閱 SuspendThread 和 ResumeThread)。 |
THREAD_TERMINATE (0x0001) | 使用 terminateThread 終止線程的必要專案。 |
如果您想要讀取或寫入物件的 SACL,您可以要求 ACCESS_SYSTEM_SECURITY 線程物件的存取權。 如需詳細資訊,請參閱 Access-Control 清單 (ACL) 和 SACL 存取權。
受保護的進程
受保護的程式 增強對數位版權管理的支援。 系統會限制受保護進程和受保護進程的線程存取。
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取得的資訊子集。