sc delete <service name>
を使用してWindowsサービスを削除しようとすると、次のエラーが発生します。
[SC] DeleteServiceが失敗しました1072:
指定されたサービスは削除のマークが付けられています。
私がすでにやったこと:
明らかにサービスを停止しました。 sc queryex "<service name>"
は次のような結果になります。
SERVICE_NAME: Stub service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1067 (0x42b)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
Microsoft管理コンソールが確実に閉じられるようにします (taskkill /F /IM mmc.exe
)、
レジストリからキーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>を削除しました 。
この削除により、services.msc
はまだサービスを表示しますが(名前は表示されますが、ステータスやスタートアップの種類は表示されません)、説明は「<説明の読み取りに失敗しました。」です。エラーコード:2>」プロパティを表示しようとすると、「指定されたファイルが見つかりません」というメッセージが5回表示されます。
問題は解決しません。
次のステップは何ですか?
サービスが「削除マーク」されたままになる原因はいくつかあります。
SysInternalsのProcess Explorerが開きます 。閉じると自動的にサービスが削除されます。
Microsoft管理コンソール(MMC)が開きます 。すべてのインスタンスが確実に閉じられるようにするには、taskkill /F /IM mmc.exe
を実行します。
サービスコンソールが開きます 。サービスコンソールはMMCによってホストされているため、これは前のポイントと同じです。
イベントビューアを開く 。繰り返しますが、これは3番目のポイントと同じです。
キーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{サービス名}が存在します .
他の誰かがサーバーにログインしています そして前述のアプリケーションの1つを開いています。
Visual Studio serviceのデバッグに使用される)のインスタンスが開いています。
これは、サービスコンソールを開いたままにしたことによっても発生する可能性があります。 Windowsはサービスが閉じられるまで実際にはそのサービスを削除しません。
私の場合はServices
を閉じた後にうまくいきました。 Services.msc
が開いているかどうかを確認し、開いている場合は閉じてTask Manager
にサービスのプロセスが見つかっているか確認します。
やあみんな私は同じ問題を抱えていた、最後に私はサービスプロセスを殺すことにしました。
それはステップの下に試してみてください:
サービスのプロセスIDを取得
sc queryex <service name>
とプロセスを殺す
taskkill /F /PID <Service PID>
つまり、サービスはまだservices.mscで無効として表示されています。 services.mscを閉じて、管理者として開いてください。サービスは表示されません。では、コマンドを使ってサービスをインストールします。
installutil「サービスのパス」
上記のようにレジストリキーを削除すると、サービスが停止状態のままになります。次の手順は私のために働いた:
タスクマネージャを開く>サービスタブを選択>サービスを選択>右クリックして「処理に進む」を選択>プロセスを右クリックしてプロセスの終了を選択
その後サービスは消えます
これは私のために働いたものです: - 私は同じ問題にぶつかりました:私のサービスは「削除のためにマークされました」で立ち往生していました。 - services.mscを開きました既にアンインストールされていましたが、実行中として表示されました。 - サービスが制御メッセージを受信する状態にないというエラーメッセージが表示されました。それにもかかわらず、サービスは停止されました。 - クローズドservices.msc。 - services.mscを再オープンしました。 - サービスは消えました(サービスのリストに表示されなくなりました)。
(環境はWindows 7でした。)
Windows 7以降のWindowsバージョン(未確認ですが、Windows Server 2012 R2の最新の経験による)では、Service Control Manager(SCM)がより厳密になっているようです。
Windows 7では、別のプロセスが生成されるだけですが、サービスが停止しているように見えても、サービスプロセスがまだ存在しているかどうかをチェックしています。
ここではWindows APIコードについて話していますが、何が起こっているのかをはっきりと説明したいので、このシーケンスは前述のエラーにつながる可能性があります。
SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);
SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state
DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;
// any further calls to CreateService/DeleteService will fail
// if service process is still around
SERVICE_STOPPED状態がすでに報告された後でサービスプロセスがまだ存在する理由は驚くにあたらない。これは通常のプロセスで、メインスレッドはStartServiceCtrlDispatcher
APIの呼び出しで「動かなくなる」ので、最初に制御停止アクションに反応しますが、残りのコードシーケンスを実行する必要があります。
SCM/OSがこれを適切に処理してくれないのは残念です。プログラムによる解決方法は、簡単で正確です。サービスを停止する前にサービス実行可能ファイルのプロセスハンドルを取得してから、このハンドルが通知されるのを待ちます。
システム管理の観点から問題に取り組む場合、解決策はサービスプロセスが完全に消えるのを待つことでもあります。
チェックするためのもう1つのことが発見されました - タスクマネージャを見てください - 他のユーザーがこのボックスに接続されている場合、たとえ「切断」されていても.
私の場合は、taskkill /f /im dongleserver.exe
を実行します。ここでdongleserver.exe
は私のプログラムのexeファイルです。
それから私はすでに私のプログラムを再インストールすることができます。
私の場合は、eventLogソースの作成中に未処理の例外が原因で発生しました。 try catchを使用して原因を突き止めてください。
現在開いているウィンドウをすべて閉じてから次のコマンドを実行すると、問題が解決しました。
taskkill /F /IM mmc.exe
@MainMaによって提供されたステップがうまくいかなかった場合は、次のステップに従ってください。
ステップ1 Windowsのタスクマネージャまたはtaskkill/F/PIDを使用してプロセスを強制終了してください。あなたはコマンド 'sc queryex'によってプロセスのpidを見つけることができます。それでもアンインストールできない場合は、次の手順を試してください。
ステップ2上記の場合
Windows用の自動実行 名前でサービスを検索し、結果を削除します。
従うべきステップ:
step-1 C:\ Windows\Microsoft.NET\Framework\v4.0.30319に移動します。
ステップ2 runコマンド:installutil/uフルパス/ servicename.exe
step-3 サービスパネルを閉じて再度開く
ステップ4 run command:installutil full-path/servicename.exe
私は自分のwinサービスを検証するためにApplication Verifierを使っていたときにこの問題を抱えていました。 App Verを閉じた後でも、サービスの削除がブロックされています。 App Verからサービスを削除するだけで問題が解決し、サービスはすぐに削除されました。削除しようとした後も、まだサービスを使用しているプロセスがあるようです。
エラーの主な理由はプロセスが停止されていないことです。それを解決するには、タスクマネージャを起動してサービスにアクセスし、そのサービスのプロセスに移動してプロセスを終了するよりもまだ自分のサービスを参照できるかどうかを確認します。問題よりも完全に解決されます。
ほとんどの場合、サービスの削除は失敗します
protected override void OnStop()
サービスを停止するときにエラーをスローします。 try catch内でものをラップすると、削除マークの誤りを防ぐことができます
protected override void OnStop()
{
try
{
//things to do
}
catch (Exception)
{
}
}