如何使用PowerShell检查Windows文件或文件夹的审核设置
批量验证Windows文件/文件夹的Everyone组Failure审核设置
需求描述
需要批量验证Windows系统中多个文件和文件夹,是否针对Everyone组的特定访问类型开启了**Failure(失败)**审核标记,避免手动逐个登录端点查看属性的繁琐操作。
原始PowerShell脚本
# 包含文件夹列表的输入文件 $folderListFile = ".\folder_list.txt" # 读取文件夹列表到数组 $folderList = Get-Content $folderListFile # 遍历列表中的每个文件夹 foreach ($folderPath in $folderList) { # 获取文件夹的审核规则 $auditFlags = (Get-Acl $folderPath).Audit # 在控制台输出审核标记 Write-Output "文件夹路径: $folderPath" Write-Output "审核标记: $($auditFlags.AuditToString())" Write-Output "" }
folder_list.txt内容
C:\ C:\Windows C:\Windows\System32
执行错误输出
PS P:\Scripts> .\Get-FolderAuditSettings.ps1 文件夹路径: C:\ 无法对空值表达式调用方法。 At P:\Scripts\Get-FolderAuditSettings.ps1:14 char:32 + Write-Output "审核标记: $($auditFlags.AuditToString())" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull 审核标记: 文件夹路径: C:\Windows 无法对空值表达式调用方法。 At P:\Scripts\Get-FolderAuditSettings.ps1:14 char:32 + Write-Output "审核标记: $($auditFlags.AuditToString())" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull 审核标记: 文件夹路径: C:\Windows\System32 无法对空值表达式调用方法。 At P:\Scripts\Get-FolderAuditSettings.ps1:14 char:32 + Write-Output "审核标记: $($auditFlags.AuditToString())" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull
问题原因
当目标文件夹未配置任何审核规则时,(Get-Acl $folderPath).Audit会返回空值,此时调用AuditToString()方法就会触发空值调用错误。此外,原始脚本未筛选出Everyone组的Failure规则,无法直接满足需求。
修正后的脚本
以下脚本会先判断审核规则是否存在,再筛选出Everyone组的Failure审核项,清晰输出符合需求的结果:
# 包含文件夹列表的输入文件 $folderListFile = ".\folder_list.txt" # 读取文件夹列表到数组 $folderList = Get-Content $folderListFile # 遍历列表中的每个路径(支持文件和文件夹) foreach ($itemPath in $folderList) { Write-Output "=== 目标路径: $itemPath ===" # 检查路径是否存在 if (-not (Test-Path $itemPath)) { Write-Output "⚠️ 路径不存在" Write-Output "" continue } # 获取对象的ACL审核规则 $auditRules = (Get-Acl $itemPath).Audit if (-not $auditRules) { Write-Output "❌ 未配置任何审核规则" } else { # 筛选出Everyone组的Failure审核规则 $everyoneFailureRules = $auditRules | Where-Object { $_.IdentityReference.Value -eq 'Everyone' -and $_.Failure -eq $true } if (-not $everyoneFailureRules) { Write-Output "❌ 未找到Everyone组的Failure审核规则" } else { Write-Output "✅ 找到Everyone组的Failure审核规则:" $everyoneFailureRules | ForEach-Object { Write-Output " 访问类型: $($_.FileSystemRights)" Write-Output " 应用到: $($_.InheritanceFlags)" Write-Output " 继承设置: $($_.PropagationFlags)" Write-Output "" } } } Write-Output "" }
脚本说明
- 路径存在检查:先判断目标路径是否有效,避免无效路径的错误。
- 空值判断:当无审核规则时直接提示,避免空值调用错误。
- 精准筛选:只提取
Everyone组且Failure为true的规则,直接匹配需求。 - 详细输出:展示访问类型、继承范围等关键信息,便于取证。
内容的提问来源于stack exchange,提问作者viralarchitect
相关产品推荐
相关产品推荐

