webdevqa.jp.net

再起動せずにWindowsサービスをアンインストールしてそのファイルを削除する方法

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

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

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

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

45
Nate Sauber
sc delete "service name"

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

78
StingyJack

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

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

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

14
Jonathan S.

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

動作しないもの:

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

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

私は、スタックオーバーフローに関するいくつかの記事で、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を使用しています。)

14
cxxl

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

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

サービスのパブリックインターフェースを変更しない限り、アップグレードやサービスのアップグレード版をデプロイすることもよくあります...

3
Charles Bretana

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

「installutil/u」に再起動が必要な理由があるのか​​と疑問に思うことがよくあります。

3
Tao

(Windowsがファイルを保持しているため)

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

2

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

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

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

2
chrishawn

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

ハードな方法で学んだ注意点について言及します。Windows2000 Server(おそらくクライアントOS)も、再インストールの前に再起動が必要になります。ボックスが再起動されるまで完全にクリアされないレジストリキーが必要です。 Windows Server 2003、Windows XP以降のバージョンのOSでは、このような苦痛はありません。

2
Mike L

.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バージョンによって異なります。

0
MSkuta