處理安全性和訪問許可權

Microsoft Windows 安全性模型可讓您控制對處理物件的存取。 如需安全性的詳細資訊,請參閱 Access-Control 模型。

當使用者登入時,系統會收集一組在驗證程式期間唯一識別用戶的數據,並將它儲存在 存取令牌中。 此存取令牌描述與使用者相關聯之所有進程的安全性內容。 進程的安全性內容是提供給進程或建立進程的用戶帳戶的認證集合。

您可以使用令牌,使用 createProcessWithTokenW函式,為進程指定目前的安全性內容。 當您呼叫 CreateProcess、CreateProcessAsUser或 CreateProcessWithLogonW 函式時,您可以為進程指定 安全性描述元。 如果您指定 NULL,則進程會取得預設的安全性描述元。 進程的預設安全性描述元中的 ACL 來自建立者的主要或模擬令牌。

若要擷取進程的安全性描述元,請呼叫 getSecurityInfo函式。 若要變更進程的安全性描述元,請呼叫 SetSecurityInfo 函式。

進程物件的有效訪問許可權包括 標準訪問許可權 和一些進程特定的訪問許可權。 下表列出所有物件所使用的標準訪問許可權。

價值 意義
DELETE (0x00010000L) 需要刪除物件。
READ_CONTROL (0x00020000L) 需要讀取 物件之安全描述元中的資訊,不包括 SACL 中的資訊。 若要讀取或寫入 SACL,您必須要求 ACCESS_SYSTEM_SECURITY 訪問許可權。 如需詳細資訊,請參閱 SACL 存取權。
SYNCHRONIZE (0x001000000L) 使用物件進行同步處理的權利。 這可讓線程等候對象處於訊號狀態。
WRITE_DAC (0x00040000L) 在對象的安全性描述元中修改 DACL 的必要專案。
WRITE_OWNER (0x00080000L) 需要變更 物件之安全性描述元中的擁有者。

 

下表列出進程特定的訪問許可權。

價值 意義
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) |SYNCHRONIZE (0x001000000L) |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、IsProcessInJobQueryFullProcessImageName)。 具有 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 (0x001000000L) 需要等候行程使用 wait 函式終止,。

 

若要開啟另一個進程的句柄並取得完整訪問許可權,您必須啟用 SeDebugPrivilege 許可權。 如需詳細資訊,請參閱在令牌 中變更許可權。

CreateProcess 函式所傳回的句柄具有進程物件的 PROCESS_ALL_ACCESS 存取權。 當您呼叫 OpenProcess 函式時,系統會針對進程的安全性描述元中的 DACL 檢查所要求的 訪問許可權。 當您呼叫 GetCurrentProcess 函式時,系統會傳回具有 DACL 允許給呼叫端的最大存取權的虛擬手寫。

如果您想要讀取或寫入物件的 SACL,您可以要求 ACCESS_SYSTEM_SECURITY 行程物件的存取權。 如需詳細資訊,請參閱 Access-Control 清單 (ACL) 和 SACL 存取權。

警告

具有此處所說明之某些訪問許可權的程式可以使用它們來取得其他訪問許可權。 例如,如果進程 A 有句柄來處理具有 PROCESS_DUP_HANDLE 存取權的 B,它可以複製進程 B 的虛擬句柄。這會建立具有進程 B 最大存取權的句柄。如需虛擬句柄的詳細資訊,請參閱 GetCurrentProcess。

 

受保護的進程

Windows Vista 引進 受保護的程式,以加強對數位版權管理的支援。 系統會限制受保護進程和受保護進程的線程存取。

下列標準存取權限不允許從進程進入受保護的進程:

  • DELETE
  • 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取得的資訊子集。