Windows:执行后删除EXE

0x9*_*x90 4 c# windows file-handling

我正在使用C#中的应用程序执行以下操作:

  1. 将EXE写入磁盘
  2. 通过执行EXE Process.Start()

我现在正在努力确保EXE一旦关闭就会被删除.最简单的方法是FileOptions.DeleteOnClose在创建EXE时使用设置参数File.Create.

但是,这意味着EXE在使用时无法执行.关闭文件句柄后,EXE会立即删除,然后才能执行.

有没有办法在我的应用程序中保留对EXE的"弱引用",它不会锁定文件并允许它被执行?或者,有没有办法解锁EXE执行文件句柄仍然打开?我还缺少其他明显的解决方案吗?

澄清答:我知道其他删除正在使用的文件的方法,最终会删除文件(例如重启时).然而,我正在寻找一种方法,一旦它开始执行就立即删除该文件由操作系统处理(例如,当运行首先执行该文件然后删除它的批处理时,如果批处理作业终止,该文件将保留在磁盘上).

澄清B:解释更大的图片:应用程序接收和解密可执行文件.解密后,应该执行该文件.但是,我想确保解密版本的EXE不会保留在磁盘上.理想情况下,我还想阻止用户复制解密的EXE.但是,由于解密应用程序作为同一用户运行,因此无法以真正安全的方式实现,因为两者在系统上具有相同的权限.

Ora*_*ace 8

您可以使用Process.WaitForExit:

var process = Process.Start(processPath);
process.WaitForExit();

// File.Delete(processPath); // Not strong enough (thanks to Binary Worrier)
DeleteOrDie(processPath);    // Will attempts anything to delete the file.
Run Code Online (Sandbox Code Playgroud)

但是它提供了从你写的地方复制exe的可能性.

一个好的解决方案是从内存中运行它.

如果你的目标exe是一个CLR程序,你可以使用Assembly.Load函数:

// read the file and put data in bin
...
Assembly a = Assembly.Load(bin);
MethodInfo method = a.EntryPoint;
if (method == null) throw new NoEntryPointException();
object o = a.CreateInstance(method.Name);
method.Invoke(o, null);
Run Code Online (Sandbox Code Playgroud)

更多细节在这里.

如果你想在内存中加载/执行任何exe,你可以使用Nebbett的Shuttle方法,但你需要用C/C++编写它并从C#调用它.

此外,它看起来像微软不喜欢它(安全问题),我不认为你只能从C#实现它.良好的反病毒可能会检测到它.