サービス・クライアント間の名前付きパイプ・イベントハンドルのやり取りをマルチユーザ環境で利用するには?

解決


どら  2008-10-14 03:58:32  No: 69117

いつもお世話になっております。
Windows XP Pro SP2 + WS.NET 2005 Team + Mocrosoft SDK(最新)でWindows 
XPおよびVistaで使うアプリケーションを作っています。

行おうとしていることは、サービスアプリケーションとクライアントアプリケ
ーションの二つを作成し、

1.イベントの通知(Client → Service)
2.名前付きパイプで必要なデータを渡す(Client → Service)
3.Service側で受け取ったデータを処理
4.イベントの通知(Server → Client)
5.名前付きパイプで必要なデータを渡す(Service → Client)
6.受け取ったデータを元にユーザへ結果を返す

と言う動作のアプリケーション群を作成しています。
以前

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200806/08061912.txt

でお世話になり、無事動作できたのですが・・
Windows 側で「ユーザの切替」を行ったとき、それまで使っていたユーザはロ
グオフしているわけではありません。

作成しているClientアプリはタスクトレイに常駐するものなので、これだと、
イベントハンドルをつかんだままの状態になり、切替後のユーザはハンドルを
取得できずにエラー終了してしまうことがわかりました。
(クライアントが操作をしない限りイベントが発生することはないように作ら
れれいます)

そこで質問です。

・ログオフではなく「ユーザの切替」を選択されたときにClient側アプリを終
了→ロック解除後に再び起動という動作をさせることは可能でしょうか?

・このようなマルチログオン環境で、サービスとクライアントでイベントや名
前付きパイプのやり取りを行う場合、適切な対処法が存在するのでしょうか?

以上について、ご存じの方がいらっしゃいましたら教えていただけないでしょ
うか?

長文で申し訳ありませんが、よろしくお願いいたします。


河童  2008-10-14 08:55:55  No: 69118

突き詰めると「ユーザーごとにサーバと繋げばいいんじゃないの?」と言う結論しかないような…。ユーザーを切り替えると言うのはそういうことだし。
ユーザーの切り替えの概念を勘違いしてるに一票。


どら  2008-10-14 18:55:50  No: 69119

河童さん

レスありがとうございます。
ただ、サーバではなく「サービス」です。
同一端末上で、サービスとして動いているアプリケーションに、クライアント
アプリからイベントや名前付きパイプでやり取りをしているんです。

現状では、サービスアプリ側でイベントハンドルを2つ作成し、クライアント
アプリを起動するときにそれをつかむかたちにしていますが、それがよくない
んですかね・・・

実際に何人のユーザがログオンしたままユーザの切替をするかわからないの
で、イベントハンドルをいくつも用意するのはあまりよろしくはないのかなと
も思い・・・。

現状では、クライアントアプリが一度起動すると、終了するまでイベントハン
ドルをつかんだままにしているため、ユーザ切替を行ったときにハンドルがつ
かまれているので、後からログオンしたユーザが起動したアプリの方はハンド
ルを取得できずに終了してしまうんです。

ハンドルをつかむタイミングをちょっと考えてみます。


aetos  2008-10-14 19:47:38  No: 69120

瑣末なことですが…

> ただ、サーバではなく「サービス」です。

似たようなものです。
サーバとは Web サーバのことばかりを言うのではなく、サービスを提供するもの全般のことを言うのです。

で。
WTSRegisterSessionNotification 関数で、ユーザの切り替えが行われたことを検出できます。
そのタイミングで、初ログインのユーザであれば新しいイベントを作るといったような処理が可能ではないかと思います。


どら  2008-10-15 03:31:55  No: 69121

aetosさん

ご返答ありがとうございます。
サービスを提供するものがサーバということをおっしゃっているのだと思いま
すが、私の説明不足で申し訳ありません。
結局は同じことなんですが、私はWindows Services として登録・起動するア
プリケーションと言う意味でサービスと指していました。

で、WTSRegisterSessionNotificationですが、うまく行けそうです。
こんな関数があったんですね☆

http://support.microsoft.com/kb/310153/ja

を参考にしながら、クライアント側の方でいったんハンドルを閉じたりできな
いか試してみます。

それがダメなら、根本から考え方を直さないとですね>_<

お二人とも、本当にありがとうございます!!
結果がでたら解決とさせていただきます。


aetos  2008-10-15 21:41:22  No: 69122

> 結局は同じことなんですが、私はWindows Services として登録・起動するア
> プリケーションと言う意味でサービスと指していました。

わかっています。
最初の書き込みで「クライアント」という言葉を使われていますが、クライアントの対義語は「サーバ」です。
今回は、Windows Service という形態で実装されたサーバ、ということです。

> クライアント側の方でいったんハンドルを閉じたりできないか試してみます。

ユーザの切り替えはログオフとは違うので、切り替えによって裏側に回ったユーザでもアプリは引き続き実行されているわけですが、閉じちゃっていいんですか?  処理が継続できなくなりますよね。
サービスとの間で通信するイベントが、ユーザのインタラクティブな操作(キーボードを操作するとかボタンを押すとか)が行われた場合のみ必要なものならまだしも、タスクトレイに常駐するアプリということは、ユーザが何らかの操作をしなくても動き続けるアプリのような気がしますが。
今まさにマシンを対話的に操作しているユーザのみが受信できるイベントでいいんでしょうか?


どら  2008-10-16 02:02:57  No: 69123

aetosさん

ありがとうございます。
一言で言うと、Usersグループのユーザが、IPアドレスやProxyの設定など、ネ
ットワークの接続設定を切り替えるツールを作っています。

IPアドレスやFirewallの設定はUsersでは変更できないので、Windows Service
で起動させたアプリから変更させているんです。

で、基本的には常駐させ、タスクトレイのアイコンをクリック→切り替えたい
設定を選択→サービスへ変更を通知→変更という動きをさせています。

なので、基本的には、セッションが切れている間は、アプリそのものが終了し
てさえいなければ問題ないので・・・。

で、教えていただいた関数を使って実現できました!!
ほぼ前回の書き込みで記入したリンクを抜粋して使ったような感じですが(笑)。

本当にありがとうございました。
これにて解決とさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加