Ответ 1
Здесь API MoveFileEx, который при заданном флаге MOVEFILE_DELAY_UNTIL_REBOOT
удалит указанный файл при следующем запуске системы.
Как я могу удалить мое приложение С# (саморазрушение)? Вот два способа, которые, как я думаю, могут работать:
Оба эти метода кажутся неэффективными. У меня такое ощущение, что в Windows есть встроенный флаг или что-то в этом роде, которое позволяет такие вещи. Как я должен это делать? Кроме того, можете ли вы предоставить примерный код?
ОБНОВЛЕНИЕ: Спасибо за все ваши ответы! Я попробую их и посмотрю, откуда это меня.
Прежде всего, некоторые люди спрашивают, почему я хочу, чтобы мое приложение это делало. Вот ответ: несколько дней назад я прочитал спецификацию проекта Aardvark, которую Джоэл Спольски опубликовал в своем блоге, и он упомянул, что клиентское приложение удалит себя после удаленного сеанса. Мне интересно, как это работает, и как, если мне когда-либо понадобится это сделать, я смогу совершить такой подвиг.
Вот небольшой обзор того, что было предложено:
Оба эти, конечно, имеют свои недостатки, как указано в комментариях.
Однако, работает ли такой способ, как указано ниже?
Существует два исполняемых файла: Program.exe и Cleaner.exe. Первая - сама программа, последняя - приложение, которое удаляет Program.exe и само по себе (если оно загружается в память, как я собираюсь объяснить). Возможно ли для Program.exe(с зависимостями) загрузить весь файл Cleaner.exe, который не имеет каких-либо зависимостей, в память и запустить его? p >
Если это возможно, может ли Cleaner.exe быть упакован внутри Program.exe, загружен в память и запущен?
Здесь API MoveFileEx, который при заданном флаге MOVEFILE_DELAY_UNTIL_REBOOT
удалит указанный файл при следующем запуске системы.
В этом разделе CodeProject Article.
Изменить: В основном это простой вызов cmd, который удалит указанные файлы через несколько секунд.
Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath);
Application.Exit();
Вы никогда не сможете гарантировать, что это будет работать, если вам требуется физическое присутствие на машине. Например:
Если ваше приложение требует такого уровня безопасности, подумайте о его размещении на компьютере, которым вы управляете (например, предоставляя веб-службу и позволяя клиенту-заглушке обращаться к нему таким образом).
В некоторой смежной ноте также возникает соблазн размышлять о мотивах того, кто (1) требует физического присутствия на ком-то компьютере, и (2) хочет удалить доказательства того, что приложение существует.
Коррекция для ответа @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);
Существует также 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
, что маловероятно.
отсортировано по 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 + "\"");
; >
Я знаю, что отражатель удаляет себя, если вы используете старую версию и не хотите обновлять ее. Вы можете попытаться выяснить, что он делает. Я бы начал с FileMon и посмотрел, не порождает ли он какие-либо процессы для достижения этого.
Поскольку мое приложение (Служба 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, но его нужно легко конвертировать в С#.
Работает в 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();
}