Popraw poniższy skrypt wyświetlający użytkowników mających dostęp do folderu i podfolderów (1 poziom niżej) tak aby jako jego parametr podawać ścieżkę_i_nazwę_folderu oraz aby wyświetlał również użytkowników z grup które są na tej liście z wyłączeniem użytkowników z grup systemowych Active Directory (takich jak np. DOMENA\Administrators czy NT AUTHORITY\SYSTEMS), oraz jeśli grupy te zawierają inne grupy to również użytkowników w tych dalszych grupach.

# Importuj moduł ActiveDirectory
Import-Module ActiveDirectory

# Ustaw ścieżkę do głównego folderu
$path = "\\das\fs\grupowe\folder-0015"  # Zmień na swoją ścieżkę

# Funkcja do pobierania pełnego imienia i nazwiska użytkownika
function Get-FullName {
    param ($identityReference)
    
    # Sprawdź, czy identityReference jest w formacie DOMENA\nazwa_uzytkownika
    if ($identityReference -match "\\") {
        $parts = $identityReference.ToString().Split("\")
        $domain = $parts[0]
        $samAccountName = $parts[1]
        
        # Spróbuj pobrać użytkownika z AD
        try {
            $adUser = Get-ADUser -Identity $samAccountName -Properties DisplayName, GivenName, Surname
            
            # Jeśli DisplayName jest dostępne, użyj go, w przeciwnym razie połącz GivenName i Surname
            if ($adUser.DisplayName) {
                return $adUser.DisplayName
            } elseif ($adUser.GivenName -and $adUser.Surname) {
                return "$($adUser.GivenName) $($adUser.Surname)"
            } else {
                return $identityReference  # Użyj oryginalnej wartości, jeśli nie można pobrać imienia i nazwiska
            }
        } catch {
            # Jeśli to nie jest użytkownik AD lub wystąpił błąd, sprawdź czy to grupa
            try {
                $adGroup = Get-ADGroup -Identity $samAccountName -Properties Name
                return "$($adGroup.Name) (grupa)"
            } catch {
                # Jeśli to nie jest ani użytkownik, ani grupa, zwróć oryginalną wartość
                return $identityReference
            }
        }
    } else {
        # Jeśli nie jest w formacie DOMENA\nazwa_uzytkownika, zwróć oryginalną wartość
        return $identityReference
    }
}

# Funkcja do wyświetlania ACL w uproszczonej formie
function Show-ACL {
    param ($folderPath)
    Write-Host "Folder: $folderPath" -ForegroundColor Green
    $acl = Get-Acl -Path $folderPath
    $acl.Access | ForEach-Object {
        $identity = $_.IdentityReference
        $fullName = Get-FullName -identityReference $identity
        $rights = $_.FileSystemRights
        $type = $_.AccessControlType
        # Uproszczenie: RW jeśli jest Write, RO jeśli tylko Read, inaczej pełne
        $simpleRights = if ($rights -match "Write") { "RW" } elseif ($rights -match "Read") { "RO" } else { $rights.ToString() }
        Write-Host "Użytkownik/Grupa: $fullName | Uprawnienia: $simpleRights ($rights) | Typ: $type"
    }
    Write-Host ""  # Linia odstępu
}

# Wyświetl dla głównego folderu
Show-ACL -folderPath $path

# Pobierz bezpośrednie podfoldery (tylko jeden poziom niżej)
$subfolders = Get-ChildItem -Path $path -Directory -Depth 0  # Depth 0 to tylko bezpośrednie dzieci

# Wyświetl dla każdego podfolderu
foreach ($sub in $subfolders) {
    Show-ACL -folderPath $sub.FullName
}