我尝试用watchdog开发一个文件监控系统
这是我的源代码
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from time import sleep
class EventProcessing (FileSystemEventHandler) :
# 事件处理类
def on_moved (self, event) -> '文件移动触发' :
print("文件移动触发")
print(event)
def on_created (self, event) -> '文件创建触发' :
print("文件创建触发")
print(event)
def on_deleted (self, event) -> '文件删除触发' :
print("文件删除触发")
print(event)
def on_modified (self, event) -> '文件编辑触发' :
print("文件编辑触发")
print(event)
a = Observer()
# 观察者对象
b = EventProcessing()
# 事件处理对象
a.schedule(b, 'C:\\Users\\YWJ\\Desktop',True)
# 观察者绑定事件处理
a.start()
# 启动观察者
while True : pass
他已经具备基本的文件监控功能
现在我想添加一个功能 即:
在捕捉到文件创建或删除事件时
记录或获取创建文件或删除文件的发起程序
例如:
a.exe创建了一个文件"a.txt"监控系统能捕捉到并且能知道是"a.exe"创建的
注意:是在文件创建时记录!
我的想法
通过Google我了解到Windows中开启文件审核可以通过读取Windows文件日志获取创建或删除程序
But
Windows的日志记录和Python watchdog 存在时间差 Python watchdog 捕捉到事件后Windows日志需要间隔大约30多秒才会记录 这是程序不允许的 于是我尝试Google Python watchdog 能否直接获取到创建程序 But 并没有找到有用的资料
求各位能为我解答 Python watchdog 能否直接获取到创建程序 或者 解决Windows日志的时间差
如果各位有更好的办法希望您能和我分享
感谢!
可以使用Python的psutil库来获取当前正在运行的进程信息,然后将创建文件的进程ID与进程信息匹配,最终得到创建文件的发起程序。具体实现代码如下:
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from time import sleep
import psutil
class EventProcessing(FileSystemEventHandler):
# 事件处理类
def on_moved(self, event) -> '文件移动触发':
print("文件移动触发")
print(event)
def on_created(self, event) -> '文件创建触发':
print("文件创建触发")
print(event)
process_name = self.get_process_name()
print(f"创建文件的进程:{process_name}")
def on_deleted(self, event) -> '文件删除触发':
print("文件删除触发")
print(event)
process_name = self.get_process_name()
print(f"删除文件的进程:{process_name}")
def on_modified(self, event) -> '文件编辑触发':
print("文件编辑触发")
print(event)
def get_process_name(self):
process_id = psutil.Process(event.pid).ppid()
process_name = psutil.Process(process_id).name()
return process_name
if __name__ == '__main__':
a = Observer()
# 观察者对象
b = EventProcessing()
# 事件处理对象
a.schedule(b, 'C:\\Users\\YWJ\\Desktop', True)
# 观察者绑定事件处理
a.start()
# 启动观察者
while True:
pass
在on_created和on_deleted方法中,调用get_process_name方法获取创建/删除文件的进程名,并进行输出。方法中首先使用event.pid获取到创建/删除文件的进程ID,然后使用psutil库获取该进程的父进程ID,最终通过父进程ID获取到进程名。