Создай отдельную функцию для эффективной проверки прав на чтение. Создай отдельную функцию для эффективной проверки прав на запись. Учитывай другие связанные права (например, ReadAndExecute, Modify и т.д.), используй filesystemrights.hasflag
-- 
# Определение функций

function IsValidNTAccount {
    param (
        [string]$Identity
    )
    $ntAccount = New-Object System.Security.Principal.NTAccount
    return [System.Security.Principal.NTAccount]::TryParse($Identity, [ref]$ntAccount)
}

function CreateIssueObject {
    param (
        [string]$Folder,
        [string]$Identity,
        [string]$Issue
    )
    [PSCustomObject]@{
        Папка                  = $Folder
        Пользователь_или_Группа = $Identity
        Проблема               = $Issue
    }
}

# Укажите путь к папке
$rootPath = "C:\Path\To\RootFolder"

# Укажите путь для сохранения CSV файла

$csvPath = "FolderAccessIssuesReport_$(Get-Date -Format 'yyyy-MM-dd_HH').csv"

# Разрешённые группы с полными правами
$allowedGroups = @("SMZ File admins", "Administrators", "Администраторы", "СИСТЕМА", "SYSTEM")

# Получаем все папки рекурсивно и обрабатываем их в конвейере
Get-ChildItem -Path $rootPath -Recurse -Directory -ErrorAction SilentlyContinue |
    ForEach-Object {
        $folder = $_.FullName
        try {
            Get-Acl -Path $folder -ErrorAction Stop |
                Select-Object -ExpandProperty Access |
                Where-Object { -not $_.IsInherited } |
                ForEach-Object {
                    $identity = $_.IdentityReference.Value
                    $rights = $_.FileSystemRights

                    # Проверка на валидный NTAccount
                    if (-not (IsValidNTAccount -Identity $identity)) {
                        # Некорректный SID
                        CreateIssueObject -Folder $folder -Identity $identity -Issue 'Некорректный SID'
                    }
                    else {
                        # Проверка на FullControl
                        if ($rights.HasFlag([System.Security.AccessControl.FileSystemRights]::FullControl) -and 
                            -not ($allowedGroups -contains $identity)) {
                            # Группа или SID имеет FullControl, но не входит в список разрешённых
                            CreateIssueObject -Folder $folder -Identity $identity -Issue 'Неразрешённая группа с полным контролем'
                        }

                        # Проверка на группу "Все"
                        if ($identity -eq "Все" -or $identity -eq "Everyone") {
                            CreateIssueObject -Folder $folder -Identity $identity -Issue 'Присутствует группа "Все"'
                        }

                        # Проверка на группы с окончаниями " W" и " R"
                        if ($identity -match ' W$') {
                            # Группа должна иметь права на запись
                            if (-not ($rights.HasFlag([System.Security.AccessControl.FileSystemRights]::Write))) {
                                CreateIssueObject -Folder $folder -Identity $identity -Issue 'Отсутствуют права на запись'
                            }
                        }
                        elseif ($identity -match ' R$') {
                            # Группа должна иметь права на чтение
                            if (-not ($rights.HasFlag([System.Security.AccessControl.FileSystemRights]::Read))) {
                                CreateIssueObject -Folder $folder -Identity $identity -Issue 'Отсутствуют права на чтение'
                            }
                            # Группа не должна иметь права на запись
                            if ($rights.HasFlag([System.Security.AccessControl.FileSystemRights]::Write)) {
                                CreateIssueObject -Folder $folder -Identity $identity -Issue 'Имеются права на запись'
                            }
                        }
                    }
                }
        }
        catch [System.UnauthorizedAccessException] {
            # Если доступ запрещён, добавляем запись об этом
            CreateIssueObject -Folder $folder -Identity '' -Issue 'Доступ запрещён'
        }
        catch {
            # Обработка других ошибок
            CreateIssueObject -Folder $folder -Identity '' -Issue "Ошибка: $_"
        }
    } | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8