none
Windows サービスアプリケーションについて RRS feed

  • 質問

  • クライアント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ソフトやその他一般のソフトがタスクトレイに常駐している仕組みは
    全然違う物なのでしょうか?

    宜しくお願い致します。

    2010年10月11日 7:26

回答

  • 1)
    UI無しのサービス部分と、ログインユーザー向けに通知する常駐プログラムの2つで構成する必要があります。
    プログラムの更新という意味では、ClickOnce という仕組みも参考になります。アプリケーション開始時にサーバーに問い合わせて、更新があればダウンロードする、といった動作が可能です。

    2)
    Anti Virusソフトは、1)の2つに加えて、OSを監視するデバイスドライバなどいろいろなプログラムで構成されています。

    • 回答としてマーク ゆきもん 2010年10月12日 2:39
    2010年10月11日 9:03
  • 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
    2010年10月11日 10:41

すべての返信

  • 1)
    UI無しのサービス部分と、ログインユーザー向けに通知する常駐プログラムの2つで構成する必要があります。
    プログラムの更新という意味では、ClickOnce という仕組みも参考になります。アプリケーション開始時にサーバーに問い合わせて、更新があればダウンロードする、といった動作が可能です。

    2)
    Anti Virusソフトは、1)の2つに加えて、OSを監視するデバイスドライバなどいろいろなプログラムで構成されています。

    • 回答としてマーク ゆきもん 2010年10月12日 2:39
    2010年10月11日 9:03
  • 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
    2010年10月11日 10:41
  • いえいえ、セッション0分離はカーネルドライバーではなく、サービスのことです。ウィンドウステーションのセッションID…だったかな。ともかく、従来はサービスとローカルコンソールが共にセッションID 0番を使用していたのですが、Vistaからはローカルコンソールが1番以降に変更され、サービスからローカルコンソールにUIを出力できなくなっています。タスクマネージャーの列の選択で「セッションID」を表示するとよくわかります。
    とっちゃんさんの言われるようなアカウントが理由なら、コンソールと同じアカウントでサービスを起動すれば…という話になりますがアカウントが原因ではないので描画することができません。カーネルドライバーのことなら、CPUのリングプロテクション Ring0のことでしょうか。
    2010年10月11日 12:08
  • 佐祐理さん
    回答ありがとうございます。

    ClickOnce

    アプリケーションはVisual Studio(.Net VB)で開発していますが、
    構成は1ソリューションと1プロジェクトとなっております。
    (この開発環境が間違いなのかもしれません。)
    その為、ファイル数(プロジェクト数)が100を超えています。

    以前に調べたときは ClickOnce の場合はプロジェクト単位に発行するように
    なっていたので、使用できない(使用し難い)判断しました。
    調査不足かもしれませんので、もう少し調べてみます。

    ありがとうございました。

    2010年10月12日 2:25
  • とっちゃんさん
    回答ありがとうございます。

    ADで配信

    これは今後も(別件で)使えそうなので、少し調べてみます。
    ありがとうございました。

    2010年10月12日 2:26
  • 佐祐理さん

    今後のためにテストアプリ(サービス)を作って確認しました。
    下記の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 の話なので別フォーラムに投げてみます。

    ありがとうございました。

    2010年10月12日 2:38