Arrays Powershell NTFS ACL导出到Excel错误
我写的剧本有问题。基本上,它从FolderList.txt文件读取UNC路径列表 从文件位置提取ACL列表,并将所有信息导出到Excel。我的第一列很好,但第二列给了我一条错误消息。我认为原因是我试图将多行数据或可能的数组类型数据放入第二列。请帮我挥动这面白旗Arrays Powershell NTFS ACL导出到Excel错误,arrays,powershell,vbscript,Arrays,Powershell,Vbscript,我写的剧本有问题。基本上,它从FolderList.txt文件读取UNC路径列表 从文件位置提取ACL列表,并将所有信息导出到Excel。我的第一列很好,但第二列给了我一条错误消息。我认为原因是我试图将多行数据或可能的数组类型数据放入第二列。请帮我挥动这面白旗 $ErrorActionPreference = "Stop" $Excel = new-Object -comobject Excel.Application $Excel.visible = $True $Excel = $Exce
$ErrorActionPreference = "Stop"
$Excel = new-Object -comobject Excel.Application
$Excel.visible = $True
$Excel = $Excel.Workbooks.Add()
$Sheet = $Excel.Worksheets.Item(1)
$Sheet.Cells.Item(1,1) = "Folder Name"
$Sheet.Cells.Item(1,2) = "Folder Permissions"
$intRow = 2
$WorkBook = $Sheet.UsedRange
$WorkBook.Font.Bold = $True
$data = Import-Csv -Path C:\xPowerShellScripts\FolderList.txt -Header "Path" -Delimiter ","
foreach ($head in $data)
{
$Permission = (Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference
$Sheet.Cells.Item($intRow, 1) = $head.Path
$Sheet.Cells.Item($intRow, 2) = $Permission
$intRow = $intRow + 1
}
$WorkBook.EntireColumn.AutoFit()
$intRow = $intRow + 1
$Sheet.Cells.Item($intRow,1).Font.Bold = $True
$Sheet.Cells.Item($intRow,1) = "Folder Permissons Report"
发现了问题
错误消息:
Exception from HRESULT: 0x800A03EC
At line:18 char:1
+ $Sheet.Cells.Item($intRow, 2) = $Permission
冒犯的界线是:
$Sheet.Cells.Item($intRow, 2) = $Permission
原因是您试图编写一个值$Permission
,它实际上是一个对象数组,所有这些对象都包含您想要在其值
属性中包含的信息。下面是$Permission的实际外观:
PS C:\temp> $Permission
Value
-----
BUILTIN\Administrators
BUILTIN\Administrators
NT AUTHORITY\SYSTEM
NT AUTHORITY\SYSTEM
NT AUTHORITY\Authenticated Users
NT AUTHORITY\Authenticated Users
BUILTIN\Users
BUILTIN\Users
解决方法是使用-join“`n”
创建一个包含多个换行符的大单元格,在一个比普通单元格高的单元格中包含所有权限
$Sheet.Cells.Item($intRow, 2) = $Permission.Value -join "`n"
结果是:
如果您还希望为访问被拒绝的用户提供cloumn,请改用它 找到了问题
错误消息:
Exception from HRESULT: 0x800A03EC
At line:18 char:1
+ $Sheet.Cells.Item($intRow, 2) = $Permission
冒犯的界线是:
$Sheet.Cells.Item($intRow, 2) = $Permission
原因是您试图编写一个值$Permission
,它实际上是一个对象数组,所有这些对象都包含您想要在其值
属性中包含的信息。下面是$Permission的实际外观:
PS C:\temp> $Permission
Value
-----
BUILTIN\Administrators
BUILTIN\Administrators
NT AUTHORITY\SYSTEM
NT AUTHORITY\SYSTEM
NT AUTHORITY\Authenticated Users
NT AUTHORITY\Authenticated Users
BUILTIN\Users
BUILTIN\Users
解决方法是使用-join“`n”
创建一个包含多个换行符的大单元格,在一个比普通单元格高的单元格中包含所有权限
$Sheet.Cells.Item($intRow, 2) = $Permission.Value -join "`n"
结果是:
如果您还希望为访问被拒绝的用户提供cloumn,请改用它 别再这么辛苦了。不要逐个单元格更新,收集所有数据,将其转换为以制表符分隔的CSV,然后将整个内容粘贴到Excel中 因此,对于
$Permission
中的每个项目,您将使用所需的值创建一个[PSCustomObject]
,然后我们将在一个数组中收集所有这些值
[array]$AllPerms = foreach ($head in $data)
{
(Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{
[PSCustomObject]@{
"Folder Name"=$Head.Path
"Folder Permissions"=$_.value
}
}
}
这将生成一个对象数组,每个对象都有两个属性,这两个属性是您在列中查找的。现在我们有了数组,我们将其转换为以制表符分隔的CSV,并将其复制到剪贴板
$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip
好的,现在我们将其粘贴到工作表的第一个单元格中:
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null
然后我会处理好格式。所以最后整个事情看起来是这样的:
$ErrorActionPreference = "Stop"
$Excel = new-Object -comobject Excel.Application
$Excel.visible = $True
$Workbook = $Excel.Workbooks.Add()
$Sheet = $Workbook.Worksheets.Item(1)
$data = Import-Csv -Path C:\xPowerShellScripts\FolderList.txt -Header "Path" -Delimiter ","
[array]$AllPerms = foreach ($head in $data)
{
(Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{
[PSCustomObject]@{
"Folder Name"=$Head.Path
"Folder Permissions"=$_.value
}
}
}
$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null
$Footer = $Sheet.Cells.Item($(($Sheet.UsedRange.Rows)|Select -Last 1 -Expand Row)+1,1)
$Sheet.Rows.Item(1).Font.Bold = $True
$Sheet.UsedRange.EntireColumn.AutoFit() | Out-Null
$Footer.Font.Bold = $True
$Footer.Value2 = "Folder Permissons Report"
别再这么辛苦了。不要逐个单元格更新,收集所有数据,将其转换为以制表符分隔的CSV,然后将整个内容粘贴到Excel中 因此,对于
$Permission
中的每个项目,您将使用所需的值创建一个[PSCustomObject]
,然后我们将在一个数组中收集所有这些值
[array]$AllPerms = foreach ($head in $data)
{
(Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{
[PSCustomObject]@{
"Folder Name"=$Head.Path
"Folder Permissions"=$_.value
}
}
}
这将生成一个对象数组,每个对象都有两个属性,这两个属性是您在列中查找的。现在我们有了数组,我们将其转换为以制表符分隔的CSV,并将其复制到剪贴板
$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip
好的,现在我们将其粘贴到工作表的第一个单元格中:
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null
然后我会处理好格式。所以最后整个事情看起来是这样的:
$ErrorActionPreference = "Stop"
$Excel = new-Object -comobject Excel.Application
$Excel.visible = $True
$Workbook = $Excel.Workbooks.Add()
$Sheet = $Workbook.Worksheets.Item(1)
$data = Import-Csv -Path C:\xPowerShellScripts\FolderList.txt -Header "Path" -Delimiter ","
[array]$AllPerms = foreach ($head in $data)
{
(Get-Acl $head.Path).Access | Select-Object -ExpandProperty IdentityReference | ForEach{
[PSCustomObject]@{
"Folder Name"=$Head.Path
"Folder Permissions"=$_.value
}
}
}
$AllPerms | ConvertTo-Csv -Delimiter "`t" -NoTypeInfo | Clip
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null
$Footer = $Sheet.Cells.Item($(($Sheet.UsedRange.Rows)|Select -Last 1 -Expand Row)+1,1)
$Sheet.Rows.Item(1).Font.Bold = $True
$Sheet.UsedRange.EntireColumn.AutoFit() | Out-Null
$Footer.Font.Bold = $True
$Footer.Value2 = "Folder Permissons Report"
你这样做很难。给我几分钟时间写下来,我会给你一个答案。@WhiteHat他已经解决了这个问题,虽然他的脚本还有其他固有的问题,但对于他的具体问题,这不是问题所在。请给我们错误消息:)Hi JRN,我想出了如何让它只用六个字符的变化:希望你喜欢它,不管你采取什么答案,你应该考虑你列出了允许和拒绝权限无差别。您应该认真考虑管道<代码>(获取ACL $Head .PATH)<代码> >代码> {{$}.Access CopyType -EQ’允许“} < /Cord>”,这样您就不会得到拒绝列表。给我几分钟时间写下来,我会给你一个答案。@WhiteHat他已经解决了这个问题,虽然他的脚本还有其他固有的问题,但对于他的具体问题,这不是问题所在。请给我们错误消息:)Hi JRN,我想出了如何让它只用六个字符的变化:希望你喜欢它,不管你采取什么答案,你应该考虑你列出了允许和拒绝权限无差别。您应该认真考虑管道<代码>(获取ACL $Head .PATH)<代码> >代码> {$Access CopyType -EQ’允许'} < /C> >,这样您就不会得到拒绝ListIs.FXDeppi:这正是我所知道的问题,我不知道如何修复它。非常感谢您快速简洁的回答。我的头撞在墙上,因为我不知道该怎么说,我不喜欢给出太多的信息,因为我有可能对解决方案产生偏见。再次感谢您。在@TheMadTechnician告诉我这个想法之后,我添加了一些逻辑,为拒绝访问的用户添加了另一个列。那么哪一个是更新的代码呢?FoxDeploy:这正是我所知道的问题,我不知道如何解决它。非常感谢您快速简洁的回答。我的头撞在墙上,因为我不知道该怎么说,我不喜欢给出太多的信息,因为我有可能对解决方案产生偏见。再次感谢您。在@TheMadTechnician告诉我这个想法之后,我添加了一些逻辑,为拒绝访问的用户添加了另一列。那么哪一个是更新的代码?