none
скрипт управлением ntfs правами RRS feed

  • Вопрос

  • Add-Type -assembly System.Windows.Forms
    
    function Get-DomainGroup {
        $Search = [adsisearcher]"(&(objectCategory=group)(sAMAccountName=*)(groupType:1.2.840.113556.1.4.803:=2147483648))"
        foreach ($group in $($Search.FindAll())){
            $group.properties.samaccountname
        }
    }
    
    $main_form = New-Object System.Windows.Forms.Form
    $main_form.Text ='Автоматическая смена разрешений'
    $main_form.Width = 100
    $main_form.Height = 100
    $main_form.AutoSize = $true
     
    $Label = New-Object System.Windows.Forms.Label
    $Label.Text = "Выберете пользователя:"
    $Label.Location  = New-Object System.Drawing.Point(10,10)
    $Label.AutoSize = $true
    $main_form.Controls.Add($Label) | Out-Null
    
    $ComboBox = New-Object System.Windows.Forms.ComboBox
    $ComboBox.DataSource = Get-DomainGroup| Sort
    $ComboBox.Location  = New-Object System.Drawing.Point(10,30)
    $ComboBox.Width          = 280
    $ComboBox.AutoSize = 1
    $main_form.Controls.Add($ComboBox) | Out-Null
     
    
    $Label = New-Object System.Windows.Forms.Label
    $Label.Text = "Выберете папку:"
    $Label.Location  = New-Object System.Drawing.Point(10,60)
    $Label.AutoSize = 1
    $main_form.Controls.Add($Label) | Out-Null
    
    
    $TextBox = New-Object System.Windows.Forms.TextBox
    $TextBox.Location  = New-Object System.Drawing.Point(10,120)
    $TextBox.Width          = 280
    $TextBox.AutoSize = 1
    $TextBox.text = $null
    $TextBox.add_TextChanged({
        if(!$TextBox.Text) 
        {
            $script:button.Enabled = $false
        }
    })
    $main_form.Controls.Add($TextBox) | Out-Null
    
    
    $button = New-Object System.Windows.Forms.Button
    $button.Text = 'Обзор'
    $button.Location = New-Object System.Drawing.Point(100,80)
    $main_form.Controls.Add($button) | Out-Null
    $button.add_click({browse}) 
    
    function browse 
    { 
        Add-Type -AssemblyName System.Windows.Forms
        $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{
            SelectedPath = 'C:\Temp’
        }
     
        [void]$FolderBrowser.ShowDialog()
        $TextBox.Text = $FolderBrowser.SelectedPath
        
        if($TextBox.Text)
        {
            $script:button.Enabled = $true
        }
    }
    
    
    
    $Label = New-Object System.Windows.Forms.Label
    $Label.Text = "Выберете права для пользователя:"
    $Label.Location  = New-Object System.Drawing.Point(10,150)
    $Label.AutoSize = $true
    $main_form.Controls.Add($Label) | Out-Null
    
    $CheckBox1           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox1.Location      = New-Object System.Drawing.Point(10,170)
    $CheckBox1.Text          = "Полный доступ"
    $CheckBox1.Checked       = 0
    $CheckBox1.AutoSize      = 1
    $main_form.Controls.Add($CheckBox1) | Out-Null
    
    $CheckBox2           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox2.Location      = New-Object System.Drawing.Point(10,190)
    $CheckBox2.Text          = "Изменение"
    $CheckBox2.Checked       = 0
    $CheckBox2.AutoSize      = 1
    $main_form.Controls.Add($CheckBox2) | Out-Null
    
    $CheckBox3           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox3.Location      = New-Object System.Drawing.Point(10,210)
    $CheckBox3.Text          = "Просмотр"
    $CheckBox3.Checked       = 0
    $CheckBox3.AutoSize      = 1
    $main_form.Controls.Add($CheckBox3) | Out-Null
    
    $CheckBox4           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox4.Location      = New-Object System.Drawing.Point(10,230)
    $CheckBox4.Text          = "Чтение и выполнение"
    $CheckBox4.Checked       = 0
    $CheckBox4.AutoSize      = 1
    $main_form.Controls.Add($CheckBox4) | Out-Null
    
    $CheckBox5           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox5.Location      = New-Object System.Drawing.Point(10,250)
    $CheckBox5.Text          = "Список содержимого"
    $CheckBox5.Checked       = 0
    $CheckBox5.AutoSize      = 1
    $main_form.Controls.Add($CheckBox5) | Out-Null
    
    $CheckBox6           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox6.Location      = New-Object System.Drawing.Point(10,270)
    $CheckBox6.Text          = "Чтение"
    $CheckBox6.Checked       = 0
    $CheckBox6.AutoSize      = 1
    $main_form.Controls.Add($CheckBox6) | Out-Null
    
    $CheckBox7           = New-Object System.Windows.Forms.CheckBox 
    $CheckBox7.Location      = New-Object System.Drawing.Point(10,290)
    $CheckBox7.Text          = "Запись"
    $CheckBox7.Checked       = 0
    $CheckBox7.AutoSize      = 1
    $main_form.Controls.Add($CheckBox7) | Out-Null
     
     
    $ContextMenu = New-Object System.Windows.Forms.ContextMenu
    $ContextMenu.MenuItems.Add("ContextMenu") | Out-Null
    $ContextMenu.MenuItems.Add("1") | Out-Null
    $main_form.ContextMenu = $ContextMenu
    
    $button = New-Object System.Windows.Forms.Button
    $button.Text = 'выполнить'
    $button.Location = New-Object System.Drawing.Point(100,310)
    $button.Enabled = $false
    $button.add_click({
       if($ComboBox.Text)
       {
            Import-Module NTFSSecurity
            
            Function IsAce {
              param($Path,$Account,$AccessRights,$AppliesTo)
              
              try {
                  Write-Host "[#] $Path" -ForegroundColor Green
                  $isAce = Get-NTFSAccess -Path $Path -Account $Account | Where {$_.AccessRights.value__ -band $AccessRights.value__} 
              
                  if($isAce) 
                  {
                        Write-Host "`t[=] Path: $Path User: $Account уже имеет права доступа $AccessRights к объекту" -ForegroundColor Yellow
                  } 
                  else
                  {
                        $success = Add-NTFSAccess -Path $Path -Account $Account -AccessRights $AccessRights -AppliesTo $AppliesTo -PassThru
                        if($success)
                        {
                           Write-Host "`t[+] Path: $Path User: $Account были предоставлены права $AccessRights" -ForegroundColor Green
                        }
    
                  }
              }
              catch {
                 Write-Error $_
              }
            }
    
            Function AddACE {
                [CmdletBinding()]
                param (
                    [Parameter(Mandatory=$True)]
                    [ValidateScript({Test-Path -LiteralPath $_ -PathType ‘Container’})] 
                    [String]$Path,
                    [Parameter(Mandatory=$True)]
                    [Security2.IdentityReference2]$Account,
                    [Parameter(Mandatory=$True)] 
                    [Security2.FileSystemRights2]$AccessRights,
                    [Security2.FileSystemRights2]$ParentAccessRights = "ListDirectory",
                    [Security2.ApplyTo]$AppliesTo = "ThisFolderSubfoldersAndFiles"       
                )
        
                # добавить на папку определенные права
                IsAce $Path $Account $AccessRights $AppliesTo
        
                # цикл опроса уровней и выдача им просмотра
                $pArr = (Split-Path $Path).Split("\/") | Where {$_}
        
                if($pArr.Count -gt 1)
                {   
                    $tPath = $pArr[0]
                    $pArr[1..($pArr.Count)] | ForEach-Object -Process {
                        $tPath = Join-Path $tPath $_ 
                        IsAce $tPath $Account $ParentAccessRights $AppliesTo
                    }
                }
        
            }
    
            $cRights = $CheckBox1,$CheckBox2,$CheckBox3,$CheckBox4,$CheckBox5,$CheckBox6,$CheckBox7 | Where {$_.Checked} | Foreach {
                switch($_.Text)
                {
                    "Чтение"               {"Read";break}
                    "Запись"               {"Write";break}
                    "Просмотр"             {"ListDirectory";break}
                    "Полный доступ"        {"FullControl";break}
                    "Изменение"            {"Modify";break}
                    "Чтение и выполнение"  {"Readandexecute";break}
                    "Список содержимого"   {"Listdirectory";break}
                }
            }
    
            AddAce -Path $TextBox.Text -Account $ComboBox.Text -AccessRights $cRights
       }
    })
    
    $main_form.Controls.Add($button) | Out-Null
    
     
     
    $main_form.ShowDialog() | Out-Null

    Добрый день. имею вот такой скрипт. помогите плиз дополнить  его парой усовершенстваний. 

    1. после выдачи прав группе к выбранной папки, чтобы показало все существующие права на эту выбранную папку

    2. кнопки выбора прав чтобы работали по принципу вкладке "безопасность". выбираешь допустим "изменение" и он сам проставлял доп галки на чтении. записи...

    ps знаю плохо))

    20 февраля 2017 г. 10:39

Ответы

  • ну в простом варианте как то так:

    $Label5 = New-Object System.Windows.Forms.Label
    $Label5.Text = "Текущие разрешения:"
    $Label5.Location  = New-Object System.Drawing.Point(10,350)
    $Label5.AutoSize = 1
    $main_form.Controls.Add($Label5) | Out-Null
    
    
    $TextBox2 = New-Object System.Windows.Forms.RichTextBox
    $TextBox2.Location  = New-Object System.Drawing.Point(10,370)
    $TextBox2.Width          = 280
    $TextBox2.Height         = 140
    $TextBox2.AutoSize = 0
    $TextBox2.text = "Папка не выбрана"
    $main_form.Controls.Add($TextBox2) | Out-Null
    
    
    $button = New-Object System.Windows.Forms.Button
    $button.Text = 'Обзор'
    $button.Location = New-Object System.Drawing.Point(100,80)
    $main_form.Controls.Add($button) | Out-Null
    $button.add_click({browse}) 
    
    function browse 
    { 
    Add-Type -AssemblyName System.Windows.Forms
        $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{
            SelectedPath = 'C:\Temp'
        }
     
        [void]$FolderBrowser.ShowDialog()
        $TextBox.Text = $FolderBrowser.SelectedPath
        
        if($TextBox.Text)
        {
            $script:button.Enabled = $true
            $script:Label5.Text = "Текущие разрешения:$(($TextBox).Text)"
    #        $script:TextBox2.Text =Get-Acl -Path $TextBox.Text | % { $_.access }|select -Property IdentityReference,AccessControlType,FileSystemRights|fl|out-string
            $script:TextBox2.Text =(get-acl -Path $TextBox.Text).AccessToString
        }
    }
    

    впилите этот кусок там де кнопку описываете(кнопка не изменилась,выделил жирным).

    добавил пару элементов интерфейса и подредактировал функцию броуз

    есть косяки с выводом нестандартных дескрипторов и прочего, надо допиливать, но вот очень лень

    а вот директор, главбух и прочие проперти обьектов из ад - вот это уже не мне лень, а вам домашнее задание :-) я это делать точно не буду


    • Изменено Svolotch 21 февраля 2017 г. 13:48
    • Помечено в качестве ответа liquvidator 22 февраля 2017 г. 13:30
    21 февраля 2017 г. 13:48

Все ответы

  • с чекбоксами все просто

    просто впилите например после блока создания например первого чекбокса чо нить типа

    $checkbox1.Add_CheckStateChanged({
    $checkbox2.Checked = $checkbox1.Checked 
    $checkbox3.Checked = $checkbox1.Checked 
    $checkbox4.Checked = $checkbox1.Checked 
    $checkbox5.Checked = $checkbox1.Checked 
    $checkbox6.Checked = $checkbox1.Checked 
    $checkbox7.Checked = $checkbox1.Checked 
    })
    

    ну а с остальными по аналогии.

    во вторых,

    Выберите - этот глагол в данном случае пишется через И (повелительное наклонение)

    в третьих,

    вам права на существующую папку как рисовать? (особенно если они нестандартные)

    20 февраля 2017 г. 18:02
  • с чекбоксами все просто

    просто впилите например после блока создания например первого чекбокса чо нить типа

    $checkbox1.Add_CheckStateChanged({
    $checkbox2.Checked = $checkbox1.Checked 
    $checkbox3.Checked = $checkbox1.Checked 
    $checkbox4.Checked = $checkbox1.Checked 
    $checkbox5.Checked = $checkbox1.Checked 
    $checkbox6.Checked = $checkbox1.Checked 
    $checkbox7.Checked = $checkbox1.Checked 
    })

    ну а с остальными по аналогии.

    во вторых,

    Выберите - этот глагол в данном случае пишется через И (повелительное наклонение)

    в третьих,

    вам права на существующую папку как рисовать? (особенно если они нестандартные

    1. спасибо, получилось. 

    2. учту, мой косяк.

    3. желательно, что то вида:
    группа или имя пользователя - директор - полный доступ

    группа или имя пользователя - глав бух - изменение, чтение.запись,просмотр

    группа или имя пользователя  - пользователь1 - чтение

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


    • Изменено liquvidator 21 февраля 2017 г. 11:45
    21 февраля 2017 г. 11:27
  • ну в простом варианте как то так:

    $Label5 = New-Object System.Windows.Forms.Label
    $Label5.Text = "Текущие разрешения:"
    $Label5.Location  = New-Object System.Drawing.Point(10,350)
    $Label5.AutoSize = 1
    $main_form.Controls.Add($Label5) | Out-Null
    
    
    $TextBox2 = New-Object System.Windows.Forms.RichTextBox
    $TextBox2.Location  = New-Object System.Drawing.Point(10,370)
    $TextBox2.Width          = 280
    $TextBox2.Height         = 140
    $TextBox2.AutoSize = 0
    $TextBox2.text = "Папка не выбрана"
    $main_form.Controls.Add($TextBox2) | Out-Null
    
    
    $button = New-Object System.Windows.Forms.Button
    $button.Text = 'Обзор'
    $button.Location = New-Object System.Drawing.Point(100,80)
    $main_form.Controls.Add($button) | Out-Null
    $button.add_click({browse}) 
    
    function browse 
    { 
    Add-Type -AssemblyName System.Windows.Forms
        $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{
            SelectedPath = 'C:\Temp'
        }
     
        [void]$FolderBrowser.ShowDialog()
        $TextBox.Text = $FolderBrowser.SelectedPath
        
        if($TextBox.Text)
        {
            $script:button.Enabled = $true
            $script:Label5.Text = "Текущие разрешения:$(($TextBox).Text)"
    #        $script:TextBox2.Text =Get-Acl -Path $TextBox.Text | % { $_.access }|select -Property IdentityReference,AccessControlType,FileSystemRights|fl|out-string
            $script:TextBox2.Text =(get-acl -Path $TextBox.Text).AccessToString
        }
    }
    

    впилите этот кусок там де кнопку описываете(кнопка не изменилась,выделил жирным).

    добавил пару элементов интерфейса и подредактировал функцию броуз

    есть косяки с выводом нестандартных дескрипторов и прочего, надо допиливать, но вот очень лень

    а вот директор, главбух и прочие проперти обьектов из ад - вот это уже не мне лень, а вам домашнее задание :-) я это делать точно не буду


    • Изменено Svolotch 21 февраля 2017 г. 13:48
    • Помечено в качестве ответа liquvidator 22 февраля 2017 г. 13:30
    21 февраля 2017 г. 13:48
  • ну и еще неплохо было бы впилить проверку на корретность пути и сообщать если на папку нет доступа и права прочитать не получилось
    21 февраля 2017 г. 13:53
  • ну и еще неплохо было бы впилить проверку на корретность пути и сообщать если на папку нет доступа и права прочитать не получилось

    хотя можно и ограничится добавлением одной строчки

            $script:Label5.Text = "Текущие разрешения:$(($TextBox).Text)"
            $script:TextBox2.Text="Ахтунг! шеф все пропало!"
    #        $script:TextBox2.Text =Get-Acl -Path $TextBox.Text | % { $_.access }|select -Property IdentityReference,AccessControlType,FileSystemRights|fl|out-string
            $script:TextBox2.Text =(get-acl -Path $TextBox.Text).AccessToString
    

    как говорил персонаж одного из мультиков "И так сойдет!"

    21 февраля 2017 г. 13:58
  • огромное спасибо. украшалки  уж тямы хватит доделать))) 

    правда не совсем понял про проверку. скрипт нормально работает от имени админа, а у него  прав хватает добавить разрешения и в закрытую папку. 

    а если запускать без прав админа. скрипт ругаться начинает. 

    [#] F:\it\arhiv\123
    [+] Path: F:\it\arhiv\123 User: __vmware__ были предоставлены права ReadAndExecute
    [#] F:\it
    Add-NTFSAccess : (1307) Этот идентификатор безопасности не может быть назначен владельцем этого объекта: [\\?\F:\it]
    E:\ИТ\exe\ntfs разрешения\смена разрешений №1.1.ps1:204 знак:32
    +                     $success = Add-NTFSAccess -Path $Path -Account $Account -Acc ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (F:\it:String) [Add-NTFSAccess], IOException
        + FullyQualifiedErrorId : AddAceError,NTFSSecurity.AddAccess
     
    [+] Path: F:\it User: __vmware__ были предоставлены права ListDirectory
    [#] F:\it\arhiv
    [=] Path: F:\it\arhiv User: __vmware__ уже имеет права доступа ListDirectory к объекту

    21 февраля 2017 г. 16:24
  • имеется в виду если у вас допустим нет прав админа(или уак, или вы не оунер или еще что нить) и вы выбрали какую нить папку на которую у вас есть доступ - вам скрипт покажет разрешения, однако если потом выбрать папку на которую у вас нет прав выполнить командлет гет-акл то значение ричтекстбокса останется прежним - ошибка появится лишь в окошке сессии повершелла.

    собственно затем я и добавил заполнение ричтекбокса фразой про "все пропало". - в нормальном случае она практически мгновенно затрется значениями текущими значениями аклов, а в случае проблем с чтением прав - будет ругаться на экране :-)

    кстати, у меня скриптик довольно долго стартует, вроде тупит на моменте пока выгрузит группы из АД, хотя хз надо точнее посмотреть.

    22 февраля 2017 г. 1:07
  • странно, у меня довольно шустро бегает. 
    22 февраля 2017 г. 5:49
  • групп не много наверн, иначе бы вы комбобокс на выбор групп не ставили, а сделали человечий поиск
    22 февраля 2017 г. 7:25
  • а я не знаю как человеческий сделать.... нашел где то части кодов. как то соединил + помогли малость с синтаксисом = получил в итоге выбор групп)))) а групп..где то в порядке 50 шт + - 
    22 февраля 2017 г. 11:46
  • 50 это очень немного...

    ну что, проверяйте итоговый скрипт и если все ок, отмечайте ответ.. новые хотелки уже в новой теме... а вообще постарайтесь сами поковырять, таки это ваша тащемто задача :-)

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

    22 февраля 2017 г. 12:59
  • ок. спасибо еще раз)
    22 февраля 2017 г. 13:30