2

同じユーザーのログオンセッション内で実行されている2つのプロセスがWCFを介して通信するようにしたいのですが。NetNamedPipesBindingがこれに最も適しているようです。ただし、複数のユーザーがログインしてこれらのプロセスを実行している可能性があるため、各プロセスが同じユーザーのログオンセッションで他のプロセスとのみ通信するようにする方法が必要です。また、理論的には、各ユーザーが同じマシンに複数回ログインする可能性があります。ここでも、異なるログオンセッションのプロセスが相互に通信することはできません。

私は(この質問とは異なり)セキュリティには特に関心がありません。各プロセスが同じユーザーセッション内の他のプロセスとのみ通信するようにする方法があるだけです。

1つの解決策は、エンドポイントアドレスに一意のログオンセッションIDを追加することですが、一意のログオンセッションを取得する方法がわかりません(これに関する私の質問を参照してください)。このためにWCFに組み込まれた方法、またはこれにアプローチする標準的な方法があるのではないかと思いました。

4

1 に答える 1

1

あなたがそれを確信できるならば:

  1. プロセスが昇格された特権で実行されることはありません(管理者として実行)。と
  2. 常にVista/Win7以降で実行されます

次に、WCFを使用してデフォルトで必要なものを取得します。

これは、NetNamedPipeBindingが実際のパイプ名(GUIDに基づく)を公開するために使用する共有メモリメカニズムは、WCFサービスをホストするプロセスにグローバルにするのに十分な特権(SeCreateGlobalPrivilege)がない場合、ログオンセッションによって自動的にスコープされるためです。表示:名前付き共有メモリ領域は、プロセスにこの権限がある場合にのみ「グローバル」カーネル名前空間に配置されます。それ以外の場合は、ユーザーセッションに関連する「ローカル」カーネル名前空間に配置されます。

残念ながら、WCFは、「グローバル」名前空間を介してパイプを公開することを検討することすら望まないことを指定する方法を提供していません。したがって、上記の条件1と2が保証されない場合、私が考えることができる唯一の方法は、あなたが提案したように、一意のログオンセッションIDに基づいた名前でエンドポイントに名前を付けることです。ログオンSIDを取得するのは少し手間がかかり、Win32APIの簡単ではないP/ Invokeが必要ですが、SOでその方法を示す回答がすでに見つかっているようです。

于 2011-05-21T21:01:21.033 に答える