2011-03-16 8 views
2

セットアップ(WIXで作成)をアンインストールすると、サービスの削除マークが残っていて、再度インストールするにはマシンを再起動する必要があります。 サービスが削除済みであることを確認し、他のインストールを行う前にコンピュータを再起動するようにユーザーに指示するにはどうすればよいですか?サービスに削除マークが付いているかどうか確認

+0

'ServiceController'から' ServiceController.GetServices() 'が見つかるかどうか不明ですが、試してみる価値があります。 –

答えて

3

は、一般的に何かがからWindowsを防止し、そのサービスにラッチされたままと、このシナリオが発生し、話す:次のように

のWiX XMLを使用し、WiXの処理後の再起動のスケジュールを設定する(どのようにウィックスの#hereとの説明)レジストリ内の構成を削除します。 (ほとんどの場合、サービスアプレットservice.mscは偶然バックグラウンドで開いたままです。)

検出のために、CreateServiceと他のService APIを読んでください。たとえば、サービスが削除対象としてマークされている場合は、CreateServiceの呼び出し時にERROR_SERVICE_MARKED_FOR_DELETEを受け取ります。

提案されている再起動ソリューションについて... Windowsは、ほとんど何らかの理由で再起動を必要としないほど十分に進歩しています。専用のカーネルドライバをインストールしている場合を除き、再起動する必要はありません。怠惰にしないでください!ユーザーを念頭に置いてください!インストーラのロジックを変更して、サービスアプレットのように競合する可能性のあるプログラムを検出し、終了を提案することをお勧めします。

+1

サービスアプレットがmmcにロードされているかどうかをどのように検出すると思いますか? – vkrzv

2

あなたのお役に立つかもしれない投稿です。元の質問はサービスのインストールですが、アンインストールとステータスについても説明します。ここで

How to install a windows service programmatically in C#?

は、あなたが最初の場所で「マークされ、削除のために」というメッセージを受信し、どのようにそれを回避するためにも理由を説明する記事です。クリストファー・ペインターズコメントパー

http://weblogs.asp.net/avnerk/archive/2007/09/05/windows-services-services-msc-and-the-quot-this-service-is-marked-for-deletion-quot-error.aspx

EDIT

、私はベストプラクティスを推進する意向のために、この答えを更新しています。 「マークされた削除用」メッセージを受け取っている間に、私の経験上、未公開のリソースよりもservices.mscコンソールを持っている結果がありました。再起動するカスタムアクションを作成するのが最善の方法ではありません。

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 
    ... 
    <InstallExecuteSequence> 
     <ScheduleReboot After="InstallFinalize"/> 
    <InstallExecuteSequence> 
</Wix> 
+0

-1が説明されているといいです – bitxwise

+0

WiXはサービスのインストール/アンインストールをサポートするWindowsインストーラを使用します。インストーラでカスタムアクションを記述しようとすると、悪い習慣とみなされます。参照:http://robmensching.com/blog/posts/2007/8/17/Zataoca-Custom-actions-are-generally-an-admission-of-failure –

+0

説明をありがとう。あなたがリンクしているブログ投稿で作成された多くの点に同意しますが、投稿の解釈に完全に同意しているわけではありません。戦争を始めようとはしていないが、ポストの作者は、なぜカスタム・アクションを作成するのかという理由で、カスタム・アクションは一般的に推奨されていないことを強調している。 しかし、OPは、実際の作業のためにカスタムアクションを記述するのではなく、タグでをWiX XML経由で使用する必要があります。これを反映するように答えを更新します。 – bitxwise

0

アンインストール中にServiceControl要素/テーブルを使用してサービスを停止していますか?もしそうなら、サービスは正常に停止しますか?そうでない場合は、サービス内で何が起こっているかを調べて、リソースがすべて解放されていることを確認し、リクエストされたときに正常にシャットダウンします。

プログラムでSCM APIを呼び出すためのカスタムアクションを記述する必要はありません。 Windowsインストーラがこれを処理できるはずです。 DeleteFlag=1(REG_DWORD)値を含む

私は(、両方持つ望ましくない副作用 CreateServiceまたは DeleteServiceのいずれかを呼び出す必要としない)それを行うためのAPIの方法を見つけることができません
+0

これは質問に答えません。一部のサービスは停止できません。サービスが安全にアンロードできないデバイスドライバに属している場合 – Ilya

+0

あなたが逃したポイントは、これはインストーラの問題ではなく、サービスコードを調べることでした。サービスを停止できない場合は、インストーラに停止を依頼しないでください。 –

+0

アンインストーラの目的は、サービスを削除することです。アンインストーラは最初に停止する必要がありますが、止めることができない場合は、それを削除します(システムシャットダウン時に削除のマークが付けられます)。ユーザーがアンインストーラの最後で再起動しないことを選択して再インストールすると、インストーラがサービスを再作成しようとすると問題が発生する可能性があります。 – Ilya

1

が、 HKLM\SYSTEM\CurrentControlSet\Services\ServiceNameはかなり指標であると思われますこの不幸な状態。

0

私の場合、アンインストール後にサービスが削除されました。なぜなら、オブジェクトを正しく処理しなかったからです(私の場合はrabbitmq-connection)。

これは疑問に対する直接的な回答ではありませんが、根本的な問題を解決するのに役立ちます。

関連する問題