2012-03-27 61 views
8

Tengo un servicio. Lo instalé hace un tiempo. Necesito hacer una actualización del servicio. Fui a Agregar/Quitar programas y busqué mi servicio, y no está instalado allí. Miré a services.msc y está allí, parado. Pude iniciarlo y detenerlo. Ejecuté un símbolo del sistema como administrador y ejecuté sc delete [Nombre del servicio], y recibí "El servicio especificado no existe como un servicio instalado". Hice una consulta sc en el símbolo del sistema, y ​​no se devuelve. Hice clic derecho en el instalador, hice clic en Desinstalar y recibí "Esta acción solo es válida para los productos que están instalados actualmente". Intenté reparar también, y recibí el mismo mensaje.Error 1001: el servicio especificado ya existe. No se puede eliminar el servicio existente

He reiniciado la máquina varias veces y no tuve suerte en desinstalar este servicio. Estoy usando la plantilla básica de Proyecto de instalación instalada con Visual Studio. Intenté cambiar el nombre del programa y aumentar el número de versión.

¿Cómo desinstalo el servicio que aparentemente existe y evito que esto suceda en el futuro?

+1

Para que quede claro, hay un Nombre del servicio y un Nombre para mostrar del servicio. A veces las personas olvidan que la columna "nombre" en services.msc es el nombre para mostrar del servicio. Obtiene el nombre del servicio haciendo clic con el botón derecho en sus servicios y yendo a las propiedades. – Tung

+0

@Tung Lo comprobé, y ambos son lo mismo. –

+1

¿Migrar a http://www.superuser.com? Esta no es realmente una pregunta de programación. – CodingWithSpike

Respuesta

0

¿Ha intentado buscar en el Registro de Windows alguna basura relacionada con ese servicio ?.

Debe buscar en esta carpeta: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \

+0

Lamentablemente, no tengo acceso al registro. No siempre me siento cómodo yendo allí de todos modos, así que esperaba que hubiera algo que pudiera hacer sin entrar allí. Solicité el acceso al registro, pero hay una gran cantidad de burocracia asociada. –

6

Si usted tiene el .exe que incluye el uso de los servicios de instalación de InstallUtil.exe /u <process.exe> InstallUtil.exe se encuentra en \Windows\Microsoft.Net\Framework\v4.0.30319

En el proyecto de instalación, incluya su servicio en todas las acciones personalizadas, también la desinstalación

(clic derecho en el proyecto, acción personalizada)

hth

Mario

3

Es completamente normal que el servicio no está en la lista de Agregar/quitar programas, que anuncio es para paquetes de software, no servicios. (Un paquete, o programa, puede contener múltiples servicios, pero normalmente no instala ninguno.)

Aparentemente, el servicio se instaló manualmente, no como parte del producto, incluso si este en particular normalmente se instalaría con un producto cuyo paquete de instalación tienes

El uso de sc delete es correcto. Deberá incluir el nombre (abreviado) del servicio entre comillas dobles (a menos que sea una sola palabra), pero nada más.

En su defecto, visite HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services en su registro, tanto 32 bit como 64 bit (regedt32.exe y regedit.exe, respectivamente). Incluso puede eliminar el servicio allí directamente, pero obviamente debe comenzar por cambios reversibles para diagnosticar cómo se llama exactamente su servicio y por qué sc no ve su nombre y solo utiliza el acceso directo al registro después de que todo lo demás falló y después de que haya realizado una copia de seguridad su registro (google este procedimiento especificando su sistema operativo).

1

Hoy me pasó lo mismo. La única solución fue reparar el archivo de instalación desde la herramienta Agregar o quitar de Windows. Después de reparar la desinstalación del archivo de instalación e instalarlo de nuevo.

3

** Si se requiere para ser hecho usando solamente la configuración, siga:

Esto puede ser manejado por la aplicación explícita de la eliminación del servicio actual (desinstalar) y luego permitiendo que la versión más reciente de instalar. Para esto, necesitamos actualizar ProjectInstaller.Designer.cs de la siguiente manera:

Considere agregar la siguiente línea al comienzo de InitializeComponent() que desencadena un evento para desinstalar el servicio existente antes de que su instalador actual intente instalar el servicio nuevamente . Aquí desinstalamos el servicio si ya existe.

Añadir según espacios de nombres:

using System.Collections.Generic; 
using System.ServiceProcess; 

Añadir debajo de la línea de código como se ha descrito antes:

this.BeforeInstall += new 
System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall); 

Ejemplo:

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 
     } 
    ); 
} 

El código siguiente llamada por el evento será entonces desinstalar el servicio si existe

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: Junto con los cambios mencionados, también, por favor considere la actualización de la versión de configuración, CódigoProducto (y optionall UpgradeCode) para una buena práctica, una mejor gestión de versiones, seguimiento y mantenimiento

+0

Esta es una gran respuesta, pero descubrí que puede obtener el mismo comportamiento sin editar ProjectInstaller.Designer.cs (este es un archivo fuente generado automáticamente y la edición es peligrosa ya que VS puede regenerarlo, por lo que puede terminar perdiendo sus cambios) Puede enlazar al evento BeforeInstall en la pestaña de propiedades en serviceProcessInstaller, en el panel de detalles del evento. – andreapier

+0

@andreapier: Gracias por sus comentarios. Sí, eso es muy cierto. Esto se puede lograr a través de la pestaña de propiedades. Aquí, pensé que sería más fácil entender las partes internas. Gracias por la respuesta. Sigan con el buen trabajo. – ShivanandSK

0

Por si acaso cualquier otra persona se encuentra con este problema:

Lo que funcionó para mí fue la actualización del nombre, la versión y el código de producto de mi instalador. Definitivamente debería seguir la buena práctica de versionar de todos modos.

Cuestiones relacionadas