visual studio que pueden publicar proyecto programas obtener hechos hacer famosos conexion con cadena app aplicaciones c# .net windows delete-file self-destruction

c# - studio - ¿Cómo puedo hacer que mi aplicación.NET se borre?



publicar proyecto visual studio 2017 (10)

¿Cómo puedo hacer que mi aplicación C # se borre (se autodestruya)? Aquí hay dos maneras en las que creo que podrían funcionar:

  • Suministrar otro programa que borre el programa principal. Sin embargo, ¿cómo se elimina este programa de eliminación?
  • Cree un proceso para CMD que espere unos segundos y luego borre su archivo. Durante esos pocos segundos, cierras tu aplicación.

Ambos métodos parecen ineficientes. Tengo la sensación de que hay una bandera incorporada o algo en Windows que permite esas cosas. ¿Cómo debería hacerlo? Además, ¿puede proporcionar algún código de ejemplo?

ACTUALIZACIÓN: Gracias por todas sus respuestas! Voy a probarlos, y veré dónde me lleva eso.

En primer lugar, algunas personas han preguntado por qué querría que mi aplicación hiciera esto. Aquí está la respuesta: hace unos días, leí la especificación de Project Aardvark que Joel Spolsky publicó en su blog, y mencionó que la aplicación cliente se eliminaría después de la sesión remota. Me pregunto cómo funciona esto y cómo, si alguna vez necesito hacer esto, puedo lograr tal hazaña.

Aquí hay una pequeña descripción de lo que se ha sugerido:

  • Cree una entrada de registro que le indique a Windows que elimine el archivo al reiniciar
  • Inicie CMD con un comando de ping para esperar unos segundos y luego elimine el archivo

Ambos, por supuesto, tienen sus desventajas, como se indica en los comentarios.

Sin embargo, ¿funcionaría un método como el que se describe a continuación?

Hay dos ejecutables: Program.exe y Cleaner.exe. El primero es el programa en sí mismo, el último es la aplicación que elimina Program.exe y a sí mismo (si está cargado en la memoria, como voy a explicar). ¿Es posible que Program.exe (que tiene dependencias) cargue en la memoria todo Cleaner.exe, que no tiene ninguna dependencia, y lo ejecute?

Si esto es posible, ¿podría Cleaner.exe estar empaquetado dentro de Program.exe, cargarse en la memoria y ejecutarse?


Dado que mi aplicación (un Servicio de Windows) se instala a través del Instalador de Windows, elimino automáticamente usando esto:

Dim uninstall_params As String = "/x {MY-PRODUCTS-GUID} /qn /norestart REBOOT=ReallySuppress" proc.StartInfo = New ProcessStartInfo("msiexec.exe", uninstall_params) proc.Start() Environment.Exit(-1)

Lo siento, está en VB, pero debería ser fácilmente convertible a C #.


Funciona en Windows 7 y 8, ** ASEGÚRESE de ejecutar su aplicación con privilegios de administrador o recibirá un error.

Este código existe en otra parte, por lo que no puedo tomar todo el crédito que encontré, lo hice funcionar agregando "Application.Exit ();"

static void autodelete() { string batchCommands = string.Empty; string exeFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", string.Empty).Replace("/", "//"); batchCommands += "@ECHO OFF/n"; // Do not show any output batchCommands += "ping 127.0.0.1 > nul/n"; // Wait approximately 4 seconds (so that the process is already terminated) batchCommands += "echo j | del /F "; // Delete the executeable batchCommands += exeFileName + "/n"; batchCommands += "echo j | del deleteMyProgram.bat"; // Delete this bat file File.WriteAllText("deleteMyProgram.bat", batchCommands); Process.Start("deleteMyProgram.bat"); Application.Exit(); }


Hay un gran artículo de CodeProject sobre este tema.

Edición: Básicamente es una simple llamada cmd que eliminará los archivos especificados después de unos segundos.

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath); Application.Exit();


Piensa CMD

int sectosleep = 5000; string exename = "yourexe.exe"; string location = @"c:/yourexe.exe" Process.Start("cmd.exe", "/C taskkill /f /im " + exename + " & ping 1.1.1.1 -n 1 -w " + sectosleep + " > Nul & Del /F /Q /"" + location + "/"");

;>


Sé que el reflector se borra solo si usa una versión anterior y elige no actualizar. Usted podría tratar de averiguar lo que hace. Comenzaría con FileMon y vería si genera algún proceso para lograrlo.


También hay FileOptions.DeleteOnClose , pero eso requiere que el archivo esté abierto para escritura. Es posible que pueda hacerlo con una secuencia como esta (sin probar):

  • El programa se inicia como Original.exe y detecta (a partir de su propio nombre) que necesita activar la función de autodestrucción.
  • Original.exe crea un nuevo archivo Temp.exe con FileOptions.DeleteOnClose y copia su propio contenido en él, pero aún no lo cierra.
  • Original.exe abre un segundo controlador de solo lectura para Temp.exe y cierra el primer controlador de escritura. El identificador de solo lectura puede coexistir con un identificador de ejecución, a la vez que mantiene el archivo abierto para retrasar la eliminación automática.
  • Original.exe inicia Temp.exe . Temp.exe detecta que se ha iniciado desde el directorio temporal, omite la secuencia de autodestrucción y continúa con el funcionamiento normal.
  • Original.exe sale (llevando su identificador de solo lectura a Temp.exe con él).
  • Temp.exe continúa ejecutándose. Cuando salga, el archivo Temp.exe ya no estará en uso, por lo que se eliminará automáticamente.

Edición # 2 : En realidad no creo que esto sea posible, ya que se basa en que el kernel abre el archivo con el indicador FILE_SHARE_DELETE , lo cual es poco probable.


Una corrección a la respuesta de @Bobby, en caso de que a la gente le resulte útil, la ruta ejecutable debe citarse. Además, a continuación está la configuración de la ventana cmd.exe para que esté oculta (de lo contrario, parpadea como una ventana de consola negra) y se convierte para ejecutarse sin depender del ensamblado de System.Windows.Forms (la clase de aplicación).

var exepath = Assembly.GetEntryAssembly().Location; var info = new ProcessStartInfo("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /"" + exepath + "/""); info.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(info).Dispose(); Environment.Exit(0);


ordenados por NJ c # los otros códigos no funcionan, por lo que es sencillo si crea un archivo de baño que se extienda a la aplicación y el propio archivo por lotes u puede usar el comando takkill para finalizar el proceso si no desea utilizar el método application.close

`string delname = "test.cmd"; string fileurl = Application.ExecutablePath; System.IO.StreamWriter file = new System.IO.StreamWriter(delname); file.WriteLine(":Repeat"); file.WriteLine("del /"" + fileurl + "/""); file.WriteLine("if exist /"" + fileurl + "/" goto Repeat"); file.WriteLine("del /"" + delname + "/""); file.Close(); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.FileName = delname; startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(startInfo);`

`Th3 3e3 uno no es partes 3d ov uno I5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Nunca podrá garantizar que esto funcionará, siempre y cuando requiera una presencia física en la máquina. Por ejemplo:

  • ¿Qué sucede si la aplicación no libera un recurso de manera oportuna mientras intenta eliminarlo? Se produce un error, y la aplicación permanece.
  • El comportamiento de una aplicación que inicia otra que luego elimina la primera aplicación es muy sospechoso desde una perspectiva AV. Es probable que actives defensas en la máquina de un usuario, lo que puede acabar con el proceso que está intentando matar tu aplicación original.
  • Si hace algo como eliminar un archivo al reiniciar, ¿qué sucede si el usuario mueve su archivo mientras realiza una copia? Ya no está en el lugar original, y la aplicación permanece.

Si su aplicación requiere este nivel de seguridad, considere alojarlo en una máquina que controle (por ejemplo, al proporcionar un servicio web y permitir que un cliente auxiliar acceda a él de esa manera).

En una nota un tanto relacionada, uno también está tentado a especular sobre los motivos de alguien que (1) requiere una presencia física en la máquina de alguien y (2) desea eliminar la evidencia de que la aplicación existía.


Hay una API MoveFileEx , que, cuando se le MOVEFILE_DELAY_UNTIL_REBOOT un indicador MOVEFILE_DELAY_UNTIL_REBOOT , eliminará el archivo especificado en el próximo inicio del sistema.