トップ回答者
Windows サービスアプリケーションについて

質問
-
クライアントPCにインストールされた社内システム(アプリケーション)を
自動更新するプログラムを作成しようと考えています。動作概要:LAN内のフォルダーよりクライアントPCのフォルダーへファイルをコピーする。
コピーするファイルは実行モジュール(exe/dll)や設定ファイル(.config)等です。
動作PC:クライアントPC上(ドメインに入っている環境)
クライアントOS:Windows XP Pro および Windows 7 Pro/Ulti内容的にはログイン時にコピーコマンド(XCopy等)で十分なのですが、
ログインするユーザーは基本的にDomain Usersなのでコピーに失敗します。
その為、Windows Update みたいに サービス(Local System等)で動作させてファイルを
コピーさせようと考えていました。
また、下記のようなUIも実装できないか検討していました。・ファイルコピーの有無の表示や進捗等を画面表示出来ないか?
・コピー失敗時に理由を表示して、ユーザに再試行させる画面は出来ないか?いろいろ調査していると下記のような Windows Vista 以降の仕様が見つかりました。
セッション 0 の分離
http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx前置きが長くなりましたが
質問
1)上記のようなファイルコピーをするアプリケーション(UI無しでも)は
本来、どういった形式で実装するのがいいのでしょうか?
(サービスではなく、他の方法がいいのでしょうか?)
2)Anti Virusソフトやその他一般のソフトがタスクトレイに常駐している仕組みは
全然違う物なのでしょうか?宜しくお願い致します。
回答
-
1)選択の余地なくインストーラの仕事です。というか、こういったことをするためにインストーラがあるんですが?
ま、それはともかくとして、ClickOnceについては佐祐理さんが提示していますので、違う方法を。。。
ActiveDirectoryが導入されているようですので、.NET Framework 3.5 配置ガイド (管理者向け)にあるようにADで配信してしまう方法があります。WindowsInstaller以外でも利用できるので、かなり使えます。ただし、UIなしで動作することが条件となりますので、どんなものでも使えるか?というと何とも言えません(それとバッチファイルが動くかどうかもわかりません)。
2)佐祐理さんが書いてるので省略。
ちなみに、セッション0の分離は、カーネルドライバの話であってサービスとは関係ありません。サービスが画面にUIを出せないのはサービスの動作しているアカウントと、画面表示を行えるアカウントが異なるからです(正確にはウィンドウステーションというちょっと特殊な概念があるのですが、感じとしてはアカウントが異なるのと同じレベルで違う程度と思っていても差し支えありません)。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク ゆきもん 2010年10月12日 2:39
すべての返信
-
1)選択の余地なくインストーラの仕事です。というか、こういったことをするためにインストーラがあるんですが?
ま、それはともかくとして、ClickOnceについては佐祐理さんが提示していますので、違う方法を。。。
ActiveDirectoryが導入されているようですので、.NET Framework 3.5 配置ガイド (管理者向け)にあるようにADで配信してしまう方法があります。WindowsInstaller以外でも利用できるので、かなり使えます。ただし、UIなしで動作することが条件となりますので、どんなものでも使えるか?というと何とも言えません(それとバッチファイルが動くかどうかもわかりません)。
2)佐祐理さんが書いてるので省略。
ちなみに、セッション0の分離は、カーネルドライバの話であってサービスとは関係ありません。サービスが画面にUIを出せないのはサービスの動作しているアカウントと、画面表示を行えるアカウントが異なるからです(正確にはウィンドウステーションというちょっと特殊な概念があるのですが、感じとしてはアカウントが異なるのと同じレベルで違う程度と思っていても差し支えありません)。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク ゆきもん 2010年10月12日 2:39
-
いえいえ、セッション0分離はカーネルドライバーではなく、サービスのことです。ウィンドウステーションのセッションID…だったかな。ともかく、従来はサービスとローカルコンソールが共にセッションID 0番を使用していたのですが、Vistaからはローカルコンソールが1番以降に変更され、サービスからローカルコンソールにUIを出力できなくなっています。タスクマネージャーの列の選択で「セッションID」を表示するとよくわかります。
とっちゃんさんの言われるようなアカウントが理由なら、コンソールと同じアカウントでサービスを起動すれば…という話になりますがアカウントが原因ではないので描画することができません。カーネルドライバーのことなら、CPUのリングプロテクション Ring0のことでしょうか。 -
-
佐祐理さん
今後のためにテストアプリ(サービス)を作って確認しました。
下記のURLを参考に。
セッション 0 の分離
http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx「WTSSendMessage() によるメッセージ ボックスの作成」をやってみました。
結果
Windows XPの場合 セッションID 0 出力させて、メッセージボックス確認できました。
Windows 7 の場合 セッションID 1 出力させて、メッセージボックス確認できました。Windows XPの場合 セッションID 1 出力させて、表示無し(勿論下記のエラー)
(ERROR_CTX_WINSTATION_NOT_FOUND 7022 指定されたセッションが見つかりませんでした。)
動作に気になる箇所があるので質問したいのですが、
.Net の話なので別フォーラムに投げてみます。ありがとうございました。