我需要生成一个小脚本来监视用户对大型共享文件结构所做的意外更改。
我发现我可以使用 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/