Проверьте соответствующие свойства вместо преобразования вывода Get-Acl
в строку.Это работает на всех версиях Windows:
Get-ChildItem -Recurse -Force | Where-Object {
$acl = Get-Acl $_.FullName
$acl.Access | Where-Object { $_.IdentityReference -eq 'Everyone' }
}
. Вы можете расширить проверку, чтобы фактически обнаружить ACE, которые разрешают запись для записи «Все» (приведенное выше обнаружит любой ACE для «Все»).):
Get-ChildItem -Recurse -Force | Where-Object {
$acl = Get-Acl $_.FullName
$acl.Access | Where-Object {
$_.IdentityReference -eq 'Everyone' -and
$_.AccessControlType -eq 'Allow' -and
$_.FileSystemRights -band 278
}
}
Однако остерегайтесь того, что списки ACL DENY имеют приоритет над списками ACL ALLOW, а явные ACL имеют приоритет над унаследованными списками ACL, поэтому «Все» могут иметь или не иметь права на запись, даже если существуетACE, предоставляющий доступ для записи.
- РАЗРЕШИТЬ ACE без DENY ACE ⇒ доступ разрешен (очевидно)
- РАЗРЕШИТЬ ACE без РАЗРЕШИТЬ ACE ⇒ доступ запрещен (очевидно)
- наследуется ALLOWACE и унаследованный DENY ACE ⇒ доступ запрещен
- явно разрешен ACE и унаследован DENY ACE ⇒ доступ разрешен
- унаследован ALLOW ACE и явный DENY ACE ⇒ доступ запрещен
- явно разрешен ACE иявный DENY ACE ⇒ отказано в доступе