私の現在のプロジェクトでは、Windowsサービスとして実行されるアップグレードされた.exeファイルを展開します。既存の.exeを新しいバージョンで上書きするには、現在次のことを行う必要があります。
これが完全にスクリプト化/自動化されたアップグレードになるように、再起動を回避したいと思います。
再起動を回避する方法はありますか? Windowsに古い.exeに対するデスグリップを放棄させるコマンドラインツールでしょうか?
sc delete "service name"
サービスを削除します。 scユーティリティ は、installutilを探し回るよりもはるかに簡単です。まだサービスを停止していない場合は忘れないでください。
以下のコマンドを使用して、更新前にサービスを停止(および更新後に再起動)することはできませんか?
net stop <service name>
net start <service name>
サービスをテスト/展開しているときはいつでも、サービスが停止している限り、再インストールせずにファイルをアップロードできます。発生している問題が異なるかどうかはわかりません。
私はあなたと同じ問題を抱えていました。アンインストールしたいシステムサービスがあり、その後アップデートの一部として再インストールします。特定のシステムでは、これは再起動しないと機能しません。問題は、DeleteService()の呼び出しがokを返すことでしたが、次のCreateService()の呼び出しは、サービスはまだ存在するが、削除のマークが付いていることを示します(エラーコード1072)。レジストリはサブキーがまだ存在するため(HKLM\System\CurrentControlSet\Servicesの下)、それを反映しますが、「DeleteFlag」は1に設定されました。それ以降、状況を修正できるのは再起動のみです。
動作しないもの:
しかし、ここでうまくいったことがあります:
私は、スタックオーバーフローに関するいくつかの記事で、net.exeにも開始/停止機能があることに気付きました(sc.exeユーティリティのみ知っていました)。そして奇妙なことに、「net stop svcname」と「sc delete svcname」が機能しました!したがって、net.exeは、私がしていないことをしなければなりません。
しかし、net.exeにはControlService()へのインポートが含まれていないので、どのようにサービスを停止しますか? net.exeはnet1.exeを生成しますが、net1.exeはControlService()もインポートしません。素晴らしいAPI Monitorユーティリティ( http://www.rohitab.com/apimonitor )を使用してnet1.exeの動作を確認しましたが、期待できるものを呼び出すことはありませんでした。
しかし、その後、NETAPI32.DLLからNetServiceControl()をインポートすることがわかりました(少なくとも名前に「Service」が含まれていました!)。 MSDNは、この関数は廃止されたと言っています。それにもかかわらず、私はLMSvc.hのプロトタイプといくつかのパラメーターの説明をここで見つけました: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html NETAPI32.DLLをロードしてNetServiceControl(NULL, service_name, 3, 0, 0)
(3はSERVICE_CTRL_UNINSTALL用で、これは停止に使用されます)を使用すると、サービスはその後停止します。また、DeleteFlagまたは再起動せずに、削除して再インストールすることもできます!
したがって、削除の問題ではなく、サービスを適切に停止することは問題ではありませんでした。そして、NetServiceControl()がトリックを行います。長い投稿で申し訳ありませんが、同様の問題を抱えている人を助けるかもしれないと思いました。 (参考のため、Win7 SP1 x64を使用しています。)
.netの場合(すべてのWindowsサービスで機能するかどうかわかりません)
サービスのパブリックインターフェースを変更しない限り、アップグレードやサービスのアップグレード版をデプロイすることもよくあります...
StingyJackとmcbalaが指摘したように、またマイクLのコメントを参照すると、私の経験では、Windows 2000マシンで.Netサービスをアンインストール/再インストールするとき、「installutil/u」doesが必要ですサービスが以前に停止されていた場合でも、再起動します。一方、「sc/delete」は再起動を必要としません-サービスがすぐに削除されます(停止している限り)。
「installutil/u」に再起動が必要な理由があるのかと疑問に思うことがよくあります。
(Windowsがファイルを保持しているため)
代わりに、サービスの停止の直後にCtrl + Alt + Delを実行し、サービスの.exeを強制終了します。よりも、再起動せずにサービスをアンインストールできます。これは過去に私に起こり、それはあなたが再起動する必要がある部分を解決します。
サービスを手動で削除する必要がある場合:
リストがサービスで更新される前に再起動する必要があります
ジョナサンとチャールズの両方が正しい...最初にサービスを停止し、次にアンインストール/再インストールする必要があります。 2つの回答を組み合わせると、完璧なバッチファイルまたはPowerShellスクリプトが作成されます。
ハードな方法で学んだ注意点について言及します。Windows2000 Server(おそらくクライアントOS)も、再インストールの前に再起動が必要になります。ボックスが再起動されるまで完全にクリアされないレジストリキーが必要です。 Windows Server 2003、Windows XP以降のバージョンのOSでは、このような苦痛はありません。
.NET FrameworkでパックされたInstallUtil.exeを使用しています。
アンインストールの使用法は、InstallUtil '\ path\to\Assembly\with\the\installer\classes'/uです。たとえば、installutil MyService.HostService.exe /u
/u
スイッチはアンインストールの略で、それなしではユーティリティはサービスの通常のインストールを実行します。ユーティリティは、実行中のサービスを停止しますが、Windowsがサービスファイルをロックし続けることに問題はありませんでした。 [〜#〜] msdn [〜#〜] でInstallUtilの他のオプションについて読むことができます。
追記:パス変数にinstallutilがない場合は、次のようにフルパスを使用します:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "C:\MyServiceFolder\MyService.HostService.exe" /u
または64ビットバージョンが必要な場合は、「C:\ Windows\Microsoft.NET\Framework64\v4.0.30319 \」にあります。パスのバージョン番号は、.NETバージョンによって異なります。