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