名前付きパイプのセキュリティとアクセス権
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と同期 |
PIPE_ACCESS_OUTBOUND (0x00000002) | FILE_GENERIC_WRITEと同期 |
名前付きパイプの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 の取得」を参照してください。