C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: WindowsサービスとVB.NETプログラムの連携


(過去ログ 133 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■78630 / inTopicNo.1)  WindowsサービスとVB.NETプログラムの連携
  
□投稿者/ WAN (1回)-(2016/01/30(Sat) 23:51:11)

分類:[VB.NET/VB2005 以降] 

2016/01/30(Sat) 23:59:57 編集(投稿者)
2016/01/30(Sat) 23:59:53 編集(投稿者)

始めまして、VB.NETを扱い始めて2ヶ月ほどの者です。
プログラムもこれが初めてなので拙い部分がありましたら申し訳ありません。

Visual Studio 2012の環境下で、言語はVB2012、.netフレームワークは3.0で
プログラムの作成を行っているのですが以下の部分に躓いております。

(1)Windowsサービス(時間制御担当)
(2)プログラム本体(データ出力処理担当)

(2)本体で時間設定をしたら、(1)サービスに時間の値を渡し時間制御

(1)サービスの時間制御で設定した時間になったら(2)本体に指示を出し、
(2)本体のCSV出力機能を使って自動処理をする流れを調査しています。

本当ならば、一つのプログラムで作れたら苦労はないのですが、
「Windowsサービスで時間制御」をしなければいけないことになっております。

Windowsサービスから、時間になったら別プログラムの処理を走らせるという制御は可能なのでしょうか、

せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。

アドバイスをいただければ幸いです。
引用返信 編集キー/
■78631 / inTopicNo.2)  Re[1]: WindowsサービスとVB.NETプログラム
□投稿者/ Azulean (586回)-(2016/01/31(Sun) 00:33:54)
2016/01/31(Sun) 00:36:30 編集(投稿者)

No78630 (WAN さん) に返信
> 本当ならば、一つのプログラムで作れたら苦労はないのですが、
> 「Windowsサービスで時間制御」をしなければいけないことになっております。

この制約ははなぜ存在するのでしょうか?
説明(開示)できない、あるいはその理由を聞けていないのどちらかなのでしょうか。


Windows サービスで考える場合、ユーザーがログオンしていない状態を想定するべきです。
ログオンしていない場合、(2) のプログラムは実行されていないかもしれません。
そうではなく、サービスから新たに起動と考えた場合、(2) のプログラムを実行するアカウント・アクセス権限も問題になり得ます。


「Windows サービス前提」となっている背景、サービスとプログラムの実行アカウント・権限あたりをきちんと理解しないと、適切に設計・実装できません。
そのあたりは大丈夫でしょうか?


> Windowsサービスから、時間になったら別プログラムの処理を走らせるという制御は可能なのでしょうか、
> せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。

前述したようにログオンされていない場合、プログラムが実行されてない場合をどのように考慮しているか、考慮する必要があるのかがまず先かなと思います。
引用返信 編集キー/
■78633 / inTopicNo.3)  Re[2]: WindowsサービスとVB.NETプログラム
□投稿者/ WAN (2回)-(2016/01/31(Sun) 08:59:31)
2016/01/31(Sun) 09:29:26 編集(投稿者)
2016/01/31(Sun) 09:00:00 編集(投稿者)

お返事ありがとうございます。

>この制約ははなぜ存在するのでしょうか?
>説明(開示)できない、あるいはその理由を聞けていないのどちらかなのでしょうか。

外部委託業務の関係なのでお話する内容には慎重になっております、申し訳ありません。
依頼された仕様がWindows サービスを使用する形式となっております。
「完全に実現不可」とでもならない限りWindows サービスを使用しないことにはならない状況です。

>Windows サービスで考える場合、ユーザーがログオンしていない状態を想定するべきです。
>ログオンしていない場合、(2) のプログラムは実行されていないかもしれません。
>そうではなく、サービスから新たに起動と考えた場合、(2) のプログラムを実行するアカウント・アクセス権限も問題になり得ます。

24時間稼動したまま、数時間毎に自動処理を行う為、常時ログオンしている状態となります。
アカウントは管理者となります。
引用返信 編集キー/
■78636 / inTopicNo.4)  Re[3]: WindowsサービスとVB.NETプログラム
□投稿者/ Azulean (589回)-(2016/01/31(Sun) 15:06:07)
2016/01/31(Sun) 15:12:50 編集(投稿者)

No78633 (WAN さん) に返信
> 外部委託業務の関係なのでお話する内容には慎重になっております、申し訳ありません。
> 依頼された仕様がWindows サービスを使用する形式となっております。
> 「完全に実現不可」とでもならない限りWindows サービスを使用しないことにはならない状況です。

> 24時間稼動したまま、数時間毎に自動処理を行う為、常時ログオンしている状態となります。
> アカウントは管理者となります。

要求を出している方に、「Windows サービスだと何が良いのか? それに何を期待しているのか?」を尋ねた方が良いとは思います。
今の話だけだと、無駄に難易度を上げて、工数(費用)がかかる側に触れているような気がしているためです。

サービスである必要がないのであれば難易度を落として費用が安くなることを説明するべきですし、サービスである必然性があるのなら、そのポイントを強く意識して設計・実装した方がお互いに良い結果につながるからです。


ただ、機密を意識して出せない範囲に、Windows サービスであることが有益である点があるのであれば、私の言い過ぎだと思うので、その旨ご指摘ください。
その場合、その路線の話に触れないようにしておきます…。


問題がないとして、プロセスが常駐しているのか、時間などの条件を満たした場合にプロセスを新規起動するべきなのかでやることは違うと思います。
引用返信 編集キー/
■78637 / inTopicNo.5)  Re[4]: WindowsサービスとVB.NETプログラム
□投稿者/ WAN (3回)-(2016/01/31(Sun) 15:50:13)
2016/01/31(Sun) 15:58:55 編集(投稿者)
2016/01/31(Sun) 15:54:49 編集(投稿者)

契約および設計面に関しては参考と致しまして検討事項とさせて頂きたいと思います。
アドバイスありがとうございます。

状態としてはプログラム及びWindowsサービスを常駐化させている状態となります。
その状態を踏まえ、

Windowsサービスから別プログラムの処理を走らせるという制御は可能なのでしょうか。
せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。

アドバイスを頂ければ幸いです。
宜しくお願い致します。
引用返信 編集キー/
■78640 / inTopicNo.6)  Re[5]: WindowsサービスとVB.NETプログラム
□投稿者/ Azulean (590回)-(2016/01/31(Sun) 16:43:08)
No78637 (WAN さん) に返信
> Windowsサービスから別プログラムの処理を走らせるという制御は可能なのでしょうか。
> せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。

英語ですが、こういったスレッドがありました。

Best way to communicate with a windows service from a form application
https://social.msdn.microsoft.com/Forums/vstudio/en-US/27dd76cf-a68b-41b8-beab-04f23187ea6a/best-way-to-communicate-with-a-windows-service-from-a-form-application?forum=netfxbcl

いろいろとテクノロジーの種類はあり、通知して動くものやポーリングによって動くものなど、特徴があると思います。
使うテクノロジーに応じて難易度も違うと思いますので、それぞれ特徴を調べていただいた方が良いでしょう。
引用返信 編集キー/
■78641 / inTopicNo.7)  Re[5]: WindowsサービスとVB.NETプログラム
□投稿者/ Jitta (173回)-(2016/01/31(Sun) 20:22:20)
No78637 (WAN さん) に返信
>
> 状態としてはプログラム及びWindowsサービスを常駐化させている状態となります。
> その状態を踏まえ、
>
> Windowsサービスから別プログラムの処理を走らせるという制御は可能なのでしょうか。
> せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。
>

Windows サービスから別のプログラムを起動するの可能です。
今の感じですと、サービスは常に起動していますが、2の本体と言われているプログラムは、
ユーザーがログオンし、
起動している状態である、
という制約があります。その制約って、どうなんですかねぇ?

引用返信 編集キー/
■78642 / inTopicNo.8)  Re[6]: WindowsサービスとVB.NETプログラム
□投稿者/ WAN (4回)-(2016/01/31(Sun) 21:52:34)
>Azuleanさん

アドバイスありがとうございます。
行うのはプロセス間通信ということが分かりましたので
同じパソコン間で行っている例のあったIPCチャネルを使いテストを行っております。
テストプログラムでフォーム単位では成功したのですが、
windowsサービスでは「IPC ポートに接続できません。アクセスが拒否されました。」
というイベントログが出てサービスが停止してしまいます。

Public Class IpcClient

Public Property SharedObject As IpcSharedObject
Private _channel As IpcClientChannel

Public Sub New()

Me._channel = New IpcClientChannel()

ChannelServices.RegisterChannel(Me._channel, True)

Me._SharedObject = TryCast(Activator.GetObject(GetType(IpcSharedObject),
String.Format("ipc://{0}/{1}", "ipcsrv", "ipccli")
), IpcSharedObject)

End Sub


End Class

おそらくですがこの辺りの処理で失敗しているのではないかと思います。

>Jittaさん

レスありがとうございます。
(2)本体は常にログインして起動したままなので制約はクリアしております。
引用返信 編集キー/
■78643 / inTopicNo.9)  Re[7]: WindowsサービスとVB.NETプログラム
□投稿者/ WAN (5回)-(2016/01/31(Sun) 23:21:08)
2016/01/31(Sun) 23:21:44 編集(投稿者)

「IPC ポートに接続できません。アクセスが拒否されました。」された症状は
windowsサービスで「Local System」という権限から落としてみたら、サービスからフォームのラベルメッセージを変更する事が出来ました。
ただサービスインストール時に「PC名\ユーザー名」をIDとして、ログイン確認の作業が加わるので確認が必要となりそうです。
引用返信 編集キー/
■78649 / inTopicNo.10)  Re[1]: WindowsサービスとVB.NETプログラムの連携
□投稿者/ Mira (8回)-(2016/02/01(Mon) 12:36:17)
No78630 (WAN さん) に返信

> (1)Windowsサービス(時間制御担当)

Task Schedulerも立派なWindowsサービスなのですがそういった屁理屈は通用しそうですか?
これが通用するのであれば、Task Schedulerの時間設定を(2)にあたるプログラムで
変更するように実装すれば作成するプログラムは一つですみます

> せめてプログラムとサービスで相互に値の受け渡しが出来ればと思います。

どこまで同期させるかで実装方法は異なってきますが
通信をしなくても共通で参照するデータ(ファイル、データベース、レジストリなどなど)を作って運用すれば簡単になりますね

私も似たようなプログラムを作ったことがあります
私の場合は時間設定はレジストリに書き込み通信については System.Net.Socketsを使いました

単純な命令(例えば実行するように命令するだけ等)でしたらOnCustomCommandで実装すると簡単にすみますね


引用返信 編集キー/
■78651 / inTopicNo.11)  Re[2]: WindowsサービスとVB.NETプログラムの連携
□投稿者/ WAN (6回)-(2016/02/01(Mon) 21:58:38)
アドバイスありがとうございます。

> Task Schedulerも立派なWindowsサービスなのですがそういった屁理屈は通用しそうですか?
> これが通用するのであれば、Task Schedulerの時間設定を(2)にあたるプログラムで
> 変更するように実装すれば作成するプログラムは一つですみます

提案が通用するかはわかりませんが、引き出しを増やしておくことができるのでとても助かります。
ありがとうございます。

> どこまで同期させるかで実装方法は異なってきますが
> 通信をしなくても共通で参照するデータ(ファイル、データベース、レジストリなどなど)を作って運用すれば簡単になりますね
>
> 私も似たようなプログラムを作ったことがあります
> 私の場合は時間設定はレジストリに書き込み通信については System.Net.Socketsを使いました
>
> 単純な命令(例えば実行するように命令するだけ等)でしたらOnCustomCommandで実装すると簡単にすみますね

レジストリに保存するという手法もあるのですね。
この場合でいうOnCustomCommandはサービス側に送るServiceBase.OnCustomCommandメソッドのことで宜しいでしょうか。
引用返信 編集キー/
■78668 / inTopicNo.12)  Re[3]: WindowsサービスとVB.NETプログラムの連携
□投稿者/ WAN (7回)-(2016/02/03(Wed) 22:44:01)
どの機能を使えばいいのか分からない所、皆様のおかげで解決の糸口を掴めました。
一旦解決済みと致します。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -