2

私は少し複雑な設定をしていますが、もちろんXPでは問題なく動作しますが、Windows 7では窒息します。狂気のように見えるかもしれませんが、当時は理にかなっています。

外部デバイスと通信する別のアプリケーションを起動してから起動するWPFアプリケーションがあります。起動後、名前付きパイプ(net.pipe)を介してWCF(新しいプロセスによってホストされる)を使用して新しいプロセスとの通信を確立します。これはどちらのOSでも問題なく動作するようです。

WPFアプリケーションの機能の一部をコマンドラインプログラムで外部から利用できるようにしたかったので、今回はWPFアプリケーションによってホストされる別のWCFサービスをセットアップし、名前付きパイプを介して再度公開しました。繰り返しますが、これはうまくいくようです。

次に、WPFアプリケーションの機能をWeb経由で利用できるようにしたいと思いました。ここで、WPFアプリケーションを通常のユーザーアカウントから実行できることが重要です。そのため、Windows 7でこれを機能させる最善の方法は、Webサービス部分を提供するWindowsサービスを作成し、それをコマンドラインで正常に機能する同じ名前付きパイプを介したWPFアプリケーション。私はこれを実装し、XPでは正常に動作しますが、Windows 7ではチョークします。問題は、WindowsサービスとWPFアプリケーションの間に名前付きパイプ接続を確立しようとすることにあるようです。

管理者としてWPFアプリを実行すると、正常に機能します。そのため、Windowsサービスが実行されているアカウントが、名前付きパイプを介してWCFサービスをホストしている通常のユーザーアカウントと通信できないという問題があるようです。これを機能させる方法はありますか?通常のユーザーアカウントで実行されているWCFサービスは、名前付きパイプを使用して同じアカウントで実行されている別のアプリと通信できるようですが、別のアカウントで同じことを行うことはできないようです。

奇妙なことに、その逆が機能しているようです。実際、Windowsサービスは、名前付きパイプバインディングを使用してサービスを公開します(サービスは常に実行されているため、アクティブ化関数として使用されます)。WPFアプリからこのサービスに問題なく接続できます。

私のセキュリティに関する知識はやや限られています。誰かが何が起こっているかに光を当てることができますか?

4

2 に答える 2

3

この質問は、以前に SO で何度か尋ねられました。たとえば、Windows サービスからデスクトップ アプリへの名前付きパイプ経由の接続を参照してください。

問題は、ユーザー セッション アプリケーションが、他のセッションから見えるグローバル カーネル名前空間にオブジェクトを作成できるようにするために必要な SeCreateGlobalPrivilege セキュリティ特権を持っておらず、セッション内でのみ見えるローカル名前空間にしか持っていないことです。一方、デフォルトでこの特権で実行されるサービスは、そうすることができます。

このようにローカル名前空間に制約されるのは、名前付きパイプ オブジェクト自体ではなく、別の名前付きカーネル オブジェクトである共有メモリ セクションであり、WCF 名前付きパイプ バインディングは、そのクライアントに実際の名前を公開するために依存します。これは、サービスが開始されるたびに変更される GUID です。

役割を逆にすることで、この制約を回避できます。Windows サービス アプリケーションを、ユーザー セッション アプリが接続する WCF サービスにします。Windows サービスは、そのサービスをセッションに公開することに問題はありません。Windows サービスは常に実行されていますが、セッションとそのアプリはログインとログアウトに応じて行き来するため、このように接続することはより理にかなっています。二重コントラクトを使用してサービスを定義すると、接続が確立された後も、WCF サービスを介した重要な通信フローが最初に意図したのと同じ方向で発生する可能性があります。

于 2012-04-26T23:11:54.630 に答える
2

アプリケーション (WPF/コンソール) は、ローカル スコープの名前付きパイプを作成しています (これは、グローバル スコープのパイプを作成できない場合に既定で発生します)。私の推測では、同じアカウントで実行されているため、お互いの名前付きパイプを確認できるため、相互に通信できると思います。

Windows サービスはより高い権限を持っているため、クライアント アプリケーションが参照できるグローバル スコープの名前付きパイプを作成できます。

Christian Weyer のブログでディスカッションを確認できます。

于 2012-04-24T15:25:04.540 に答える