2012-03-27 32 views
8

私はサービスを持っています。私はしばらく前にそれをインストールしました。私はサービスを更新する必要があります。私は「プログラムの追加と削除」に行き、サービスを探しましたが、そこにはインストールされていません。私はservices.mscを見て、そこに停止しました。私はそれを開始し、それを停止することができました。管理者としてコマンドプロンプトを実行し、[サービス名]を削除して「指定したサービスがインストール済みのサービスとして存在しません」というメッセージが表示されました。コマンドプロンプトでscクエリを実行しましたが、返されません。私はインストーラを右クリックし、アンインストールをクリックし、「このアクションは現在インストールされている製品に対してのみ有効です。私も修理を試み、同じメッセージを得ました。エラー1001:既に指定されたサービスが存在します。既存のサービスを削除できません

私はこのマシンを数回再起動しましたが、このサービスをアンインストールすることはできません。 Visual Studioにインストールされている基本的なセットアッププロジェクトテンプレートを使用しています。私は、プログラムの名前を変更して、バージョン番号を増やしてみました。

明らかに存在するサービスをアンインストールし、これを今後どのように防止しますか?

+1

サービス名とサービス表示名があります。時には、services.mscの "name"列がサービスの表示名であることを忘れることがあります。サービス名を右クリックしてプロパティに移動し、サービス名を取得します。 – Tung

+0

@Tung私はそれを確認した。彼らはどちらも同じだ。 –

+1

http://www.superuser.comに移行しますか?これは実際にプログラミングに関する質問ではありません。 – CodingWithSpike

答えて

0

Windowsレジストリで、そのサービスに関連するゴミ箱を探してみましたか?

あなたはこのフォルダになりますます。HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSetサービス\

+0

残念ながら、私はレジストリにアクセスできません。とにかくそこに行けるのがいつも心地よいとは思えないので、そこに行かなくてもできることがあると思っていました。私はレジストリへのアクセスを要求しましたが、関連するレッドテープがたくさんあります。 –

6

\あなたはInstallUtil.exe /u <process.exe> InstallUtil.exeがで\Windows\Microsoft.Net\Framework\v4.0.30319

で発見されたサービスのインストーラの使用を含む.exeファイルを持っている場合また、セットアッププロジェクト、すべてのカスタムアクションであなたのサービスを含め、アンインストール

(プロジェクトを右クリックして、カスタムアクション)

HTH

マリオ

3

サービスがプログラムの追加/削除に表示されていないことを完全に正常で、そのリストは、ソフトウェアパッケージではなく、サービスのためのものです。 (1つのパッケージまたはプログラムに複数のサービスが含まれることがありますが、通常は何もインストールされません)

サービスは、製品の一部ではなく手動でインストールされました。あなたのインストールパッケージがあります。

sc deleteを使用すると正しいです。サービスの(短い)名前を二重引用符で囲む必要があります(単なる単語でない限り)。

、あなたのレジストリに32ビットおよび64ビット(それぞれregedt32.exeregedit.exe、)の両方をHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicesを訪問し、それに失敗。サービスを直接削除することもできますが、サービスの正確な名前の付け方、そしてscの名前が表示されないことを診断するために、可逆的な変更から始めて、他のすべてが失敗した後、あなたのレジストリ(あなたのオペレーティングシステムを指定するこの手順をGoogleに)。

1

今日は同じことが起こりました。唯一の解決策は、Windowsの[追加と削除]ツールからセットアップファイルを修復することでした。セットアップファイルを修復した後、アンインストールしてから、再度インストールしてください。

3

**唯一のセットアップを使用して行うことが要求されている場合は、従ってください。

これは、既存のサービスの削除(アンインストール)してから新しいバージョンをインストールすることを可能にする明示的な実装によって処理することができます。このため 、私たちは以下のよう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:上記の変更に伴い、また、念のために

+0

これはすばらしい答えですが、ProjectInstaller.Designer.csを手動で編集しなくても同じ動作が得られることがわかりました(これは自動生成されたソースファイルであり、編集はVSが再生成できるので危険です。 )。イベント詳細パネルのserviceProcessInstallerのプロパティタブでBeforeInstallイベントにバインドできます。 – andreapier

+0

@andreapier:ご意見ありがとうございます。はい、それは本当です。これはプロパティタブで実現できます。ここで、私はちょうど内部を理解することがより簡単になると思った。フィードバックをお寄せいただきありがとうございます。良い仕事を続けてください。 – ShivanandSK

0

を追跡し、メンテナンス、良い練習のために、セットアップのバージョンを更新し、より良いバージョン管理を(、とのUpgradeCode optionall)製品コードをご検討ください他の誰かがこの問題を抱えています:

インストーラの名前、バージョン、ProductCodeを更新してくれました。とにかくバージョン管理の良い習慣に確実に従うべきです。

関連する問題