有一种方法可以删除正在执行的文件而不杀死它吗?

时间:2011-10-26 13:21:28

标签: c# c windows security

我有一个问题,我认为这很复杂。我有一个应用程序,我在我的Windows下执行,它需要很长时间才能完成。我想让它继续运行(通常),但是我想要杀死磁盘上的文件 - 但显然它不可能因为它被锁定/正在使用。我需要一种方法来解除它与正在运行的进程的关联以杀死它,同时保持文件运行。任何代码或工具的例子都非常受欢迎。

嗯,欢迎变通方法,例如,如果有一种方法可以从进程中生成它,键入主服务器并迁移子进程以杀死应用程序,或任何其他有效的想法也是受欢迎的 - 即使是丑陋的。 :)

感谢。

3 个答案:

答案 0 :(得分:1)

来自this questions答案的一些建议(完全被盗):

您可以使用MoveFileEx api function在下次重新启动时将文件标记为删除。

您可以注入一个dll来自行关闭手柄:

典型方法如下。你说你想用C#做这个,所以这里......

  1. 如果您不知道哪个进程锁定了文件,则需要检查每个进程的句柄列表,并查询每个句柄以确定它是否标识了锁定的文件。在C#中执行此操作可能需要P / Invoke或中间C ++ / CLI来调用您需要的本机API。
  2. 一旦你弄清楚哪个进程锁定了文件,你需要安全地将一个小的本机DLL注入进程(你也可以注入一个托管的DLL,但是这很麻烦,就像你那么必须启动或附加到.NET运行时。)
  3. 然后,引导程序DLL使用CloseHandle等关闭句柄。 基本上:解锁“锁定”文件的方法是将DLL注入违规进程的地址空间并自行关闭它。您可以使用本机代码或托管代码执行此操作。无论如何,你需要少量的本机代码或者至少需要P / Invoke。
  4. 有用的链接:

    http://www.codeproject.com/KB/threads/winspy.aspx
    http://damianblog.com/2008/07/02/net-code-injection/

答案 1 :(得分:0)

这是你要杀死的应用程序必须处理的问题。它不应该在长时间运行的过程中保持文件打开。如果应用程序未关闭该文件,则终止该文件将导致该应用程序中出现异常。

答案 2 :(得分:0)

不确定这是否适用于每个Windows版本,但现在是:

  1. 将进程可执行文件“foo.exe”重命名为“foo.old”
  2. 将新的“foo.exe”放到正确的位置
  3. 将消息发送到进程,因此它将执行新的“foo.exe”映像并自行终止。
  4. 开始时,删除程序目录中的“foo.old”文件。
  5. 更新:oops,看起来你不想放新图片,只需删除旧图片。然后MoveFileEx只是“合法”选项。