Не обрезайте имя пользователя в genericList - PullRequest
0 голосов
/ 22 мая 2019

У меня есть некоторый код, который записывает разрешения определенного пользователя для папки со всеми подпапками в общий список. Позже в коде я распечатаю этот список. Однако, если каталог слишком большой (4+ папки, имя обрезается. Мне нужно записать все имя каталога, а не только сокращенную версию. Могу ли я использовать какой-либо параметр?

Import-Module ActiveDirectory

$User = "Testumgebung\cbruehwiler"
$UserOhneDomain = $User -creplace '^[^\\]*\\', ''
$Path = "\\ESX-SHARE\File Transfer"

$List = New-Object System.Collections.Generic.List[System.Object]
$Groups = Get-ADPrincipalGroupMembership $UserOhneDomain 
$From = $User

$GroupArrayList = New-Object System.Collections.ArrayList
foreach ($Group in $Groups)
{
$GroupArrayList.Add($Group.Name) | Out-Null 
} 

$OutputFields = @(
    @{name="Item" ;       expression={$_.Path.split(':',3)[-1]}}
    @{name="Rights" ;     expression={$Right.FileSystemRights}}
    @{name="AccessType" ; expression={$Right.AccessControlType}}
    @{name="From" ;       expression={$From}}
) 

$FileSystemObjects = Get-ChildItem $Path -Recurse | ?{ $_.PSIsContainer } | ForEach-Object {Get-Acl $_.FullName}

foreach ($Item in $FileSystemObjects) {
    foreach ($Right in $Item.Access) {
        if ($Right.IdentityReference -eq $User -And ($Right.IsInherited -eq $false))
        {
            $From = $User
            $List.Add(($Item | Select-Object $OutputFields))
        }
        foreach ($GroupArrayItem in $GroupArrayList){
            if ($Right.IdentityReference -eq ("TESTUMGEBUNG\" + $GroupArrayItem) -And ($Right.IsInherited -eq $false)) 
            {
                $From = $GroupArrayItem
                $List.Add(($Item | Select-Object $OutputFields))
            }
        }
    }   
}

$List | Out-File C:\Users\cbruehwiler\Desktop\PermissionCheck.csv
$DateTime = Get-Date
$DateTime >> C:\Users\cbruehwiler\Desktop\PermissionCheck.csv

Вот так выглядит результат.

Item                                                                   Rights                                    AccessType From             

----                                                                   ------                                    ---------- ----                                          
\\ESX-SHARE\File Transfer\TestFolder\Sub_Te...                         FullControl                                    Allow Testumgebung\cbruehwiler                      

Однако я бы хотел, чтобы это было так

\\ESX-SHARE\File Transfer\TestFolder\Sub_TestFolder\Sub_Sub_TestFolder

Заранее спасибо

1 Ответ

0 голосов
/ 13 июня 2019

Вы выводите в файл CSV с Out-File.Это неверно;вам нужно Export-Csv.Вы также захотите сбросить вывод даты в последней строке, если вам нужен легальный CSV-документ.(Вы можете запустить Get-Item MyFile.csv | Format-Table Name, CreationTime, чтобы получить эту информацию позже; файловая система предоставляет вам некоторую информацию о дате бесплатно.)

Само по себе это полное решение.Ваш вывод не будет усечен.Но я хотел бы объяснить это различие, если можно.

У Powershell есть некоторые стандартные действия, которые попадают в ваш фрагмент кода.Out-File принимает строковое содержимое, но вы передаете объекты, поэтому PS будет использовать свой форматтер по умолчанию.Когда первый элемент в конвейере имеет 4 или менее видимых свойств, это будет Format-Table, в противном случае Format-List.

Format-Table имеет переключатель -Wrap, который вызывает обтекание переполненного содержимого вместо усечения,Иногда использования -AutoSize также достаточно для настройки ширины столбцов, но это поможет вам справиться только с проблемой усечения.Format-List будет всегда переноситься.

Если вам нужно только одно свойство и вы можете позволить себе потерять заголовок столбца, попробуйте набрать Select-Object -ExpandProperty Item.

Как я надеюсь, теперь все ясно.эти команды форматирования сглаживают структурированные данные в текст, хотя и форматированный текст.Это всегда даст вам потерю верности, а также затруднит дальнейшие манипуляции с данными.Если вместо этого вы используете Export-Csv, вы можете позже запустить Import-Csv, чтобы вернуть данные в виде структурированного вывода.Кроме того, вы можете открыть в Excel и т. Д.

Предупреждение: Export-Csv плохо обрабатывает кавычки.Если это становится проблемой, попробуйте Export-CliXml, который использует специфический для PS диалект XML и обеспечивает наивысшую точность, которую вы можете получить (если вы не готовы приложить много работы!) Естественно, импортный аналогэто команда Import-CliXml.

Последний совет для Export-Csv: часто вам не нужна информация заголовка, поэтому используйте ее с переключателем -NoTypeInformation.

...