名前付きパイプのアクセス許可を「正しい」方法で設定しようとしています。現在のユーザーを指定するACE文字列
このように、アクセス権限を設定する最も簡単な正しい方法は、ACE文字列を介して行われているようです:
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
if (ConvertStringSecurityDescriptorToSecurityDescriptor(aceStr,
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor),
NULL))
{
pipe = CreateNamedPipe(..., &sa);
}
私はパイプの所有者が完全な制御をしたい、と誰もが読み書きアクセスしているとのみ。また、低レベルの整合性レベルのクライアントが接続できるように、パイプの整合性レベルを低くしたいとします。
これまではNULL DACLを使用していましたが、これは簡単ですが、マイクロソフトでは、すべてのクライアントがパイプの完全所有権を得ることができるため、これは良い考えではないことを明確に述べています。
私は、文字列のSADL部分がパイプに低の整合性レベルを与える
S:(ML;;NW;;;LW)
する必要があります知っています。
DACLの一部は、 '誰もが' 読み取りおよび書き込みアクセス権を与えます
D:(A;;FRFW;;;WD)
を含める必要があります。私は所有者のための完全なコントロールを設定するために、この最後に別のACE文字列を追加する必要があります。しかし、私はWindowsが現在のプロセスのSIDで置き換える最終的な位置に入るコードを見つけることができません。
S:(ML;;NW;;;LW)D:(A;;FRFW;;;WD)(A;;FA;;;<current process?>)
現在のプロセスのSIDを取得するコードがいくつか見つかりましたが、約4または5回のAPIコールが続いています。これは些細な作業でなければならないので、私はそれが私が望むことをする正しい方法ではないことを確信しています。
最後に、正しいトラックにリモートでいらっしゃいますか?なぜこれはとても複雑ですか?
補足的な2つの質問:CreateNamedPipe()に渡されたセキュリティ属性構造体は、パイプと同じ有効期間を持つか、呼び出しが返されるとすぐに削除できますか?複数のパイプ・インスタンスに同じ構造体を使用できますか、またはCreateNamedPipe()で変更しますか?
「CO」はここでは機能しません。 「CO」は、子オブジェクトを作成するときに有効になります。 (このルールを継承するときは、作成者/所有者のSIDをここに入れてください。)しかし、オブジェクトそのものには当てはまりません。 –
@Raymond:私はそれについてCOのことを読んでいます。PS(プリンシパルセルフ)は働くでしょうか?私はそれを試してみると、ACEはPSとして読み返し、すべてのプロセスは自分自身に「自己」であるからではないと推測しています...私が持っているランダムなファイルのセキュリティ設定を見ると、どれもSELFが所有していません。 –