命名管道安全性和訪問許可權
Windows 安全性可讓您控制命名管道的存取。 如需安全性的詳細資訊,請參閱 Access-Control 模型。
呼叫 createNamedPipe 函式時,您可以為命名管道指定 安全性描述元。 安全性描述元可控制對命名管道用戶端和伺服器端的存取。 如果您指定 NULL,則命名管道會取得預設的安全性描述元。 具名管道的預設安全性描述元中的 ACL 會將完全控制權授與 LocalSystem 帳戶、系統管理員和建立者擁有者。 它們也會授與 Everyone 群組成員和匿名帳戶的讀取許可權。
若要擷取命名管道的安全性描述元,請呼叫 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具名管道物件的存取權。 如需詳細資訊,請參閱 Access-Control 清單 (ACL) 和 SACL 存取權。
若要防止不同終端機服務會話上的遠端使用者或使用者存取命名管道,請使用管道 DACL 上的登入 SID。 登入 SID 也會用於執行身分登入;它是用來保護每個會話物件命名空間的 SID。 如需詳細資訊,請參閱在 C++ 中取得登入 SID。