|
分類:[C#]
2019/02/27(Wed) 17:55:22 編集(投稿者) 2019/02/27(Wed) 17:55:00 編集(投稿者)
.NET c#で、Windowsサービスプロセスとユーザープロセス間で通信するプログラムを作っています。
サービス間通信にWCF名前付きパイプを使って実装しており、サービス側で開いたホストへユーザー側から接続するのは問題なく行えるのですが まったく同じ処理をユーザー側で開いてサービス側から接続するとEndpointNotFoundExceptionが発生して接続失敗してしまいます。
簡略化したサンプルは以下の通りです。 ------------- サーバ側サンプル: [ServiceContract] public interface IProgram { [OperationContract] string GetDate(); }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class Program : IProgram {
public string GetDate() { return( Environment.MachineName+"/"+ Environment.UserName+" " +DateTime.Now.ToString()); }
static void Main(string[] args) {
Program inst=new Program(); ServiceHost comm_host = new ServiceHost( inst );
comm_host.AddServiceEndpoint( typeof( IProgram ), new NetNamedPipeBinding( NetNamedPipeSecurityMode.None ), "net.pipe://localhost/wcf_test" );
comm_host.Open(); System.Threading.Thread.Sleep(60*1000); } }
クライアント側サンプル: class Program { static void Main(string[] args) { var cf=new ChannelFactory<IProgram>( new NetNamedPipeBinding(NetNamedPipeSecurityMode.None ), "net.pipe://localhost/wcf_test" ); var proxy = cf.CreateChannel(); Console.WriteLine( proxy.GetDate( ) ); } } -------------
このプログラムのサーバ側をWindowsサービス権限で、クライアント側をユーザー権限で動かす場合は正常動作しますが、逆にすると接続失敗します。 サーバ側・クライアント側双方をサービスにした場合や、同様に双方をユーザー側にした場合でも成功します。 またサーバ側をユーザーから「管理者権限で実行」した場合でも成功します。 サービス→ユーザーへの接続だけが失敗しています。
おそらくは、使っている名前付きパイプの権限関連の問題ではないかとは思うのですが、調査した範囲では原因が究明できませんでした。
本件につき、何かわかる方がおられましたら、ご教示いただけますと幸いです。
|