# Загрузка необходимых сборок
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Set-ExecutionPolicy Bypass -Scope Process

# Определение функций для установки разрешений
function Set-PermissionsForGroupsInFolder {
    [CmdletBinding()]
    param (
        [string]$FolderPath
    )
    $AdGroups = Get-ADGroup -Filter "Description -eq '$FolderPath'" | Select-Object -ExpandProperty Name

    foreach ($Group in $AdGroups) {
        Write-Host "Processing group: $Group"
    
        if ($Group.EndsWith(" R")) {
            $Permission = [System.Security.AccessControl.FileSystemRights]::ReadAndExecute
        } elseif ($Group.EndsWith(" M")) {
            $Permission = [System.Security.AccessControl.FileSystemRights]::Modify
        } else {
            Write-Host "Skipping group: $Group"
            continue
        }

        # Получаем текущий ACL папки
        #$Acl = (Get-Item -Path $FolderPath).GetAccessControl()
        $Acl = Get-Acl -Path $FolderPath        
    
        # Создаем правило доступа
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Group, $Permission, "ContainerInherit,ObjectInherit", "None", "Allow")
    
        # Добавляем правило в ACL
        $Acl.AddAccessRule($AccessRule)        
    
        # Устанавливаем новый ACL
        #Set-Acl -Path $FolderPath -AclObject $Acl
        (Get-Item $FolderPath).SetAccessControl($acl)        
    
        Write-Host "Permissions set for group: $Group"
    }
}

function Set-FilteredPermissions {
    param (
        [string]$DestinationPath
    )

    # Путь к папке-источнику разрешений
    $PermissionSourcePath = "\\smzmi-win2\Teams"

    try {
        # Получить ACL из папки-источника разрешений
        $PermissionSourceAcl = Get-Acl -Path $PermissionSourcePath

        # Отфильтровать разрешения для нужных групп
        $FilteredAccessRules = $PermissionSourceAcl.Access | Where-Object {
            $_.IdentityReference -match "SMZMI\\SMZ File Admins" -or
            $_.IdentityReference -match "NT AUTHORITY\\СИСТЕМА" -or
            $_.IdentityReference -match "BUILTIN\\Администраторы"
        }

        # Получение объекта папки по указанному пути
        $Folder = Get-Item -Path $DestinationPath

        # Получение ACL текущей папки
        $Acl = Get-Acl -Path $Folder.FullName


        # Отключение наследования и удаление унаследованных разрешений
        $Acl.SetAccessRuleProtection($true, $false)

        # Перенос отфильтрованных разрешений из источника к текущей папке
        foreach ($Rule in $FilteredAccessRules) {
            $Acl.AddAccessRule($Rule)
        }

        # Установка нового ACL для папки
        Set-Acl -Path $Folder.FullName -AclObject $Acl -ErrorAction SilentlyContinue

        Write-Host "Фильтрованные разрешения установлены для: $DestinationPath"
    }
    catch {
        Write-Host "Не удалось установить фильтрованные разрешения. Ошибка: $_"
    }
}

# Создание формы
$form = New-Object System.Windows.Forms.Form
$form.Text = "Установка разрешений для сетевого каталога"
$form.Size = New-Object System.Drawing.Size(600,400)
$form.StartPosition = "CenterScreen"

# Метка для пути
$lblPath = New-Object System.Windows.Forms.Label
$lblPath.Text = "Путь к сетевому каталогу:"
$lblPath.Location = New-Object System.Drawing.Point(10,20)
$lblPath.Size = New-Object System.Drawing.Size(200,20)
$form.Controls.Add($lblPath)

# Текстовое поле для ввода пути
$txtPath = New-Object System.Windows.Forms.TextBox
$txtPath.Location = New-Object System.Drawing.Point(10,45)
$txtPath.Size = New-Object System.Drawing.Size(400,20)
$form.Controls.Add($txtPath)

<#
# Кнопка Обзор
$btnBrowse = New-Object System.Windows.Forms.Button
$btnBrowse.Text = "Обзор"
$btnBrowse.Location = New-Object System.Drawing.Point(420,43)
$btnBrowse.Size = New-Object System.Drawing.Size(75,23)
$form.Controls.Add($btnBrowse)
#>

# Кнопка Создать каталог
$btnCreate = New-Object System.Windows.Forms.Button
$btnCreate.Text = "Создать каталог"
$btnCreate.Location = New-Object System.Drawing.Point(420,43)
$btnCreate.Size = New-Object System.Drawing.Size(150,23)
$form.Controls.Add($btnCreate)

# Метка для списка групп
$lblGroups = New-Object System.Windows.Forms.Label
$lblGroups.Text = "Группы с явными разрешениями:"
$lblGroups.Location = New-Object System.Drawing.Point(10,80)
$lblGroups.Size = New-Object System.Drawing.Size(250,20)
$form.Controls.Add($lblGroups)

# Список для отображения групп
$listGroups = New-Object System.Windows.Forms.ListBox
$listGroups.Location = New-Object System.Drawing.Point(10,105)
$listGroups.Size = New-Object System.Drawing.Size(560,200)
$form.Controls.Add($listGroups)

# Кнопка Получить группы
$btnGetGroups = New-Object System.Windows.Forms.Button
$btnGetGroups.Text = "Получить группы"
$btnGetGroups.Location = New-Object System.Drawing.Point(10,320)
$btnGetGroups.Size = New-Object System.Drawing.Size(120,30)
$form.Controls.Add($btnGetGroups)

# Кнопка Назначить разрешения
$btnSetPermissions = New-Object System.Windows.Forms.Button
$btnSetPermissions.Text = "Назначить разрешения"
$btnSetPermissions.Location = New-Object System.Drawing.Point(150,320)
$btnSetPermissions.Size = New-Object System.Drawing.Size(150,30)
$form.Controls.Add($btnSetPermissions)

# Поле для отображения сообщений
$txtLog = New-Object System.Windows.Forms.TextBox
$txtLog.Location = New-Object System.Drawing.Point(10,360)
$txtLog.Size = New-Object System.Drawing.Size(560,20)
$txtLog.ReadOnly = $true
$form.Controls.Add($txtLog)

<#
# Обработчик кнопки Обзор
$btnBrowse.Add_Click({
    $folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    $folderBrowser.Description = "Выберите сетевой каталог"
    $folderBrowser.ShowNewFolderButton = $true

    if ($folderBrowser.ShowDialog() -eq "OK") {
        $txtPath.Text = $folderBrowser.SelectedPath
    }
})
#>

# Обработчик кнопки Создать каталог
$btnCreate.Add_Click({
    $path = $txtPath.Text.Trim()
    if ([string]::IsNullOrEmpty($path)) {
        [System.Windows.Forms.MessageBox]::Show("Пожалуйста, укажите путь к каталогу.", "Ошибка", "OK", "Error")
        return
    }

    if (-Not (Test-Path -Path $path)) {
        try {
            New-Item -Path $path -ItemType Directory -Force | Out-Null
            [System.Windows.Forms.MessageBox]::Show("Каталог успешно создан.", "Успех", "OK", "Information")
        }
        catch {
            [System.Windows.Forms.MessageBox]::Show("Не удалось создать каталог. Ошибка: $_", "Ошибка", "OK", "Error")
        }
    }
    else {
        [System.Windows.Forms.MessageBox]::Show("Каталог уже существует.", "Информация", "OK", "Information")
    }
})

# Обработчик кнопки Получить группы
$btnGetGroups.Add_Click({
    $listGroups.Items.Clear()
    $path = $txtPath.Text.Trim()

    if (-Not (Test-Path -Path $path)) {
        [System.Windows.Forms.MessageBox]::Show("Указанный каталог не существует.", "Ошибка", "OK", "Error")
        return
    }

    try {
        $acl = Get-Acl -Path $path
        $accessRules = $acl.Access | Where-Object { -not $_.IsInherited -and $_.IdentityReference -match "^(SMZMI|NT AUTHORITY|BUILTIN)" }

        foreach ($rule in $accessRules) {
            $listGroups.Items.Add($rule.IdentityReference.Value)
        }

        if ($listGroups.Items.Count -eq 0) {
            $listGroups.Items.Add("Не найдено групп с явными разрешениями.")
        }

        $txtLog.Text = "Группы получены успешно."
    }
    catch {
        [System.Windows.Forms.MessageBox]::Show("Не удалось получить группы. Ошибка: $_", "Ошибка", "OK", "Error")
    }
})

# Обработчик кнопки Назначить разрешения
$btnSetPermissions.Add_Click({
    $path = $txtPath.Text.Trim()

    if (-Not (Test-Path -Path $path)) {
        $result = [System.Windows.Forms.MessageBox]::Show("Каталог не существует. Создать его?", "Подтверждение", "YesNo", "Question")
        if ($result -eq "Yes") {
            try {
                New-Item -Path $path -ItemType Directory -Force | Out-Null
                $txtLog.Text = "Каталог создан."
            }
            catch {
                [System.Windows.Forms.MessageBox]::Show("Не удалось создать каталог. Ошибка: $_", "Ошибка", "OK", "Error")
                return
            }
        }
        else {
            return
        }
    }

    try {
        # Выполнение функций последовательно
        Set-PermissionsForGroupsInFolder -FolderPath $path
        Set-FilteredPermissions -DestinationPath $path
        

        [System.Windows.Forms.MessageBox]::Show("Разрешения успешно назначены.", "Успех", "OK", "Information")
        $txtLog.Text = "Разрешения назначены."
    }
    catch {
        [System.Windows.Forms.MessageBox]::Show("Не удалось назначить разрешения. Ошибка: $_", "Ошибка", "OK", "Error")
        $txtLog.Text = "Ошибка при назначении разрешений."
    }
})

# Отображение формы
[void]$form.ShowDialog()

Добавь возможность вызывать этот скрипт из командной строки передавая в качестве аргумент путь к сетевому каталогу. Если задача тебе не понятна, то задай вопрос