如果我设置了一个网络文件夹,然后仅与某些组/人员共享该文件夹,是否可以通过电子邮件或其他形式的通知收到文件夹已被访问或有人试图访问该文件夹的通知?
例如,我让 PersonA 成为管理员,但 personA 无权访问文件夹 B。但是,由于 personA 具有管理员权限,他们仍然可以浏览该文件夹。
如果文件夹被未指定的人员访问,是否可以设置某种方式来通知某些人/群组?
答案1
您可以为文件夹设置 Windows 审核以生成事件日志条目。
设置文件夹审核
https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/apply-a-basic-audit-policy-on-a-file-or-folder
这是第一步。
只有您设置了审核的文件和文件夹才会在 EventLog 中生成事件。
导航:File/Folder --> Properties --> Security --> Advanced --> Auditing
添加:Read
对于所选用户/组的所有读取活动(打开文件夹、读取属性、打开文件),或用于List Folder/ Read data
更严格的审计。设置审计策略 (GPO)
https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/audit-file-system
然后您需要Audit File System
设置为Success
(不要使用Audit File Share
!) 导航:gpedit.msc --> Computer Configuration --> Windows Settings --> Security Settings --> Advanced Audit Policy - Configuration --> System Audit Policies - Local Group Policy --> Object Access --> "Audit File System"
文件系统
此策略设置允许你审核用户访问文件系统对象的尝试。仅针对指定了系统访问控制列表 (SACL) 的对象生成安全审核事件,并且仅当请求的访问类型(例如写入、读取或修改)和发出请求的帐户与 SACL 中的设置匹配时才会生成安全审核事件。有关启用对象访问审核的详细信息,请参阅https://go.microsoft.com/fwlink/?LinkId=122083。
如果配置此策略设置,则每次帐户访问具有匹配 SACL 的文件系统对象时都会生成审核事件。成功审核记录成功的尝试,失败审核记录不成功的尝试。如果未配置此策略设置,则每次帐户访问具有匹配 SACL 的文件系统对象时都不会生成审核事件。
注意:您可以使用该对象的“属性”对话框中的“安全”选项卡在文件系统对象上设置 SACL。
卷:取决于文件系统 SACL 的配置方式。
通知
现在,这部分有点棘手,因为每次读取访问不仅会创建一个事件条目,还会创建多个事件条目。
此外,事件日志过滤器不允许通配符搜索,而通配符搜索是获得准确结果所必需的,因为我们不仅应该过滤目录C:\temp
,还应该过滤C:\temp\*
以获取对子文件夹的访问权限。这可以通过 PowerShell 脚本实现,该脚本作为计划任务运行并读取事件日志并执行后续过滤。
您必须
SubjectUserName
分别替换用户名和目标目录路径。然后,您可以利用 PowerShell 将其组合成结构化的单个 (html) 邮件,并将其发送给您想要的所有人。
<#
resources:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-winevent?view=powershell-7.1
https://docs.microsoft.com/en-us/powershell/scripting/samples/Creating-Get-WinEvent-queries-with-FilterHashtable?view=powershell-7.1
#>
using namespace System.Diagnostics.Eventing.Reader
$keywords = [StandardEventKeywords]@(
[StandardEventKeywords]::AuditSuccess
[StandardEventKeywords]::AuditFailure
)
$logLevels = [int[]]@(
[StandardEventLevel]::LogAlways
[StandardEventLevel]::Critical
[StandardEventLevel]::Error
[StandardEventLevel]::Warning
[StandardEventLevel]::Informational
[StandardEventLevel]::Verbose
)
$eventFilter = @{
LogName = 'Security'
Level = $logLevels
StartTime = (Get-Date) - [timespan]::new(1, 0, 0) # last hour
EndTime = (Get-Date)
ID = '4663' # "Audit File System"
Keywords = $keywords.value__
SubjectUserName = '<username>'
}
# read event log
$events = Get-WinEvent -FilterHashtable $eventFilter
# we have to do post-filter for the directory path,
# because the eventFitler does not allow searching with wildcards or starts-with
# see: https://docs.microsoft.com/en-us/archive/blogs/askds/advanced-xml-filtering-in-the-windows-event-viewer#xpath-10-limitations
$directoryPath = 'C:\temp'
# make it fit for regex by escaping and appending optional backslash
$directoryPathPattern = [regex]::Escape($directoryPath) -replace '(\\|\/)+$', '(?:\\.+)?'
foreach ($event in $events) {
# serialization + deserialization due to all missing property names (like 'ObjectName')
$eventXml = [xml]$event.toXml()
# look for directory path in named event data field 'ObjectName'
$directoryMatch = $eventXml.Event.EventData.Data | Where-Object {
$_.Name -eq 'ObjectName' -and $_.'#text' -match "`^$directoryPathPattern`$"
}
if ($null -ne $directoryMatch) {
$event
}
}