• Как преобразовать объект Get-Acl?

    @NortheR73
    системный инженер
    Get-Acl возвращает вам, по сути, набор строк. Перебираете этот набор с помощью Foreach и добавляете каждую строку как node нужного уровня в TreeView:
    PS C:\windows\system32> (Get-Acl c:\!New).Access.IdentityReference.Value
    BUILTIN\Администраторы
    NT AUTHORITY\СИСТЕМА
    BUILTIN\Пользователи
    NT AUTHORITY\Прошедшие проверку
    NT AUTHORITY\Прошедшие проверку
    Ответ написан
    1 комментарий
  • Почему переменная перестаёт выводиться в терминал?

    @MaxKozlov Куратор тега PowerShell
    То же самое, что и в прошлый раз.
    У вас в выводе встречаются несколько разных объектов
    Сначала $lol.IdentityReference
    потом $myArray
    Состав полей у объектов разный. Перед выводом, собственно на экран (хост), Powershell буферизует вывод и пытается его подстроить под вас.
    Для этого он берёт состав полей второго объекта (там список с полями)
    PS полагает, что данный объект и должен быть примером, поэтому пытается выводить на экран для первого объекта те же поля, что и для второго. А там их, конечно, нет. В результате не выводится ничего.
    Промежуточный вывод на хост через Format- разбивает буфер и вы видите оба объекта со своими полями

    Ну и, как я писал в прошлый раз, необходимо выводить всё единообразно. Работаете только с экраном ?
    Используйте Out-Host, Write-Host, Format-xxx
    Хотите выводить в потоки, переменные и тп - используете обычные выводы
    Фактически ваш вызов $lol.IdentityReference это для Powershell $lol.IdentityReference | Out-Default, потому что далее этот вывод никуда не попадает, ни в переменную, ни в поток

    А вам явно бы хотелось Out-Host
    Ответ написан
    3 комментария
  • Как правильно передать параметр для экспорта в CSV?

    @BeatHazard
    По первому вопросу не совсем понятно, чего вы хотите добиться? В приведенном вами скрипте, в блоке foreach команда
    Get-ADGroupMember -Identity $item.Groups | Select-Object SamAccountName, Name | Export-CSV "C:\dst\cll.CSV" -NoTypeInformation -Encoding UTF8
    перезатирает предыдущие данные при каждом прохождении цикла, если вам нужно сохранять данные - добавьте в конце ключ -append, если это не то, что нужно напишите, какой результат вы ожидаете увидеть в CSV файле, в остальном команда корректно выгружает список пользователей группы в CSV файл.
    По второму вопросу - чтобы получать дополнительные атрибуты объекта из AD перечислите их в ключе -Properties для команды Get-ADUser, например
    Get-ADUser -identity KolpakovMD1  -Properties description
    Ответ написан
    1 комментарий
  • Почему переменная перестала выводить ответ?

    @MaxKozlov Куратор тега PowerShell
    У вас так всё намешано...
    Где-то forma-table, где-то просто "вывод", где-то чтение с хоста.
    Get-Srv($param), который в случае двух параметров превратится в массив...
    Не выводится, скорее всего, потому, что PS очень хочет вам угодить, пытаясь подстроить вывод. Но не может :)

    Я бы предложил хорошенько поработать над структурой, убрать рекурсию и правильно разделить ответственность между функциями
    типа
    function Show-SrvFolderList($kat_addr) { # Получаем на вход уже готовый путь к серверу
        Get-Children -Path $kat_addr | Format-Table Name
    }
    function Show-FolderAccess($inp_res) { #  увидеть список групп, с исключениями
        $lol2 = Get-Acl $inp_res
        $lol2 = $lol2.Access | Where-Object {
            $_.IdentityReference -notlike "*blabla1*" -and
            $_.IdentityReference -notlike "*blabla2*" -and 
            $_.IdentityReference -notlike "*blabla3*" -and 
            $_.IdentityReference -notlike "*blabla4*" -and 
            $_.IdentityReference -notlike "*blabla5*"
        }
        $lol2 | Format-Table
    }
    
    $srv_name = Read-Host "Введите сервер"
    $kat_addr = '\\' + $srv_name + '\Folder' # На каждом сервере есть определенная папка \Folder, которая подставляется в Get-Children. 
    do {
        Show-SrvFolderList
        # После того, как увидели все каталоги, можем выбрать один из них
        $inp_res = Read-Host "Введите ресурс или 1"
        if ($inp_res -eq '1') { break }
        Show-FolderAccess ($kat_addr + '\'  + $inp_res)
    } while ($true)


    Функции переименованы, чтобы было понятно что они делают
    Причём они Show, а не Get, потому что на самом деле они ничего не возвращают, а только показывают
    Ответ написан
    1 комментарий
  • Как ограничить вывод?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Powershell работает с объектами и фильтровать надо объекты. По факту вы хотите получить элементы свойства Access и отфильтровать их - вот и пишите этот фильтр явно, а потом преобразовывайте выдачу в нужный вам формат . Для одного субъекта это делается примерно так(выдачаформатируется так же, как и у вас):
    (Get-Acl \\addr\addr).Access | Where {$_.IdentityReference -ne 'Домен\Группа'} | ForEach ([String]$_.IdentityReference, String]$_.AccessControlType, [String]$_.FileSystemRights) -join ' '}

    Чтобы отфильтровать несколько групп либо добавьте в команду Where дополнительные аналогичные условия, объединив их по && , либо добавьте команды Where для каждой такой группы
    Теоретически, можно отфильтрофать и результат команды Format-List, которой вы пользуетесь, но это сложнее: она возвращает не строки, а весьма нетривиальные объекты, которые потом формируют выдачу
    Ответ написан
    2 комментария
  • Как ограничить вывод?

    @BeatHazard
    Приветствую.
    Можете вывести нужные вам данные таким образом, ограничив вывод нужных групп в -notlike укажите, какую группу нужно скрыть.
    $lol = get-acl \\10.24.66.14\share 
    $lol = $lol.Access | Where-Object {$_.IdentityReference -notlike "S-1-22-2-1958201108"}
    $lol

    Можно дополнительно сделать переменную с массивом списком групп которые не нужны и воспользоваться -notcontains если групп много.
    Ответ написан
    1 комментарий