サービスがあります。少し前にインストールしました。サービスを更新する必要があります。 [プログラムの追加と削除]に移動してサービスを探しましたが、そこにインストールされていません。 services.mscを調べたところ、停止しました。開始と停止ができました。管理者としてコマンドプロンプトを実行し、sc delete [サービス名]を実行したところ、「指定されたサービスはインストールされたサービスとして存在しません」というメッセージが表示されました。コマンドプロンプトでscクエリを実行しましたが、返されません。インストーラーを右クリックし、アンインストールをクリックして、「このアクションは現在インストールされている製品にのみ有効です」と表示しました。私も修理を試みましたが、同じメッセージが表示されました。
マシンを数回再起動しましたが、このサービスをアンインストールできませんでした。 VisualStudioと共にインストールされた基本的なセットアッププロジェクトテンプレートを使用しています。プログラムの名前を変えて、バージョン番号を増やしてみました。
明らかに存在するサービスをアンインストールし、将来これが発生しないようにするにはどうすればよいですか?
サービスインストーラーを含む.exeがある場合は、InstallUtil.exe /u <process.exe>
を使用します。InstallUtil.exeは\Windows\Microsoft.Net\Framework\v4.0.30319
にあります。
セットアッププロジェクトでは、すべてのカスタムアクションにサービスを含め、アンインストールも行います
(プロジェクトを右クリック、カスタムアクション)
hth
マリオ
**セットアップのみを使用して行う必要がある場合は、以下に従ってください。
これは、既存のサービスの削除(アンインストール)を明示的に実装してから、新しいバージョンをインストールできるようにすることで処理できます。このためには、ProjectInstaller.Designer.csを次のように更新する必要があります。
InitializeComponent()の先頭に次の行を追加することを検討してください。これは、現在のインストーラーがサービスの再インストールを試みる前に、既存のサービスをアンインストールするためのイベントをトリガーします。ここで、サービスがすでに存在する場合はアンインストールします。
次の名前空間を追加します。
using System.Collections.Generic;
using System.ServiceProcess;
前に説明したように、以下のコード行を追加します。
this.BeforeInstall += new
System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall);
例:
private void InitializeComponent()
{
this.BeforeInstall += new System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall);
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller1
//
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
//
// serviceInstaller1
//
this.serviceInstaller1.Description = "This is my service name description";
this.serviceInstaller1.ServiceName = "MyServiceName";
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new System.Configuration.Install.Installer[]{
this.serviceProcessInstaller1,
this.serviceInstaller1
}
);
}
イベントによって呼び出される以下のコードは、サービスが存在する場合はアンインストールします。
void ProjectInstaller_BeforeInstall(object sender, System.Configuration.Install.InstallEventArgs e)
{
List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices());
foreach (ServiceController s in services)
{
if (s.ServiceName == this.serviceInstaller1.ServiceName)
{
ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
ServiceInstallerObj.Context = new System.Configuration.Install.InstallContext();
ServiceInstallerObj.Context = Context;
ServiceInstallerObj.ServiceName = "MyServiceName";
ServiceInstallerObj.Uninstall(null);
break;
}
}
}
PS:上記の変更に加えて、セットアップバージョン、ProductCode(、およびオプションのUpgradeCode)を更新して、優れたプラクティス、より良いバージョン管理、追跡、およびメンテナンスを行うことも検討してください
サービスが[プログラムの追加と削除]にリストされていないことは完全に正常であり、そのリストはサービスではなくソフトウェアパッケージ用です。 (1つのパッケージまたはプログラムに複数のサービスが含まれている場合がありますが、通常はインストールされません。)
どうやら、サービスは製品の一部としてではなく手動でインストールされたようです。たとえこれが通常、インストールパッケージを持っている製品と一緒にインストールされるとしてもです。
sc delete
の使用は正しいです。サービスの(短い)名前を二重引用符で囲む必要があります(単一の単語でない限り)が、それ以外は何も含めません。
それができない場合は、レジストリのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
にアクセスします。32ビットと64ビットの両方です(それぞれregedt32.exe
とregedit.exe
)。そこで直接サービスを削除することもできますが、サービスの正確な名前と、sc
がその名前を認識せず、他のすべてが失敗した後にのみ直接レジストリアクセスを使用する理由を診断するために、可逆的な変更から始める必要があります。レジストリをバックアップした後(オペレーティングシステムを指定してこの手順をグーグルで検索してください)。
そのサービスに関連するゴミをWindowsレジストリで調べてみましたか?.
次のフォルダを確認する必要があります:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \
今日も同じことが起こりました。唯一の解決策は、Windowsの追加/削除ツールからセットアップファイルを修復することでした。セットアップファイルを修復した後、アンインストールして再度インストールします。
他の誰かがこの問題に遭遇した場合に備えて:
私のために働いたのは、インストーラーの名前、バージョン、ProductCodeを更新することでした。とにかくバージョン管理の良い習慣に間違いなく従うべきです。