web-dev-qa-db-ja.com

Windowsサービスの展開を自動化する最良の方法は何ですか?

Visual Studio 2010でC#を使用してWindowsサービスを作成しました。インストールプロセスの自動化について多くの調査を行いました。たくさんのアドバイスをもらいましたが、どれも私にはうまくいきませんでした。私が作成したWindowsサービスには多くの依存関係があり、インストール中にクライアントがUIを操作しないようにしたいと思います。インストーラー内のすべての依存関係を含むこのためのセットアッププロジェクトを作成しました。

関係するプロセス:

  • Windowsサービスのビルドを作成する
  • セットアップファイル(.msi)をリモートの場所にプッシュします
  • .msiを呼び出し、ユーザーの操作なしでサイレントにサービスをインストールします。

私がこれまでにしたこと:

  • ファイルをリモートの場所にプッシュするPowerShellスクリプトを作成しました
  • PowerShellスクリプトを実行し、サービスをインストールします

PowerShellスクリプトを覚えておいてください

sc create "servicename" binpath="somepath"

setup Projectを使用して作成された.msiファイルをインストールするためではなく、プロジェクトディレクトリからサービスをインストールするために使用されます。これらは2つの大きく異なるものです。これがわからない場合は答えないでください。

可能な解決策:

今私の質問はです。 Windowsサービスインストーラーをリモートの場所にプッシュするにはどうすればよいですか?また、カスタムビルド引数を作成し、msbuild拡張パックまたはExecタスクを使用してサービスをインストールするにはどうすればよいですか?

セットアッププロジェクトによって作成された(.MSI)を使用してサービスをインストールしていない人にとって、これは愚かで苛立たしい質問に聞こえることを私は知っています。しかし、エンタープライズ環境で数週間から解決しようとしている要件です。

25
user2133617

私はPowerShellスクリプトから大部分の作業を行います。

  1. 前述のようにmsbuildExecタスクを使用して、ビルドプロセスに追加します。これは、execタスクを使用してPowerShellスクリプトを実行する に関する非常に優れた記事です

  2. VS 2010を使用しているため、 セットアップおよび展開プロジェクト は非常に簡単です。ソリューションに1つ追加し、サービスプロジェクトの出力をソリューションに追加します。これは、 Windowsサービスのセットアッププロジェクトの追加 に関する記事です。

  3. PowerShellスクリプトを使用して、インストーラー.msiをリモートサーバーにコピーします。ファイル共有にアクセスできる場合は、単にcopy-item [source] [destination]を使用できます。

  4. リモートマシンでサービスを停止します。 (get-service -ComputerName [destination] -Name [service-name]).Stop()を使用できます( この質問 から)

  5. psexecpsexec \\remotecomputer "[msi-destination-path]" /qnを使用してサービスをサイレントインストールします。msiの残りのコマンドラインオプションは次のとおりです。

  6. (get-service -ComputerName [destination] -Name [service-name]).Start()を使用してサービスを開始します

また、宛先サーバー、サービス名などの一連のパラメーターをPowerShellスクリプトに追加します。これにより、ビルドプロセスのこの部分の保守がはるかに簡単になります。ビルドエージェントは、ほとんどの場合、移行先マシンの管理者である必要があります。

最後に、PowerShellビルドスクリプトをソース管理に配置してください。

編集(2014年6月)
VS 2013に再びインストーラープロジェクトがあります! (申し訳ありませんが、VS 2012)

また、見つかった場合 、セットアッププロジェクトを使用せずにWindowsサービスをインストールする方法についてのこの素晴らしい答え

18
Zachary Yates