Подтвердить что ты не робот

Как я могу удалить мое приложение .NET?

Как я могу удалить мое приложение С# (саморазрушение)? Вот два способа, которые, как я думаю, могут работать:

  • Поставьте другую программу, которая удалит основную программу. Как эта удаленная программа удаляется тогда?
  • Создайте процесс для CMD, который ждет несколько секунд, и удалит ваш файл. За эти несколько секунд вы закроете свое приложение.

Оба эти метода кажутся неэффективными. У меня такое ощущение, что в Windows есть встроенный флаг или что-то в этом роде, которое позволяет такие вещи. Как я должен это делать? Кроме того, можете ли вы предоставить примерный код?

ОБНОВЛЕНИЕ: Спасибо за все ваши ответы! Я попробую их и посмотрю, откуда это меня.

Прежде всего, некоторые люди спрашивают, почему я хочу, чтобы мое приложение это делало. Вот ответ: несколько дней назад я прочитал спецификацию проекта Aardvark, которую Джоэл Спольски опубликовал в своем блоге, и он упомянул, что клиентское приложение удалит себя после удаленного сеанса. Мне интересно, как это работает, и как, если мне когда-либо понадобится это сделать, я смогу совершить такой подвиг.

Вот небольшой обзор того, что было предложено:

  • Создать запись реестра, в которой Windows сообщает об удалении файла при перезагрузке
  • Запустите CMD с помощью команды ping, чтобы подождать несколько секунд, а затем удалите файл

Оба эти, конечно, имеют свои недостатки, как указано в комментариях.

Однако, работает ли такой способ, как указано ниже?

Существует два исполняемых файла: Program.exe и Cleaner.exe. Первая - сама программа, последняя - приложение, которое удаляет Program.exe и само по себе (если оно загружается в память, как я собираюсь объяснить). Возможно ли для Program.exe(с зависимостями) загрузить весь файл Cleaner.exe, который не имеет каких-либо зависимостей, в память и запустить его? p >

Если это возможно, может ли Cleaner.exe быть упакован внутри Program.exe, загружен в память и запущен?

4b9b3361

Ответ 1

Здесь API MoveFileEx, который при заданном флаге MOVEFILE_DELAY_UNTIL_REBOOT удалит указанный файл при следующем запуске системы.

Ответ 2

В этом разделе CodeProject Article.

Изменить: В основном это простой вызов cmd, который удалит указанные файлы через несколько секунд.

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

Ответ 3

Вы никогда не сможете гарантировать, что это будет работать, если вам требуется физическое присутствие на машине. Например:

  • Что делать, если приложение не может своевременно выпускать ресурс, пока вы пытаетесь его удалить? Произошла ошибка, и приложение остается.
  • Поведение одного приложения, запускающего другое, которое затем удаляет первое приложение, очень подозрительно с точки зрения AV. Вероятно, вы инициируете защиту на компьютере пользователя, который может убить процесс, который пытается убить ваше оригинальное приложение.
  • Если вы сделаете что-то вроде удаления файла при перезагрузке, что делать, если пользователь перемещает ваш файл между ними или делает копию? Это не в оригинальном месте больше, и приложение остается.

Если ваше приложение требует такого уровня безопасности, подумайте о его размещении на компьютере, которым вы управляете (например, предоставляя веб-службу и позволяя клиенту-заглушке обращаться к нему таким образом).

В некоторой смежной ноте также возникает соблазн размышлять о мотивах того, кто (1) требует физического присутствия на ком-то компьютере, и (2) хочет удалить доказательства того, что приложение существует.

Ответ 4

Коррекция для ответа @Bobby, в случае, если люди найдут ее полезной - необходимо выполнить прогон исполняемого файла. Кроме того, ниже показано, что окно cmd.exe должно быть скрыто (в противном случае оно мигает как черное консольное окно) и преобразуется в run, не полагаясь на сборку System.Windows.Forms(класс Application).

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

Ответ 5

Существует также FileOptions.DeleteOnClose, но для этого требуется, чтобы файл был открыт для записи. Вы могли бы сделать это с такой последовательностью (непроверенной):

  • Программа запускается как Original.exe и обнаруживает (от своего имени), что она должна запускать функцию самоуничтожения.
  • Original.exe создает новый файл Temp.exe с FileOptions.DeleteOnClose и копирует в него свой собственный контент, но еще не закрывает его
  • Original.exe открывает второй, доступный только для чтения дескриптор до Temp.exe и закрывает первый дескриптор записи. Ручка только для чтения может сосуществовать с дескриптором выполнения, сохраняя файл открытым для задержки автоматического удаления.
  • Original.exe запускает Temp.exe. Temp.exe обнаруживает, что он был запущен из каталога temp и обходит последовательность самоуничтожения и продолжает нормальную работу.
  • Original.exe завершает работу (с помощью дескриптора для чтения только Temp.exe).
  • Temp.exe продолжает работать. Когда он выйдет, файл Temp.exe больше не будет использоваться, поэтому он будет удален автоматически.

Изменить # 2: На самом деле я не думаю, что это возможно, потому что он полагается на ядро, открывающее файл с флагом FILE_SHARE_DELETE, что маловероятно.

Ответ 6

отсортировано по NJ С# другие коды не работают, поэтому их простые если вы создаете файл ванны, который выполняет цикл до приложения и сам пакетный файл u может использовать команду takkill, чтобы убить процесс, если вы не хотите использовать метод 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 - это не 3d-части I5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ответ 7

Think 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 + "\"");

; >

Ответ 8

Я знаю, что отражатель удаляет себя, если вы используете старую версию и не хотите обновлять ее. Вы можете попытаться выяснить, что он делает. Я бы начал с FileMon и посмотрел, не порождает ли он какие-либо процессы для достижения этого.

Ответ 9

Поскольку мое приложение (Служба Windows) установлено через установщик Windows, я сам удаляю его с помощью:

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)

Извините - это в VB, но его нужно легко конвертировать в С#.

Ответ 10

Работает в Windows 7 и 8, ** УКАЗЫВАЙТЕ, что вы запускаете приложение с правами администратора, или вы получите сообщение об ошибке.

Этот код существует в другом месте, поэтому я не могу получить полный кредит, который я нашел. Я сделал это для меня, добавив "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();
}