Windowsサービスのアンインストールを強制する方法


173

installUtil.exeを使用してWindowsサービスをインストールしました。

コードを更新した後、installUtil.exeを再度使用して、最初に元のバージョンをアンインストールせずにサービスをインストールしました。

サービスをアンインストールしようとすると、installUtil.exeはアンインストールを正常に完了しますが、サービスはまだ表示されます。

プロパティを変更しようとすると、「サービスに削除のマークが付けられています」というメッセージが表示されます。

どうすれば削除を強制できますか(できればサーバーを再起動しないでください)?


サービスがハングしていて削除が機能しない場合は、Windowsサービスのアンインストールを強制する方法
Wernfried Domscheit

回答:


469

過去に気付いたのは、サービスビューアを実行していると、サービスが完全に削除されないため、事前に閉じているということです。


70
ビューアを開いたままにしておくと、サービスの削除が中断されるとは信じられません。
ドラえもん

1
これはマイクロソフトからばかげていますが、実際に機能します。説明できない理由により、サービスビューアを開いていると、サービスが適切に削除されない場合があります。
ivantod 2013

1
この答えは何百もの同様のコメントを持つつもりだと思います。私はこの愚かな問題で30分を失ったばかりです...
PierrOz 2015年

2
SysInternalsプロセスエクスプローラーもサービス(そしておそらくタスクマネージャーも)をロックしているようですので、それらも必ず閉じてください!
danio 2015

3
また、cmdプロンプトを使用してください。PowerShellはエラーを表示しませんが、削除もしません。
Bruno Faria

144

マシンを再起動する必要はありません。管理者特権モードでcmdまたはPowerShellを起動します。

sc.exe queryex <SERVICE_NAME>

次に、いくつかの情報を取得します。PID番号が表示されます。

taskkill /pid <SERVICE_PID> /f

/ fは強制停止する場所です。

これで、サービスをインストールまたは起動できます。


2
再起動以外のすべてが失敗した場所で問題なく動作しました-満足しています!
DaveF、2011年

36
これは私にとってはうまくいきませんでした-私のサービスのpidは0を返し、重要なシステムプロセスを削除することができませんでした。
プラズマ147

4
A +すばらしい。上記のsc deleteを使用します。
Zone12 2013年

7
PIDが0になったため、機能しませんでした。これで問題が解決しました- (SC)DeleteService FAILED 1072
Web-E

3
絶対に役に立ちます!私の場合、再起動以外は何もうまくいきませんでした。レジストリのサービスディレクトリも削除しないでください。ただし、1つの落とし穴:PowerShellで作業している場合は、を使用しますsc.exe queryex <SERVICENAME>。のでscまたの別名であるSet-Contentあなたがそれを使用するとき、それは静かに失敗します。
Ifedi Okonkwo

97

アンインストールが万が一削除されない場合は、SC.EXEを使用してWindowsサービスを強制的に削除できます。

sc delete <Service_Name>

「MSテクノブログ」で詳細を読むサービスMMCからのサービスの強制削除


5
これをありがとう。「サービス名」が「表示名」と同じでない場合は、サービスのプロパティで「サービス名」を取得できます。
GuiSim

8
sc deleteまた、サービスに対して開いているハンドルがある場合は、「サービスは削除対象としてマークされています」と報告されます。
マット

@GuiSimそのおかげで、私は多くの人が私のように表示名を付けているのではないかと思います!
nik0lai

試してみましたが、次のメッセージが表示されました:[SC] DeleteService FAILED 1072:指定されたサービスは削除対象としてマークされています。
Andrew W. Phillips

37

これが役に立たないことはわかっていますが、将来的には誰かを助けるかもしれません。

同じ問題が発生しました。サービスマネージャーを閉じて再度開くと、レジストリから両方のエントリが削除され、サービスのアンインストールが完了しました。

それ以前は、サービスマネージャーを更新しても効果がありませんでした。


1
ご利用いただきありがとうございます。私の経験は、あなたが説明したとおりのものでした。
pk。

10
sc delete sericeName

これを行う前に、サービスが停止していることを確認してください。私はこの作品をほとんど見ました。ウィンドウが何かに引っかかって、再起動を要求するのを見たことがあります。


ちょうど追加..他の誰かがその問題に遭遇した場合に備えて、sc deleteコマンドを実行するためのアクセス権を取得するには、管理者としてdosプロンプト/.NETプロンプトを実行する必要がありました。
Dav.id

SC DELETEの前に "NET STOP <serviceName>"を実行して、削除する前にサービスが停止したことを確認してください
Adi

これも私の経験でしたが、部分的にしかアンインストールされていない頑固なサービスを削除するために、結局リブートする必要がありました(コード2でスナップインに表示されたままです)。再起動により、ついにそれはなくなりました。
delliottg 2016年


4

残念ながら、サーバーを再起動する必要があります。これで「削除された」サービスが削除されます。


12
いいえ。再起動する必要はありません。私の解決策を参照してください:)
johan

2
私は実際にはuser186749のソリューションがさらに好きです。素敵できれい。
マッケイ

3

この答えが誰かを助ける場合に備えて:ここにあるように、管理者としてSysinternals Autorunsを実行する手間を大幅に省くことができます。「サービス」タブに行き、サービスを削除してください。

これは、レジストリを編集する権限のないマシンで私に役立ちました。


3

にあるサービスのレジストリキーを手動で削除できますHKLM\SYSTEM\CurrentControlSet\Services。その後、サービスコントロールマネージャーにサービスが表示されなくなり(変更を確認するために更新または再起動する必要があります)、サービスを通常どおり再インストールできます。


Windows 2012 R2では、サービスMMCスナップイン(Services.MSC)に「説明の読み取りに失敗しました。エラーコード:2」が表示されます。他のすべてのMMCが閉じられ、他のユーザーがログインしていないことを確認したにもかかわらず。
Signal15

確かに、Windows 8とWindows 10でのみテストされました(そして動作しました)。
フェルナンドゴンザレスサンチェス

それでようやく私の問題が解決しました。プロジェクトにサービスインストーラーを追加するのを忘れて、インストール後にサービスを削除できませんでした。サービス登録ツリーの内容を削除する前に、サービス登録ツリーをエクスポートすることをお勧めします。どうもありがとう!
user3772108

2

以下はマシンを再起動しなくても機能します:

  1. レジストリ\ HKEY_LOCAL_MACHINEで<Your Service Name>(キーと値の両方)を検索します
  2. 「レガシー」の値を0に設定します

1

アンインストールを呼び出す前にサービスを停止してみましたか?私はランダムにこの問題を抱えていました。いつか私は再起動せずにそれを削除することができました。私の推測では、まだ実行中のサービスに関係していると思います


1

私は遅れていますが、奇妙に見えるかもしれない代替案を追加したいのですが、私は別の方法を見ていませんでした:

私は毎晩CIプロセスにWindowsサービスをインストールしているので、常に機能し、完全に自動化されているものが必要でした。何らかの理由で、サービスをアンインストールした後、サービスは常に長い間(5分以上)削除対象としてマークされていました。したがって、再インストールバッチスクリプトを拡張して、サービスが本当に削除されるようにしました(簡易バージョン)。

REM Stop the service first
net stop My-Socket-Server

REM Same as installutil.exe, just implemented in the service
My.Socket.Server.exe /u

:loop1
    REM Easy way to wait for 5 seconds
    ping 192.0.2.2 -n 1 -w 5000 > nul
    sc delete My-Socket-Server
    echo %date% %time%: Trying to delete service.
    if errorlevel 1072 goto :loop1

REM Just for output purposes, typically I get that the service does not exist
sc query My-Socket-Server

REM Installing the new service, same as installutil.exe but in code
My.Socket.Server.exe /i

REM Start the new service
net start My-Socket-Server

私が見ることができるのは、サービスが最終的に通過するまで約5分間(!)削除のマークが付けられていることです。最後に、私はこれ以上手動の介入を必要としません。将来的にスクリプトを拡張して、一定の時間の後に何かが発生するようにします(たとえば、30分後の通知)。


1

これは私のために働いた

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

その出力が表示されるReturnValue : 16場合、コマンドは「このサービスはシステムから削除されています」で失敗しました。MicrosoftのReturnValuesの全リストは こちら
Signal15

1

サービスでサービスを停止できない場合は、タスクマネージャでWindowsサービスのexeを停止できます。その後、サービスを削除できます。


0

サービスリストを更新すると、常に私に役立ちました。サービスウィンドウが開いている場合は、何らかの理由で存在するメモリを保持します。F5と私は再インストールしています!


0

また、アクティブな実行可能ファイルのインスタンスがないことを確認してください(おそらく、サービスとは関係なく、何らかの理由で実行されていた可能性があります)。

私はMMCを開いたり閉じたりして、強制終了するPIDを探していました。しかし、プロセスエクスプローラーを見ると、忘れられていたスケジュールされたバッチから実行されている既存のプロセスがいくつかありました。それらを殺した。仕事が終わりました。


0

そのテーマにはフォーラムの質問がたくさんあります。

私はWindows APIで答えを見つけました。サービスをアンインストールした後、コンピューターを再起動する必要はありません。あなたは電話する必要があります:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

これにより、サービスのハンドルが閉じます。Windows 7では、私の問題は解決しました。私がやります:

  • サービスを停止
  • ハンドルを閉じる
  • サービスをアンインストールする
  • 3秒待つ
  • 新しいexeをディレクトリにコピーします
  • サービスをインストールする
  • サービスを開始
  • ハンドルを閉じる

2
開いているハンドルを持つプログラムに含まれていない場合、ハンドルはどこで閉じますか?
マット

0

TopShelfが混乱したり、サービスが他の何らかの理由で失敗したりする場合、私たちはOctopus Deployインスタンス用にいくつかの場所からまとめた次のPowerShellを使用します。

$ServiceName = 'MyNaughtyService'
$ServiceName | Stop-Service -ErrorAction SilentlyContinue
# We tried nicely, now KILL!!!
$ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and
$ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
Stop-Process $ServicePID -Force

0

また、次の点にも注意してください。

sc delete "ServiceName"

PowerShellでは機能しません。scは、PowerShellのコマンドレットSet-Contentのエイリアスです。あなたがする必要があります:

sc.exe delete "ServiceName"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.