【问题标题】:Monitor Executable Use监控可执行文件的使用
【发布时间】:2014-07-03 13:17:59
【问题描述】:

我的目标是设置一个服务来监视一个包含大约 200 个 .exe 文件的网络文件夹。我想要的是让服务在每次启动一个 .exe 时更新一个日志。基本上我想通过记录每个应用程序的每次使用来记录每个应用程序的使用情况。

我尝试使用 FileSystemWatcher 类来完成此操作,代码如下,认为 LastAccess 过滤器可以解决问题,但似乎不会。当我运行此代码时,打开应用程序时不会引发任何事件。

有什么方法可以使用 FileSysteWatcher 类来进行这种监控吗?有什么办法可以做我正在尝试的事情吗?

Private Sub StartWatch()

    Dim exeWatcher As New FileSystemWatcher

    exeWatcher.Path = "<path>"
    exeWatcher.Filter = "*.exe"
    exeWatcher.IncludeSubdirectories = True
    exeWatcher.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName Or NotifyFilters.Attributes)

    AddHandler exeWatcher.Changed, AddressOf ExeChanged

    exeWatcher.EnableRaisingEvents = True

End Sub

Private Sub ExeChanged(source As Object, e As FileSystemEventArgs)
    Console.WriteLine("File: " & e.FullPath & " " & DateTime.Now.ToString())
End Sub

【问题讨论】:

  • 一句话,没有。文件系统跟踪文件本身,而不是操作系统对它们的处理;执行不是“由文件”执行的,文件被复制到 RAM 并在那里执行。有点..大声笑
  • @Grim 这是一个有用的区别。谢谢。

标签: vb.net


【解决方案1】:

看看这个Stack Overflow answer,它涉及监视WMI Win32_Process 实例创建事件(基本上,当WMI 注册一个新进程已创建时)。这可能是在 C++ 内核挂钩之外找出进程何时启动的最有效方法。

此时,您只需要使用正则表达式来测试文件路径,看看它是否来自该文件夹,如果是,则做出适当的响应。

【讨论】:

  • 这仅适用于本地系统上的进程,或连接到特定远程系统后。 exe 文件位于网络共享上,表明可能有许多不同的计算机正在启动这些程序。他必须连接到每台机器才能以这种方式获取信息……尽管无论如何他都可能需要这样做。
  • 是的,痛苦但真实。即使他成功地想出了一种监控网络共享访问的方法,Windows 对“访问”的理解如此细致,但实际上并没有表达“访问到执行”的方式。所以每次有人用资源管理器浏览文件夹、查看属性等时,他都会看到一个“已读”。
  • 谢谢。这将是我的下一个问题——如何让 WMI 在网络共享上工作。从这些 cmets 看来,我必须朝着另一个方向去获取我需要的信息。我会将此答案标记为已接受,因为它确实为我指出了我所询问的解决方案。
【解决方案2】:

文件系统观察程序不能用于完成此操作,因为它不知道为什么正在访问文件。可以访问它以显示可执行文件的属性,或者有人将其复制到他们的本地硬盘驱动器。

如果您的目标是查看哪些计算机正在运行您的可执行文件,您可以使用 Windows Management Instrumentation (WMI) 远程查询计算机以查找 Win32_Process 并确定您的进程是否在那里运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多