Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 拦截要删除的文件系统调用_.net_Windows_Visual C++_Operating System - Fatal编程技术网

.net 拦截要删除的文件系统调用

.net 拦截要删除的文件系统调用,.net,windows,visual-c++,operating-system,.net,Windows,Visual C++,Operating System,在windows执行删除之前,是否有方法检测文件的删除?我找到了FileSystemWatcher类,但只有在执行删除操作后才会引发该事件,但我希望在用户/进程选择删除该删除操作后捕获该删除操作。您可以监视文件系统表,但需要寻找更好的方法。谢谢您的帮助。您需要一个文件系统筛选器驱动程序。然而,我强烈建议,如果你不知道答案,你可能不应该这样做 我认为最简单的方法是使用钩子来获得通知(并最终停止)进程。它不能在.NET中完成,因此您必须DllImport大量的结构和很少的函数进行P/Invoke 让

在windows执行删除之前,是否有方法检测文件的删除?我找到了FileSystemWatcher类,但只有在执行删除操作后才会引发该事件,但我希望在用户/进程选择删除该删除操作后捕获该删除操作。您可以监视文件系统表,但需要寻找更好的方法。谢谢您的帮助。

您需要一个文件系统筛选器驱动程序。然而,我强烈建议,如果你不知道答案,你可能不应该这样做


我认为最简单的方法是使用钩子来获得通知(并最终停止)进程。它不能在.NET中完成,因此您必须
DllImport
大量的结构和很少的函数进行P/Invoke

让我们从
NtSetFileInformation
(未记录)函数开始您的工作。当需要删除文件时(使用
FileDispositionInformation
structure),其他任何程序都会调用该函数


现在的问题是如何钩住这个函数(祝你好运,这并不容易)。一个好的选择可以是使用。以查看为例。它的问题是它不是免费的。另一种解决方案(价格合理且带有.NET接口)是,但我甚至从未尝试过他们的免费版本,所以我不知道它有多好。如果其他人知道一个好的拦截工具…

或者可以尝试使用ICopyHook接口

CopyCallback方法中,使用wFunc参数中的fou DELETE指定删除操作

缺点:
仅在Windows Shell中防止删除。

谢谢,但不寻找驱动程序级解决方案。编写驱动程序对我来说不可行:)。我在寻找api级别的解决方案。我可能完全错了,是否可以运行一个对文件持有锁的服务,以便每当有人试图删除它时,我的服务都可以找到它。如果要防止删除,只需持有一个打开的句柄(使用access file\u READ\u属性打开),但不使用file\u SHARE\u delete。发现有人试图删除它更难。这种低级文件欺骗实际上属于过滤器驱动程序,而不是应用程序。(例如,您可以通过在“last second copy”代码中执行
Sleep(INFINITE)
来挂起另一个应用程序。如果另一个应用程序在不同的安全上下文下运行,这将成为一个安全问题。)也许您可以从卷快照数据库中挖掘文件的旧副本。@Gopikanna,您看过卷影复制服务(VSS)吗?编辑:正如Raymond Chen建议的那样……谢谢,我实际上不想停止删除文件的过程。我想做一个文件的安全副本,让删除发生。@Gopikanna这是相同的(硬)方式。最大的问题是检测某人/某物何时试图删除文件(不同的函数使用不同的方法,NtSetFileInformation只是其中最深的一种)。当你在那里时,要做的是(有点)琐碎。谢谢,我会尝试API挂钩,希望我能做到:)@Gopikanna一个复杂任务的小提示:从CodeProject的链接文章开始,这很好(如果你使用迂回)。哦。。我猜就是这个…通过使用mhook库Hooking NtSetFileInformation API实现的,工作起来很有魅力。谢谢各位。