具名管道安全性和存取權限
Windows 安全性可讓您控制對具名管道的存取。 如需安全性的詳細資訊,請參閱 存取控制模型。
呼叫CreateNamedPipe函式時,您可以指定具名管道的安全性描述項。 安全性描述項可控制對具名管道用戶端和伺服器端的存取。 如果您指定 Null,具名管道會取得預設的安全性描述元。 具名管道的預設安全性描述元中的 ACL 會將完全控制權授與 LocalSystem 帳戶、系統管理員和建立者擁有者。 他們也會授與所有人群組成員和匿名帳戶的讀取權限。
若要擷取具名管道的安全性描述元,請呼叫 GetSecurityInfo 函式。 若要變更具名管道的安全性描述元,請呼叫 SetSecurityInfo 函 式。
當執行緒呼叫 CreateNamedPipe 以開啟現有具名管道伺服器端的控制碼時,系統會在傳回控制碼之前執行存取檢查。 存取檢查會將執行緒的存取權杖和要求的 存取權限 與具名管道安全性描述項中的 DACL 進行比較。 除了要求的存取權限之外,DACL 還必須允許呼叫執行緒FILE_CREATE_PIPE_INSTANCE對具名管道的存取。
同樣地,當用戶端呼叫 CreateFile 或 CallNamedPipe 函式以連線到具名管道的用戶端端時,系統會先執行存取檢查,再授與用戶端的存取權。
CreateNamedPipe函式所傳回的控制碼一律具有 SYNCHRONIZE 存取權。 它也具有GENERIC_READ、GENERIC_WRITE或兩者,視管道的開啟模式而定。 以下是每個開啟模式的存取權限。
開啟模式 | 存取權限 |
---|---|
PIPE_ACCESS_DUPLEX (0x00000003) | FILE_GENERIC_READ、FILE_GENERIC_WRITE和 SYNCHRONIZE |
PIPE_ACCESS_INBOUND (0x00000001) | FILE_GENERIC_READ和 SYNCHRONIZE |
PIPE_ACCESS_OUTBOUND (0x00000002) | FILE_GENERIC_WRITE和 SYNCHRONIZE |
FILE_GENERIC_READ具名管道的存取權結合了從管道讀取資料的許可權、讀取管道屬性、讀取擴充屬性,以及讀取管道的 DACL。
FILE_GENERIC_WRITE具名管道的存取權結合了將資料寫入管道的許可權、將資料附加至管道、寫入管道屬性、寫入擴充屬性,以及讀取管道的 DACL。 因為FILE_APPEND_DATA和FILE_CREATE_PIPE_INSTANCE具有相同的定義,因此FILE_GENERIC_WRITE啟用建立管道的許可權。 若要避免這個問題,請使用個別許可權,而不是使用FILE_GENERIC_WRITE。
如果您想要讀取或寫入物件的 SACL,您可以要求ACCESS_SYSTEM_SECURITY存取權給具名管道物件。 如需詳細資訊,請參閱 存取控制清單 (ACL) 和 SACL 存取權限。
若要防止不同終端機服務會話上的遠端使用者或使用者存取具名管道,請使用管道之 DACL 上的登入 SID。 登入 SID 也會用於執行身分登入;它是用來保護每個會話物件命名空間的 SID。 如需詳細資訊,請參閱 在 C++ 中取得登入 SID。