説明に基づく私の推測では、サービス (またはむしろレジストリ キー) が実際に存在するということです。手動で介入しないと、これを回避することはできません。実際にサービスを削除したように見えますが、停止していないように見えます (または停止できません)。
サービスが SCM データベースから削除されたときにサービスがまだ実行されている場合、サービス キーは内部的に削除対象としてマークされます。また、起動時にキーを削除するようにシステムに指示する追加の値がキーに含まれます。システムが正常にシャットダウンされた場合、削除するサービスの内部リンク リストを使用してサービス キーが削除され、システムが再起動する前に削除されます。ただし、システムがクラッシュした場合、キーはブート時および SCM がサービスの起動を開始する前に削除されます。
ここで問題を引き起こしているのは、おそらく内部リンク リストです。SCM API を使用すると、それが実行されるからです。これを回避する 1 つの方法 (私は過去にこれを実行しました) は、戦略的に適切な時点でレジストリ内のキーの名前を変更し、SCM API を使用する代わりに起動時に削除されるように設定することです。
補足: MSI 内では、コード (バッチ ファイルまたはカスタム アクション) を使用する代わりに、常にServiceInstall
/ServiceControl
とテーブルを使用する必要があります。Registry
これらのアクションはすでに存在しており、順序付けする必要があるだけです。