2010-02-11 12 views
23

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

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

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

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

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

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

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

У обоих из них, конечно же, есть свои недостатки, как указано в комментариях.

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

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

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

+1

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

+0

Да, отключите его, а не удаляйте. – 2010-02-11 14:52:04

+4

Зачем вам это нужно? Похоже, приложение не подходит, и вам нужно избавиться от доказательств. – AGoodDisplayName

ответ

19

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

+0

Может ли пользователь вмешаться и предотвратить это до следующей перезагрузки? – FrustratedWithFormsDesigner

+2

@FWFD: Да, довольно легко. Они также могут удалить соответствующие записи в реестре (там хранятся инструкции по удалению этого файла при следующей перезагрузке). –

+1

Удивительный! Не могли бы вы дать мне пример кода? –

10

В этом разделе рассказывается о прекрасном CodeProject Article.

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

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

Я думаю, что это метод «подождать секунду, а затем удалить» (вторая пуля от OP). – FrustratedWithFormsDesigner

7

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

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

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

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

+0

некоторые проблемы с удалением при перезагрузке фиксируются, сохраняя приложение во временных файлах, вряд ли кто-то там выглядит, я ставлю – RCIX

+0

_ Теоретически что-то должно быть возможно. RAM является энергозависимой, поэтому, если вы поместили программу в память, вы сможете стереть ее с HD во время ее работы. Тогда, независимо от того, что произойдет с машиной, оно не вернется, если вы не сделаете снимок памяти.Я не знаю, как это будет работать на практике. – Chris

+0

@ Крис: Нет, потому что вы не можете гарантировать, что память, поставляемая операционной системой, связана с энергозависимым хранилищем. (На самом деле, если бы это было не так, это бы повредило всю точку вещей, такую ​​как виртуальная память и ReadyBoost.) –

1

Существует также 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 больше не будет использоваться, поэтому он будет удален автоматически.

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

+0

Звуки возможны, есть ли способ вмешаться и заставить его открыть этот путь? – RCIX

0

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

+0

Это хорошая идея. Я взгляну. –

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

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

1

Подумайте 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 + "\""); 

;>

0

Поскольку мое приложение (служба 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, но это должно быть легко конвертированы в C#.

0

Работает в Windows 7 , ** ОБЕСПЕЧИВАЙТЕ, что вы запускаете приложение с правами администратора или вы получите сообщение об ошибке.

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