不要切断 genericList 中的文件夹名称
Don't cut off foldername in genericList
我有一些代码可以将特定用户对包含所有子文件夹的文件夹的权限写入通用列表。稍后在代码中,我将打印此列表。但是,如果目录太大(超过 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
提前致谢
您正在使用 Out-File
输出到 CSV 文件。那是不正确的;你需要 Export-Csv
。如果您想要合法的 CSV 文档,您也需要在最后一行中删除日期输出。 (您可以 运行 Get-Item MyFile.csv | Format-Table Name, CreationTime
稍后获取该信息;文件系统免费为您提供一些日期信息。)
这本身就是一个完整的解决方案。您的输出不会被 t运行 分类。但如果可以的话,我想解释一下区别。
Powershell 有一些默认操作会与您的代码片段挂钩。 Out-File
获取字符串内容,但您传递的是 objects,因此 PS 将使用其默认格式化程序。当管道中的第一个项目具有 4 个或更少的可见属性时,将为 Format-Table
,否则为 Format-List
.
Format-Table
有一个 -Wrap
开关,它会导致溢出的内容换行而不是 t运行cate。有时,使用 -AutoSize
也足以调整列宽,但是当问题是 t运行cation 时,这只会让你走到这一步。 Format-List
总是换行。
如果您只想要一个 属性 并且您可以承受丢失列 header 的后果,请尝试通过管道传输到 Select-Object -ExpandProperty Item
.
正如我希望现在清楚的那样,这些格式化命令正在将结构化数据扁平化为文本,尽管是格式化文本。这总是会让你失去保真度,也使得对数据进行任何进一步的操作变得更加困难。如果您改用 Export-Csv
,您稍后可以 运行 Import-Csv
将数据作为结构化输出取回。另外,您可以在Excel等
中打开
一句警告:Export-Csv
不能很好地处理引号。如果这成为一个问题,请尝试 Export-CliXml
,它使用 XML 的 PS-specific 方言,并提供您可以获得的最高保真度(除非您愿意投入大量工作!) 自然地,该命令的导入对应项是 Import-CliXml
.
Export-Csv
的最后一个提示:您通常不需要 header 信息,因此请将其与 -NoTypeInformation
开关一起使用。
我有一些代码可以将特定用户对包含所有子文件夹的文件夹的权限写入通用列表。稍后在代码中,我将打印此列表。但是,如果目录太大(超过 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
提前致谢
您正在使用 Out-File
输出到 CSV 文件。那是不正确的;你需要 Export-Csv
。如果您想要合法的 CSV 文档,您也需要在最后一行中删除日期输出。 (您可以 运行 Get-Item MyFile.csv | Format-Table Name, CreationTime
稍后获取该信息;文件系统免费为您提供一些日期信息。)
这本身就是一个完整的解决方案。您的输出不会被 t运行 分类。但如果可以的话,我想解释一下区别。
Powershell 有一些默认操作会与您的代码片段挂钩。 Out-File
获取字符串内容,但您传递的是 objects,因此 PS 将使用其默认格式化程序。当管道中的第一个项目具有 4 个或更少的可见属性时,将为 Format-Table
,否则为 Format-List
.
Format-Table
有一个 -Wrap
开关,它会导致溢出的内容换行而不是 t运行cate。有时,使用 -AutoSize
也足以调整列宽,但是当问题是 t运行cation 时,这只会让你走到这一步。 Format-List
总是换行。
如果您只想要一个 属性 并且您可以承受丢失列 header 的后果,请尝试通过管道传输到 Select-Object -ExpandProperty Item
.
正如我希望现在清楚的那样,这些格式化命令正在将结构化数据扁平化为文本,尽管是格式化文本。这总是会让你失去保真度,也使得对数据进行任何进一步的操作变得更加困难。如果您改用 Export-Csv
,您稍后可以 运行 Import-Csv
将数据作为结构化输出取回。另外,您可以在Excel等
一句警告:Export-Csv
不能很好地处理引号。如果这成为一个问题,请尝试 Export-CliXml
,它使用 XML 的 PS-specific 方言,并提供您可以获得的最高保真度(除非您愿意投入大量工作!) 自然地,该命令的导入对应项是 Import-CliXml
.
Export-Csv
的最后一个提示:您通常不需要 header 信息,因此请将其与 -NoTypeInformation
开关一起使用。