不要在genericList中切断文件夹名

时间:2019-05-22 13:01:30

标签: active-directory powershell-v2.0 acl generic-list

我有一些代码,可将特定用户的权限与所有子文件夹一起写入通用列表。在代码的后面,我将打印此列表。但是,如果目录太大(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 :(得分:0)

您正在使用Out-File输出到CSV文件。那是不对的。您需要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开关一起使用。