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

# Определение параметров командной строки
param (
    [Parameter(Mandatory=$false, Position=0, HelpMessage="Путь к сетевому каталогу")]
    [string]$DestinationPath
)

# Определение функций для установки разрешений
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-Acl -Path $FolderPath        

        # Создаем правило доступа
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Group, $Permission, "ContainerInherit,ObjectInherit", "None", "Allow")

        # Добавляем правило в ACL
        $Acl.AddAccessRule($AccessRule)        

        # Устанавливаем новый 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 "Не удалось установить фильтрованные разрешения. Ошибка: $_"
    }
}

# Функция для выполнения операций по установке разрешений
function Execute-Permissions {
    param (
        [string]$Path
    )

    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
                Write-Host "Каталог создан."
            }
            catch {
                Write-Host "Не удалось создать каталог. Ошибка: $_"
                return
            }
        }
        else {
            return
        }
    }

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

        Write-Host "Разрешения успешно назначены для $Path."
    }
    catch {
        Write-Host "Не удалось назначить разрешения. Ошибка: $_"
    }
}

# Проверка наличия аргумента командной строки
if ($DestinationPath) {
    # Режим командной строки
    Execute-Permissions -Path $DestinationPath
}
else {
    # Создание формы
    $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)

    # Кнопка Создать каталог
    $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)

    # Обработчик кнопки Создать каталог
    $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()
}
Проведи рефакторинг