處理安全性和存取權限
Microsoft Windows 安全性模型可讓您控制處理物件的存取。 如需安全性的詳細資訊,請參閱 存取控制模型。
當使用者登入時,系統會收集一組在驗證程式期間唯一識別使用者的資料,並將它儲存在 存取權杖中。 此存取權杖描述與使用者相關聯之所有進程的安全性內容。 進程的安全性內容是提供給進程或建立進程的使用者帳戶的認證集。
您可以使用權杖,使用 CreateProcessWithTokenW 函式來指定進程的目前安全性內容。 呼叫CreateProcess、CreateProcessAsUser或CreateProcessWithLogonW函式時,您可以指定進程的安全性描述元。 如果您指定 Null,進程會取得預設的安全性描述元。 進程的預設安全性描述元中的 ACL 來自建立者的主要或模擬權杖。
若要擷取進程的安全性描述元,請呼叫 GetSecurityInfo 函式。 若要變更進程的安全性描述元,請呼叫 SetSecurityInfo 函式。
進程物件的有效存取權限包括 標準存取權限 和一些程式特定的存取權限。 下表列出所有物件所使用的標準存取權限。
值 | 意義 |
---|---|
DELETE (0x00010000L) | 刪除物件的必要專案。 |
READ_CONTROL (0x00020000L) | 需要讀取物件之安全性描述元中的資訊,不包括 SACL 中的資訊。 若要讀取或寫入 SACL,您必須要求 ACCESS_SYSTEM_SECURITY 存取權限。 如需詳細資訊,請參閱 SACL 存取權限。 |
SYNCHRONIZE (0x00100000L) | 使用同步物件的權限。 這可讓執行緒等到物件處於訊號狀態為止。 |
WRITE_DAC (0x00040000L) | 需要修改 物件之安全性描述元中的 DACL。 |
WRITE_OWNER (0x00080000L) | 需要變更 物件之安全性描述元中的擁有者。 |
下表列出程式特定的存取權限。
值 | 意義 |
---|---|
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x0000F0000L) |SYNCHRONIZE (0x00100000L) |0xFFFF) | 進程物件的所有可能存取權限。Windows Server 2003 和 Windows XP: Windows Server 2008 和 Windows Vista 上 增加PROCESS_ALL_ACCESS 旗標的大小。 如果針對 Windows Server 2008 和 Windows Vista 編譯的應用程式是在 Windows Server 2003 或 Windows XP 上執行, 則PROCESS_ALL_ACCESS 旗標太大,而且指定此旗標的函式會失敗並 出現ERROR_ACCESS_DENIED。 若要避免這個問題,請指定作業所需的最小存取權限集。 如果必須使用 PROCESS_ALL_ACCESS ,請將_WIN32_WINNT設定為應用程式 (目標的最低作業系統, #define _WIN32_WINNT _WIN32_WINNT_WINXP 例如) 。 如需詳細資訊,請參閱 使用 Windows 標頭。 |
PROCESS_CREATE_PROCESS (0x0080) | 需要使用此程式做為父進程搭配 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS。 |
PROCESS_CREATE_THREAD (0x0002) | 必須在進程中建立執行緒。 |
PROCESS_DUP_HANDLE (0x0040) | 需要使用 DuplicateHandle複製控制碼。 |
PROCESS_QUERY_INFORMATION (0x0400) | 需要擷取進程的特定資訊,例如其權杖、結束代碼和優先順序類別, (請參閱 OpenProcessToken) 。 |
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) | 需要擷取有關進程的特定資訊 (請參閱 GetExitCodeProcess、 GetPriorityClass、 IsProcessInJob、 QueryFullProcessImageName) 。 具有 PROCESS_QUERY_INFORMATION 存取權限的控制碼會自動授 與PROCESS_QUERY_LIMITED_INFORMATION。Windows Server 2003 和 Windows XP: 不支援此存取權限。 |
PROCESS_SET_INFORMATION (0x0200) | 需要設定進程的特定資訊,例如其優先順序類別 (請參閱 SetPriorityClass) 。 |
PROCESS_SET_QUOTA (0x0100) | 使用 SetProcessWorkingSetSize設定記憶體限制的必要條件。 |
PROCESS_SUSPEND_RESUME (0x0800) | 暫停或繼續程式的必要專案。 |
PROCESS_TERMINATE (0x0001) | 必須使用 TerminateProcess終止進程。 |
PROCESS_VM_OPERATION (0x0008) | 執行進程位址空間所需的作業 (請參閱 VirtualProtectEx 和 WriteProcessMemory) 。 |
PROCESS_VM_READ (0x0010) | 使用 ReadProcessMemory在進程中讀取記憶體的必要專案。 |
PROCESS_VM_WRITE (0x0020) | 使用 WriteProcessMemory在進程中寫入記憶體的必要條件。 |
SYNCHRONIZE (0x00100000L) | 需要等候進程使用 等候函式終止。 |
若要開啟另一個進程的控制碼並取得完整存取權限,您必須啟用 SeDebugPrivilege 許可權。 如需詳細資訊,請參閱 變更權杖中的許可權。
CreateProcess函式所傳回的句柄PROCESS_ALL_ACCESS進程物件的存取權。 當您呼叫 OpenProcess 函式時,系統會針對進程安全性描述元中的 DACL 檢查所要求的 存取權限 。 當您呼叫 GetCurrentProcess 函式時,系統會傳回具有 DACL 允許給呼叫端的最大存取權的虛擬手寫。
如果您想要讀取或寫入物件的 SACL,您可以要求 ACCESS_SYSTEM_SECURITY 進程物件的存取權。 如需詳細資訊,請參閱 存取控制清單 (ACL) 和 SACL 存取權限。
警告
具有此處所述的一些存取權限的程式,可以使用這些許可權來取得其他存取權限。 例如,如果進程 A 有控制碼來處理 具有PROCESS_DUP_HANDLE 存取權的 B,它可以複製進程 B 的虛擬控制碼。這會建立可存取進程 B 的最大控制碼。如需虛擬控制碼的詳細資訊,請參閱 GetCurrentProcess。
受保護的處理程序
Windows Vista 引進 受保護的程式 ,以增強對數位版權管理的支援。 系統會限制受保護進程的存取權,以及受保護進程的執行緒。
下列標準存取權限不允許從進程到受保護的進程:
- 刪除
- READ_CONTROL
- WRITE_DAC
- WRITE_OWNER
下列特定存取權限不允許從進程到受保護的進程:
- PROCESS_ALL_ACCESS
- PROCESS_CREATE_PROCESS
- PROCESS_CREATE_THREAD
- PROCESS_DUP_HANDLE
- PROCESS_QUERY_INFORMATION
- PROCESS_SET_INFORMATION
- PROCESS_SET_QUOTA
- PROCESS_VM_OPERATION
- PROCESS_VM_READ
- PROCESS_VM_WRITE
引進 了PROCESS_QUERY_LIMITED_INFORMATION 許可權,以提供可透過 PROCESS_QUERY_INFORMATION取得資訊的子集存取權。