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?
¿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#
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.
Uninstall() .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.
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.
Puede usar el proyecto de instalación, genera el desinstalador automáticamente y le brinda una gama de posibilidades con él.