由于文件/进程监视器在进行日志记录时无法进行过滤和不必要的重复,因此我希望重新创建该程序的功能并实时记录所有Windows文件操作.
我想记录各种属性,如时间,进程名称,源路径,目标路径,操作,结果和详细信息,就像Process Monitor一样.
如何让C#从操作系统中提取此信息?
编辑:正如zett42指出的那样,FileSystemWatcher例如,从进程本身创建的文件事件不会被拦截.举例来说,没有这些交易显示出来,即使我添加的事件:Changed,Created,Renamed,和Deleted到FileSystemWatcher和设置EnableRaisingEvents标志设置为true.
编辑2:使用SimonMourier建议的Microsoft.Diagnostics.Tracing.TraceEvent nuget包,我设法敲了下面的代码.
本节放入后台工作者:
Console.CancelKeyPress += (sender, e) => session.Stop();
session.EnableKernelProvider(KernelTraceEventParser.Keywords.All);
session.Source.Kernel.FileIOWrite += Kernel_FileIOWrite;
session.Source.Process();
Run Code Online (Sandbox Code Playgroud)
然后,在调用(自动)时,创建的FileIOWrite事件将运行以下命令:
private void Kernel_FileIOWrite(Microsoft.Diagnostics.Tracing.Parsers.Kernel.FileIOReadWriteTraceData obj)
{
string filename = obj.FileName;
string processpath = "";
if (obj.ProcessID == 0) processpath = "System Idle Process";
else if (obj.ProcessID == 4) processpath = "System";
else
{
try { processpath = "ID: " …Run Code Online (Sandbox Code Playgroud) 我正在使用FileStream写入文件,并使用Process Monitor观察底层系统调用.我在生产部署中遇到了一些文件锁定问题,所以我正在密切关注这些细节.
此示例代码:
using (FileStream fs = new FileStream("c:\\temp\\test.txt", FileMode.Create, FileAccess.Write, FileShare.Read))
{
fs.Write(new byte[] { 1, 2, 3, 4, 5 }, 0, 5);
fs.Close();
}
Run Code Online (Sandbox Code Playgroud)
导致以下系统调用:
9:27:09.4561092 AM ConsoleApplication1.vshost.exe 2320 CreateFile C:\temp\test.txt SUCCESS Desired Access: Generic Read/Write, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Open No Recall, Attributes: n/a, ShareMode: Read, AllocationSize: 0, OpenResult: Overwritten
9:27:12.2217409 AM ConsoleApplication1.vshost.exe 2320 WriteFile C:\temp\test.txt SUCCESS Offset: 0, Length: 5
9:27:12.2219901 AM ConsoleApplication1.vshost.exe 2320 CloseFile C:\temp\test.txt SUCCESS
9:27:12.2234484 AM ConsoleApplication1.vshost.exe …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Python 加载 *.pyd,但收到众所周知的“导入错误:DLL 加载失败:找不到指定的过程”。错误。
我已经完成了以下操作:
1.) 使用 Dependency Walker 研究 *.pyd。GPSVC.DLL 和 IESHIMS.DLL 出现丢失,但延迟加载,IEFRAME.DLL 也出现丢失导出,但也是延迟加载。据我了解,这些没有被使用,并且无论如何都是延迟加载,所以它们不应该是问题。
2.) 在 python 命令窗口中对 foo.pyd 执行“import foo”,并用 ProcMon 进行监视。ProcMon 在“foo.pyd”上显示事件“LoadImage”,结果成功。
这似乎意味着 *.pyd 文件已正确加载。
那么我错过了什么。我的 Windows 诊断告诉我一切都很好,但 python 告诉我无法加载该东西(通常是由于缺少 dll 或符号)。
有想法吗?
谢谢!
我有一个应用程序构建(使用多个不同进程)的 procmon 跟踪,该应用程序在某些时候无法写入文件,因为它正在被另一个进程使用。我看到的第一件事是该文件在构建开始时被删除:
\n\n3:49:32.9928378 PM foo.exe 11460 QueryOpen SUCCESS CreationTime: 8/26/2016 12:49:00 PM, LastAccessTime: 8/26/2016 12:49:00 PM, LastWriteTime: 8/26/2016 12:49:05 PM, ChangeTime: 8/26/2016 12:49:06 PM, AllocationSize: 57,344, EndOfFile: 56,624, FileAttributes: N\n3:49:32.9929337 PM foo.exe 11460 CreateFile SUCCESS Desired Access: Read Attributes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened\n3:49:32.9929791 PM foo.exe 11460 QuerySecurityFile SUCCESS Information: 0x20\n3:49:32.9930238 PM foo.exe 11460 QueryAttributeTagFile SUCCESS Attributes: N, ReparseTag: 0x0\n3:49:32.9930526 PM foo.exe 11460 SetDispositionInformationFile …Run Code Online (Sandbox Code Playgroud) 在一天中的某个时间对procproc结果进行过滤无法像预期的那样起作用。假设结果显示一行中的时间为“ 7:44:26.4065994 AM”。
与其他procmon字段(被统一视为字符串)不同,显然时间字段不是。可能有一些方法可以精确过滤,但这并不明显。
如何打开进程监视器并记录所有日志记录组件已停止。
默认情况下,它开始捕获所有日志,没有时间做CTRL+E这会停止捕获事件并应用我的过滤器。
它填充虚拟内存的速度足够快,以至于变得“没有响应”。
我对使用过滤器将文件 I/O 记录到特定路径感兴趣,但由于日志随不感兴趣的组件增长而导致进程监视器挂起。
我没有找到与进程监视器启动相关的任何答案。
procmon ×7
c# ×3
windows ×2
.net ×1
dll ×1
dump ×1
file-io ×1
filestream ×1
handle ×1
interop ×1
memory-leaks ×1
pyd ×1
python ×1
sysinternals ×1
winapi ×1