Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

274
Vistas
Eliminar la carpeta de servicio de Windows con archivos arroja un error

Sé que ya se hizo esta pregunta, pero hasta ahora no pude encontrar la solución.

Lo que intento hacer es desinstalar un servicio de Windows y eliminar la carpeta con el servicio de Windows usando C#.

Desinstalación del servicio de Windows

 public static void Uninstall(string exeFilename) { var commandLineOptions = new string[1] { "/LogFile=uninstall.log" }; if (!Directory.Exists(exeFilename)) return; var fileNames = Directory.GetFiles(exeFilename); var serviceFile = fileNames.FirstOrDefault(f => f.EndsWith(".exe")); var serviceFileName = Path.GetFileName(serviceFile); var serviceName = Path.GetFileNameWithoutExtension(serviceFile); var serviceExists = ServiceController.GetServices().Any(s => s.ServiceName == serviceName); if (!serviceExists) return; var installer = new AssemblyInstaller($"{exeFilename}\\{serviceFileName}", commandLineOptions) { UseNewContext = true }; installer.Uninstall(null); installer.Dispose(); }

Eliminar carpetas y archivos

 public static void DeleteFolder(string folderPath) { if(!Directory.Exists(folderPath)) return; try { foreach (var folder in Directory.GetDirectories(folderPath)) { DeleteFolder(folder); } foreach (var file in Directory.GetFiles(folderPath)) { var pPath = Path.Combine(folderPath, file); File.SetAttributes(pPath, FileAttributes.Normal); File.Delete(file); } Directory.Delete(folderPath); } catch (Exception e) { Console.WriteLine(e); } }

error que me sale

Access to the path 'c:\services\x\x.exe' is denied.

 at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.InternalDelete(String path, Boolean checkHost) at System.IO.File.Delete(String path)

Este error ocurre aleatoriamente. El archivo .exe no es de solo lectura, a veces los archivos se eliminan.

¿Alguien sabe lo que está mal?

over 4 years ago · Santiago Trujillo
4 Respuestas
Responde la pregunta

0

¿El servicio está detenido/el ejecutable está detenido y el programa tiene acceso de administrador? Si no tiene acceso de administrador, consulte: ¿Cómo obligo a mi aplicación .NET a ejecutarse como administrador? para ejecutar como administrador. Al desinstalar un programa, casi siempre se requieren permisos de administrador. Si esto sigue fallando, usted no es el propietario del archivo y debe cambiar el propietario a usted mismo o a los Administradores. Puede hacer esto programáticamente aquí: Obtención/configuración del propietario del archivo en C#

over 4 years ago · Santiago Trujillo Denunciar

0

Detener un servicio de Windows no equivale a salir de un proceso. Un ejecutable puede albergar varios servicios de Windows (esencialmente es el shell físico de los servicios).

Entonces, parece que lo que está encontrando es que el servicio probablemente se detuvo sin problemas, y la desinstalación puede continuar y la eliminación de archivos puede continuar, pero solo hasta el punto en que llega al ejecutable, que aún no ha tuvo la oportunidad de salir.

Detener, salir, desinstalar son todos asincrónicos y necesitan tiempo para completarse antes de pasar al siguiente paso.

Lo que tienes que hacer es seguir esta fórmula.

  1. Asegúrese de que su código se ejecute con privilegios elevados si puede; si no puede, puede encontrarse con Acceso denegado . También puede intentar cambiar la propiedad del ejecutable de destino.
  2. Detenga o asegúrese de que el servicio esté detenido. Si hay varios servicios, deténgalos todos.
  3. Espere a que se detenga realmente. No siempre es inmediato.
  4. Llame a Uninstall() .
  5. Espere una cierta cantidad de tiempo. Compruebe si el proceso se está ejecutando. Si es así, llamará a Process.Kill() (vea una implementación a continuación).
  6. Finalmente, puede llamar a DeleteFolder() para el cual su implementación me parece adecuada.

Salir del proceso

Escribe un método que se parezca a esto. Es posible que desee modificarlo.

 void Exit(Process p) { for (int i = 0; i <= 5; i++) { // doesn't block if (p.HasExited) return; // doesn't block; pass true to terminate children (if any) p.Kill(true); // wait 5 seconds then try again Thread.Sleep(5000); } }

Después de todo eso, deberías estar listo para irte.

over 4 years ago · Santiago Trujillo Denunciar

0

Creo que tienes que detener el servicio primero. intenta usar

 sc stop <service name>

para detener el servicio. Entonces la desinstalación debería funcionar. intente usar installutil.exe si su código de desinstalación no funciona. También puede dar su salida de error. El exe no se puede eliminar si se está ejecutando actualmente, así que asegúrese de que el exe no se esté ejecutando cuando intente eliminarlo.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar el proyecto de instalación, genera el desinstalador automáticamente y le brinda una gama de posibilidades con él.

Ejemplo del instalador de servicios

Debe descargar el complemento en el mercado.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda