檔案安全性和存取權限

因為檔案是 安全性實體物件 ,因此存取它們受到存取控制模型所規範,該模型會控管 Windows 中所有其他安全性實體物件的存取權。 如需此模型的詳細說明,請參閱 存取控制

當您呼叫 CreateFile CreateDirectory 或 CreateDirectoryEx 函式時,您可以指定 檔案或 目錄的安全性描述元。 如果您為 lpSecurityAttributes 參數指定 Null ,則檔案或目錄會取得預設的安全性描述元。 檔案或目錄的預設安全性描述元中的存取控制清單 (ACL) 會繼承自其父目錄。 請注意,只有在新建立檔案或目錄時,才會指派預設的安全性描述元,而不是重新命名或移動它時。

若要擷取檔案或目錄物件的安全性描述元,請呼叫 GetNamedSecurityInfo 或 GetSecurityInfo 函式。 若要變更檔案或目錄物件的安全性描述元,請呼叫 SetNamedSecurityInfo 或 SetSecurityInfo 函式。

檔案和目錄的有效存取權限包括 DELETE、READ_CONTROL、 WRITE_DAC WRITE_OWNER SYNCHRONIZE 標準存取權限 檔案存取權限常數 中的 資料表會列出檔案和目錄特有的存取權限。

雖然 SYNCHRONIZE 存取權 是在標準存取權限清單中定義為 在其中一個等候函式中指定檔案控制代碼的許可權,但在使用非同步檔案 I/O 作業時,您應該等候正確 設定的 OVERLAPPED 結構中包含的事件控制碼,而不是使用檔案控制碼搭配 SYNCHRONIZE 存取權限進行同步處理。

以下是檔案和目錄的 一般存取權限

存取權 描述
FILE_GENERIC_EXECUTE
FILE_EXECUTE
FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
同步
FILE_GENERIC_READ
FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
同步
FILE_GENERIC_WRITE
FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
同步

 

Windows 會比較要求的存取權限和執行緒存取權杖中的資訊,以及檔案或目錄物件的安全性描述元中的資訊。 如果比較並未禁止授與所有要求的存取權限,則會將物件的控制碼傳回至執行緒,並授與存取權限。 如需此程式的詳細資訊,請參閱 執行緒與安全性實體物件 之間的互動。

根據預設,存取檔案或目錄的授權是由與該檔案或目錄相關聯之安全性描述元中的 ACL 嚴格控制。 特別是,父目錄的安全性描述元不會用來控制任何子檔案或目錄的存取。 您可以從使用者移除 BYPASS_TRAVERSE_CHECKING許可權 ,以強制執行FILE_TRAVERSE 存取權限。 一般情況下不建議這麼做,因為許多程式無法正確處理目錄周遊錯誤。 目錄上FILE_TRAVERSE 存取權的主要用途 ,是當與 Unix 系統的互通性是需求時,能夠符合特定 IEEE 和 ISO POSIX 標準。

Windows 安全性模型提供一種方式,讓子目錄繼承或防止繼承父目錄的安全性描述元中的一或多個 ACE。 每個 ACE 都包含決定其繼承方式的資訊,以及它是否會對繼承的目錄物件產生影響。 例如,某些繼承的 ACE 會控制繼承目錄物件的存取權,這些稱為 有效的 ACE 。 所有其他 ACE 稱為 僅限繼承 ACE

Windows 安全性模型也會根據 ACE 繼承規則 ,強制將 ACE 自動繼承至子物件。 這個自動繼承以及每個 ACE 中的繼承資訊,會決定如何將安全性限制傳遞至目錄階層。

請注意,您無法使用拒絕存取的 ACE 只 拒絕GENERIC_READ 或只 GENERIC_WRITE 檔案的存取權。 這是因為對於檔案物件,GENERIC_READ或GENERIC_WRITE的 泛型對應都包含 SYNCHRONIZE 存取權限。 如果 ACE 拒絕 GENERIC_WRITE 信任項的存取權,而信任者 要求GENERIC_READ 存取,要求將會失敗,因為要求會隱含包含 ACE 隱含拒絕的 SYNCHRONIZE 存取,反之亦然。 不要使用拒絕存取的 ACE,而是使用允許存取的 ACE 來明確允許的存取權。

管理儲存體物件存取的另一種方法是加密。 Windows 中的檔案系統加密實作是加密檔案系統或 EFS。 EFS 只會加密檔案,而不是目錄。 加密的優點是,它會為媒體上套用的檔案提供額外的保護,而不是透過檔案系統和標準 Windows 存取控制架構。 如需檔案加密的詳細資訊,請參閱 檔案加密

在大部分情況下,讀取和寫入檔案或目錄物件的安全性設定的能力僅限於核心模式進程。 顯然,您不希望任何使用者進程能夠變更私人檔案或目錄的擁有權或存取限制。 不過,如果檔案或目錄上放置的存取限制不允許應用程式的使用者模式程式讀取檔案,備份應用程式將無法完成備份檔案的工作。 備份應用程式必須能夠覆寫檔案和目錄物件的安全性設定,以確保完整備份。 同樣地,如果備份應用程式嘗試透過磁片常駐複本寫入檔案的備份複本,而且您明確拒絕對備份應用程式程式的寫入權限,還原作業便無法完成。 在此情況下,備份應用程式必須能夠覆寫檔案的存取控制設定。

特別 建立了SE_BACKUP_NAME SE_RESTORE_NAME 存取權限,以提供備份應用程式的能力。 如果備份應用程式程式的存取權杖中已授與並啟用這些許可權,則可以呼叫 CreateFile 來開啟檔案或目錄以進行備份,並將標準 READ_CONTROL 存取權限指定為 dwDesiredAccess 參數的值 不過,若要將呼叫進程識別為備份進程,對 CreateFile 的呼叫 必須在 dwFlagsAndAttributes 參數中包含 FILE_FLAG_BACKUP_SEMANTICS 旗標。 函式呼叫的完整語法如下:

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           READ_CONTROL,               // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           OPEN_EXISTING,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

這可讓備份應用程式程式開啟您的檔案,並覆寫標準安全性檢查。 若要還原檔案,備份應用程式會在開啟要寫入的檔案時,使用下列 CreateFile 呼叫語法。

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           CREATE_ALWAYS,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

在某些情況下,備份應用程式必須能夠變更檔案或目錄的存取控制設定。 例如,檔案或目錄磁片常駐複本的存取控制設定與備份複本不同時。 如果在備份檔案或目錄之後變更這些設定,或檔案或目錄已損毀,就會發生這種情況。

呼叫 CreateFile 中指定的FILE_FLAG_BACKUP_SEMANTICS 旗標會提供備份應用程式進程許可權,以讀取檔案或目錄的存取控制設定。 有了此許可權,備份應用程式程式就可以呼叫 GetKernelObjectSecurity 和 SetKernelObjectSecurity 來讀取,然後重設存取控制設定。

如果備份應用程式必須能夠存取系統層級 存取控制設定 則必須在傳遞至 CreateFile dwDesiredAccess 參數值中指定ACCESS_SYSTEM_SECURITY 旗標。

備份應用程式會呼叫 BackupRead 來讀取為還原作業指定的檔案和目錄,以及 BackupWrite 來寫入它們。

標準存取權限