none
Проверка прав по пользователю.

    Вопрос

  • Добрый день, есть часть скрипта:

    Add-Type -assembly System.Windows.Forms
    Import-Module NTFSSecurity
    
    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
    
    $TextBox1 = New-Object System.Windows.Forms.TextBox
    $TextBox1.Location  = New-Object System.Drawing.Point(10,170)
    $TextBox1.Width          = 280
    $TextBox1.Height          = 80
    $TextBox1.AutoSize = 0
    $TextBox1.text = $null
    $TextBox1.add_TextChanged({
        if(!$TextBox1.Text) 
        {
            $script:button.Enabled = $false
        }
    })
    $main_form.Controls.Add($TextBox1) | Out-Null
     
    $button = New-Object System.Windows.Forms.Button
    $button.Text = 'Проверить'
    $button.Location = New-Object System.Drawing.Point(100,310)
    $button.Enabled = $false
    $button.add_click({
    #get-childitem  -recurse | get-acl | format-table -wrap -GroupBy Access | out-file F:\it\file.csv -width 500
    $a=(Get-Acl).Path
    (get-acl).Access | Format-Table AccessControlType, FileSystemRights, '
    IdentityReference, @{Label="Path"; Expression={$a -replace (".*::", "")}}'
    })
       
    
    $main_form.Controls.Add($button) | Out-Null
    
     
     
    $main_form.ShowDialog() | Out-Null

    Не могу сообразить, как допилить саму проверку. идеология скрипта :
    1. выбрать пользователя (группа в ад) каждому пользователю присвоена группа - должность
    2. выбрать диск или папку
    3. получить вывод к каким папкам и какие права имеет выбранный пользователь . (если выбран диск - то проверка по всем папкам, если выбрана папка - то проверка от этой папки до всех вложенных)

    Помогите плиз! ps знаю плоховато. 

    • Перемещено Vector BCOModerator 15 марта 2017 г. 11:32 Более подходящая ветка
    15 марта 2017 г. 11:19

Все ответы

  • опять ты :-) и до сих пор выберЕте пользователя...

    а обязательно повершелл?

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

    плюс только по конкретной группе надо смотреть или по пользователю и всем его группам? проверять ли нестед группы?

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

    ну и обычный коммент про то что тут вобщем то никто не против помочь, но таки писать скрипт с нуля и нахаляву тащемто никто не обязан.. что конкретно не получается?

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

    15 марта 2017 г. 12:15
  • блин, старую форму взял где не поправлял. 

    да. скрипт надо на повершелле. 

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

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

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

    я понимаю, что никто не обязан именно писать скрипт и разжевывать нубу весь повершелл. но лучше сервиса чем этот я не нашел в помощи)))

    15 марта 2017 г. 13:50
  • для начала откажитесь от форм, они от лукавого. это потом уже свистелки и перделки(коими формы и являются) прикручивать можно.

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

    15 марта 2017 г. 14:32
  • 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
    
    
    
    $Label5 = New-Object System.Windows.Forms.Label
    $Label5.Text = "Текущие разрешения:"
    $Label5.Location  = New-Object System.Drawing.Point(10,190)
    $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,210)
    $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=" У Вас нет прав чтобы редактировать права к данной папке!"
    #        $script:TextBox2.Text =Get-Acl -Path $TextBox.Text | % { $_.access }|select -Property IdentityReference,AccessControlType,FileSystemRights|fl|out-string
            
        }
    } 
     
    $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,150)
    $button.Enabled = $false
    $button.add_click({
    
    $script:TextBox2.Text =(get-acl -Path $TextBox.Text).AccessToString
    
    })
    
    $main_form.Controls.Add($button) | Out-Null
    
     
     
    $main_form.ShowDialog() | Out-Null
    форму вроде выправил ...
    не могу я от нее отказаться.. она помогает ориентироваться где куда кусок кода идет.. вижу начало формы такой то там описано то то значит копать надо где то тут :)

    добился опроса по кнопке проверить. а как сказать ему опрашивать в выбранной папке и под папках на основе выбранного пользователя? в -патч тут же переменная, которая была выбрана и опрашивается тока 1 папка
    • Изменено liquvidator 15 марта 2017 г. 17:01
    15 марта 2017 г. 16:53
  • блин...

    у вас по факту поменялась 1 строчка

    тестить можно было всего 2мя строчками(да и то если переменную задавать, а не явно указывать)

    $text="c:\temp"

    write-output (get-acl -Path $Text).AccessToString

    по идее всю вот эту ботву надо пихать в функции(подпрограммы по сути).. которые пишутся и отлаживаются отдельно. и могут лежать в коде где угодно (я сую в начало)

    а вы же занимаетесь чем угодно, только не скриптингом.. много ума чтоль нужно формы нарисовать, да блин любые вижуал чонитьтам сто летней давности позволяют мышкой нарисовать любую форму не имея даже зайчатков разума. А вы лепите непонятные отмазки про кусок кода... да у вас тут реального кода на всю ту бабуйню, что выше представлена, строк 5-10 и то из которого вы большую часть не понимаете.

    короче пишите в поше следующее:

    man ls -full

    оно же get-help get-childitem -full

    курите чо там пишут,

    далее идете читать про конвейеры в повершелл, затем разобравшись с непонятными штуками типа % и $_  пишете ОДНУ блин строчку(можно несколько) которая выдаст вам все разрешения на папку например c:\temp и все ее подпапки...

    дальше, если справитесь, будем осваивать селект-обджект и вере-обджект.

    --------

    Дай человеку рыбу и он будет сыт один день, научи человека ловить рыбу - так он, паразит, весь лоб себе расшибет. :-)

    15 марта 2017 г. 19:05
  • По идеи к С:\темп  - 

    get-childitem -ad C:\Temp -recurse | get-acl | format-table -wrap -GroupBy Access 

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

    16 марта 2017 г. 11:09
  • значит еще не понял про % (man %   - но лучше по русски погугли )

    там $_ будет нужно

    там еще и селект есть... но начни с малого..

    --------

    (хотя малое это селект и к фор`ичу надо бы потом)

    это не я, я не буду говорить без авокадо! а лучше сразу гуакамоле, начос, соленых огурцов и её родимой..

    +UPD

    блин а ты ж справился.

    тогда выдерни из диска С, например, все папки в названии которых есть буква "m"

    • Изменено Svolotch 17 марта 2017 г. 1:03
    17 марта 2017 г. 0:54
  • $source="C:\"
    Get-ChildItem -ad $source -recurse |  where {$_.name -like "temp"} |Get-Acl | format-table -wrap -GroupBy Access 
    воо. вроде так
    17 марта 2017 г. 13:06
  • короче лень мне расписывать, вот что вы примерно хотите получить:

    $path="c:\temp"
    $group="BUILTIN\Administrators"
    ls $path -ad -r|get-acl|where{$_.AccessToString  -like "*$group Allow*"}|%{$_.path}

    Более правильный вариант был бы заюзать чо нить типа https://gallery.technet.microsoft.com/scriptcenter/PowerShellAccessControl-d3be7b83

    например юзать оттуда Get-EffectiveAccess

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

    20 марта 2017 г. 14:29