2009-07-13 8 views
1

2つのプロセス間の通信に名前付きパイプを使用していて、Windowsのローカルシステム上の任意のユーザーにアクセスを制限します。WindowsのローカルシステムのみのACL

私は、CreateNamedPipeに渡されたSECURITY_ATTRIBUTESで使用するためのビルドとACLを作成しています。

私はこのコードをMicrosoftに基づいています。

SID_IDENTIFIER_AUTHORITY siaLocal = SECURITY_LOCAL_SID_AUTHORITY; 
if(!AllocateAndInitializeSid(&siaLocal, SECURITY_LOCAL_RID, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    &pSidLocal)) 
{ 
    break; 
} 

次に、AddAccessAllowedAceでそのsidを使用します。

これはすべて正常に完了し、名前付きパイプを作成できますが、クライアントプロセスがCreateFileを使用して接続しようとすると、アクセスが拒否されて失敗します。

ローカルマシンのすべてのユーザーがアクセスできるSIDを使用してACLを作成するにはどうすればよいですか。

+0

「ネットワーク」ACEにアクセス拒否トークンを追加することに加えて、「everyone」または「authenticated users」にアクセス許可トークンを追加する必要があると思います。 –

答えて

1

これはRTFMと厳密な型指定の完全なcの間のクロスです。

AllocateAndInitializeSidの2番目のパラメータは、実際には最初のサブオーソリティではないサブオーソリティの数です。

そうにコードを変更することで:

SID_IDENTIFIER_AUTHORITY siaLocal = SECURITY_LOCAL_SID_AUTHORITY; 
if(!AllocateAndInitializeSid(&siaLocal, 1, 
    SECURITY_LOCAL_RID, 
    0, 0, 0, 0, 0, 0, 0, 
    &pSidLocal)) 
{ 
    break; 
} 

私が望む結果を得ることができます。

私は別のアカウントでこれをテストしました。彼らは接続できます。権限をSECURITY_NT_AUTHORITYに変更し、サブの権限をSECURITY_AUTHENTICATED_USER_RIDに変更しました。このACLが実際に許可するかどうかをテストします。

3

あなたはACLを必要としません。 CreateNamedPipeを呼び出すとき、パラメータの1つはPIPE_ACCEPT_REMOTE_CLIENTS(デフォルト)またはPIPE_REJECT_REMOTE_CLIENTSのフラグ値をとります。

MSDN

編集:これはかなり新しい機能であるので、あなたは新しいWS2008サーバが、何のために開発している場合、それは動作しません。この場合、同じページに代替回答があります。AddAccessDeniedAceを使用してネットワークACEへのパイプへのアクセスを拒否します。

+0

はい、このフラグは便利ですが、残念ながらこれはWindows 2000以上で実行する必要のあるサービスです。 – JProgrammer

+0

あまりにも悪いことに、私の経験では、セキュリティAPIを使用する必要があるのはいつも痛いことです。 –

関連する問題