46

私の現在のプロジェクトには、Windows サービスとして実行されるアップグレードされた .exe ファイルの展開が含まれます。既存の .exe を新しいバージョンで上書きするには、現在次のことを行う必要があります。

  1. サービスを停止する
  2. サービスをアンインストールする
  3. システムを再起動します (そのため、Windows はファイルの保持を解放します)
  4. 新しい .exe をデプロイする
  5. サービスを再インストールする
  6. アップグレードされたサービスを開始します。

これを完全にスクリプト化/自動化されたアップグレードにするために、再起動を避けたいと思います。

再起動を回避する方法はありますか? おそらく、Windows に古い .exe の死のグリップを放棄させるコマンド ライン ツールでしょうか?

4

10 に答える 10

78
sc delete "service name"

サービスを削除します。sc ユーティリティは、installutil を探し回るよりもはるかに簡単に見つけることができます。まだサービスを停止していない場合は、忘れずに停止してください。

于 2008-11-19T13:47:39.387 に答える
15

私はあなたと同じような問題を抱えていました。アンインストールしてから、アップデートの一部として再インストールしたいシステムサービスがあります。特定のシステムでは、これは再起動しないと機能しません。問題は、DeleteService()を呼び出すとokが返されることでしたが、次のCreateService()を呼び出すと、サービスはまだ存在しているが、削除のマークが付けられていることがわかります(エラーコード1072)。レジストリは、サブキーがまだそこにあるため(HKLM \ System \ CurrentControlSet \ Servicesの下)、「DeleteFlag」が1に設定されていることを反映します。その時点から、再起動するだけで状況を修正できます。

動作しないもの:

  • 「scdelete」の使用:Iと同じ問題が発生しました。呼び出しはokを返しますが、サービスは実際にはなくなっておらず、DeleteFlag=1のレジストリに残っています。
  • レジストリ内のキーを削除します。Service Managerはデータベースをメモリに保持しているようで、レジストリは次回の起動のためにデータベースのコピーにすぎません。
  • 待機ループの追加、.exeファイルの上書き準備の待機、プロセスの強制終了など。
  • サービスへのハンドルを閉じます。どれ??

しかし、これがうまくいったことです:

私はここstackoverflowに関するいくつかの記事で、net.exeにも開始/停止機能があることに気づきました(私はsc.exeユーティリティしか知りませんでした)。そして不思議なことに、「netstopsvcname」と「scdeletesvcname」が機能しました。したがって、net.exeは私が行わないことを実行する必要があります。

しかし、net.exeにはControlService()へのインポートが含まれていないので、どのようにしてサービスを停止しますか?net.exeがnet1.exeを生成することを知りましたが、net1.exeはControlService()もインポートしません。優れたAPIモニターユーティリティ(http://www.rohitab.com/apimonitor)を使用してnet1.exeの動作を確認しましたが、有望と思われるものは呼び出されませんでした。

しかし、それから、NETAPI32.DLL(名前に少なくとも「Service」が含まれている!)からNetServiceControl()をインポートすることがわかりました。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を使用しています。)

于 2012-07-09T16:15:26.190 に答える
14

以下のコマンドを使用して、更新前にサービスを停止 (および更新後に再起動) できませんか?

net stop <service name>
net start <service name>

サービスをテスト/展開するときはいつでも、サービスが停止している限り、再インストールせずにファイルをアップロードできます。あなたが抱えている問題が違うかどうかはわかりません。

于 2008-11-18T18:10:36.563 に答える
3

StingyJackとmcbalaが指摘し、Mike Lのコメントを参照すると、私の経験では、Windows 2000マシンでは、.Netサービスをアンインストール/再インストールするときに、サービスがあった場合でも「installutil/u」を再起動する必要があります以前に停止しました。一方、「sc / delete」は再起動を必要とせず、サービスをすぐに削除します(サービスが停止している限り)。

実際、「installutil/u」が再起動を必要とする正当な理由があるかどうか疑問に思うことがよくあります...「sc/delete」は実際に何か間違ったことをしている/何かをぶら下げたままにしていますか?

于 2009-03-11T17:31:37.780 に答える
3

.netの場合(すべてのWindowsサービスで機能するかどうかはわかりません)

  • サービスを停止します (これが問題の原因である可能性があります)。
  • InstallUtil -u [実行ファイル名]
  • Installutil -i [実行ファイル名]
  • サービスを再開...

サービスのパブリック インターフェイスを変更しない限り、アンインストールや再インストールを行わずに、サービスのアップグレード バージョンを展開することがよくあります...サービスを停止し、ファイルを置き換えて、サービスを再起動するだけです...

于 2008-11-18T18:28:30.833 に答える
2

(したがって、Windowsはファイルの保持を解放します)

代わりに、サービスの停止の直後にCtrl + Alt + Delを実行し、サービスの.exeを強制終了します。それよりも、再起動せずにサービスをアンインストールできます。これは過去に私に起こりました、そしてそれはあなたが再起動する必要がある部分を解決します。

于 2008-11-19T13:25:55.717 に答える
2

ジョナサンとチャールズの両方が正しい...最初にサービスを停止してから、アンインストール/再インストールする必要があります。2 つの回答を組み合わせると、完璧なバッチ ファイルまたは PowerShell スクリプトが作成されます。

難しい方法で学んだ注意事項について言及します。Windows 2000 Server (おそらくクライアント OS も同様) では、再インストールの前に再起動が必要になります。ボックスが再起動されるまで完全に消去されないレジストリ キーが存在する必要があります。Windows Server 2003、Windows XP、およびそれ以降の OS バージョンでは、その問題は発生しません。

于 2008-11-18T18:41:19.950 に答える
2

サービスを手動で削除する必要がある場合:

  1. Regedit または regedt32 を実行します。
  2. 次のキーの下でサービスのレジストリ キー エントリを見つけます: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
  3. レジストリ キーを削除する

リストがサービスで更新される前に再起動する必要があります

于 2010-09-22T15:46:37.060 に答える
0

.NET Framework に同梱されている InstallUtil.exe を使用しています。

アンインストールの使用法は次のとおりです: InstallUtil '\path\to\assembly\with\the\installer\classes' /u たとえば:installutil MyService.HostService.exe /u

スイッチはアンインストールを表し、それ/uがないとユーティリティはサービスの通常のインストールを実行します。サービスが実行されている場合、ユーティリティはサービスを停止しますが、Windows がサービス ファイルをロックし続けるという問題は一度もありませんでした。MSDNで InstallUtil の他のオプションについて読むことができます。

PS: パス変数に 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 のバージョンによって異なります。

于 2014-04-17T06:48:29.580 に答える