3

2番目のアプリケーションから呼び出す必要のあるアプリケーションがあります。これらのアプリケーションは、構成なしで(できればレジストリにアクセスせずに)お互いを見つけ、ターミナルサービス環境で適切に機能する必要があります。名前付きパイプを使用した.netリモーティングがこれを実現する方法である可能性があると聞きましたが、パイプを作成したセッション内でのみアクセスできるようにパイプを制限する方法がわかりません。ありがとう

更新:私はWCFに問題はありません。質問はリモート処理に固有のものではなく、名前付きパイプをセッションに対してローカルに設定する方法です。

4

3 に答える 3

2

アプリケーションが Windows Vista または Windows 7 で実行されていて、WCF NetNamedPipeBinding を使用している場合は、同じセッション内からのみアクセスできるサービスを自動的に取得します。ただし、パイプのサービス エンドを実装するプロセスが存在しない場合に限ります。 SeCreateGlobalPrivilege 特権。実際には、これは通常、サーバーが [管理者として実行] で開始されていない限り、対話型セッションで開始された任意のプログラムであることを意味します。

その理由は、潜在的なクライアントに実際のパイプ名 (GUID) を発行するために WCF が作成する名前付き共有メモリ オブジェクトに関係しています。この仕組みについてはブログで解説しています。サービス プロセスに SeCreateGlobalPrivilege がある場合、この発行オブジェクトは、すべてのセッションに表示されるグローバル カーネル名前空間に作成されます。この権限がない場合、オブジェクトは、同じセッション内でのみ表示されるローカル カーネル名前空間に作成されます。これは絶対的なセキュリティを提供しないことに注意してください。名前付きパイプ自体は、パイプ名 GUID が何らかの方法で別の方法で開示された場合、理論的には (WCF クライアント スタックではなくネイティブ API 呼び出しを使用して) 別のセッションからアクセスできます。

以前の OS をサポートする必要がある場合、またはパイプ自体に絶対的なセキュリティが必要な場合は、WCF サービス チャネル スタックがパイプを作成した後でパイプの DACL を修正して、明示的に制限を実装する必要があります。これには、標準バインディングをいじる必要があります。これを行う方法をここで示します。また、DACL で ACE を作成するための正しいログオン セッション SID を検出するために、いくつかの P/Invoke コードを記述する必要がありますが、これは特に簡単ではありません。.NET 4 では、WCF サービス スタック自体がログオン セッション SID を検出して使用し、新しいパイプ インスタンスを作成するアクセス許可を制限しますSystem.ServiceModel.Channels.SecurityDescriptorHelper.GetProcessLogonSid()

于 2011-01-31T11:00:00.750 に答える
1

私はこの正確な問題を調査してきました。私がこれまでに見つけた(まだ試していませんが)最善の解決策は、セッションIDを使用して一意の名前付きパイプ名を作成することです。

于 2011-01-30T04:48:28.900 に答える
0

これにはWindows Communication Foundationを使用することをお勧めします。

レジストリを使用せずに、名前付きパイプ、ソケットなどを使用するなど、さまざまな通信オプションをすべて構成するオプションがあります。

于 2010-02-22T19:25:46.323 に答える