Python 监视文件更改并识别用户

标签 python

我需要生成一个小脚本来监视用户对大型共享文件结构所做的意外更改。

我发现我可以使用 ReadDirectoryChanges API 获取更改事件 http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html

但是我不知道如何识别已进行更改的用户帐户,以便我可以发送通知。

是否可以获取移动文件/目录的用户帐户的名称。

最佳答案

棘手的问题,我会通过两种方式给你答案:

首先,作为可选部分,您可以监视文件修改本身,并添加自定义操作。

文件修改跟踪示例,适用于 Windows/Linux/Mac/BSD

import time
import watchdog.events
import watchdog.observers

class StateHandler(watchdog.events.PatternMatchingEventHandler):

    def on_modified(self, event):
        print(event.event_type)
        print(event.key)
        print(event.src_path)
        # Add your code here to do whatever you want on file modification

    def on_created(self, event):
        pass

    def on_moved(self, event):
        pass

    def on_deleted(self, event):
        pass
    
fs_event_handler = StateHandler()
fs_observer = watchdog.observers.Observer()
fs_observer.schedule(fs_event_handler, r'C:\Users\SomeUser\SomeFolder', recursive=True)


fs_observer.start()
try:
    while True:
        time.sleep(2)
except KeyboardInterrupt:
    fs_observer.stop()
fs_observer.join()

使用上述文件系统观察器,您可以触发安全事件日志审查。 您也可以将它们作为计划任务触发,但在文件系统修改时触发它们更有趣。

为了使安全事件日志包含文件修改信息,您需要使用 SACL 列表对所需目录启用文件审核(右键单击您的文件夹、安全、审核)。 然后您可以查看文件事件的安全日志。

可以使用 windows_tools 来查看安全日志。 使用python -m pip install windows_tools.wmi_queries安装它(显然仅适用于Windows)

然后执行以下操作:

from windows_tools.wmi_queries import *

result = query_wmi('SELECT * FROM Win32_NTLogEvent WHERE Logfile="Security" AND TimeGenerated > "{}"'.format(create_current_cim_timestamp(hour_offset=1)))
for r in result:
    print(r)

您可以添加 WHERE 子句,例如 EventCode={integer} ,以便仅过滤您需要的事件(文件修改或其他)。 通常您搜索的事件代码是 4656、4660、4663、4670(打开删除、编辑、创建)。

参见This microsoft article为了了解事件日志类接受哪些 WHERE 子句。

免责声明:我是 windows_tools 包的作者。

关于Python 监视文件更改并识别用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66896289/

相关文章:

python - 用大写字母拆分句子

python - numpy数组区域统计

python - 安装 pygtk 不工作

Python 多处理池与多处理线程池

javascript - PyQt 中的评估JavaScript - 未调用函数

python - 在列表列表中搜索

python - 在 python tkinter 应用程序中引用全局对象

python - 在 python 中使用 geopandas 将数据帧保存到 shapefile 会引发 bool 的 ValueError

python - 如何在 python 中计算 AWS API 签名 (v4)?

python pandas - 不同行的航类到达和离开时间 - 匹配并加入同一行然后绘制甘特图