Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell NTFS ACL导出到Excel错误_Arrays_Powershell_Vbscript - Fatal编程技术网

Arrays Powershell NTFS 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

我写的剧本有问题。基本上,它从FolderList.txt文件读取UNC路径列表 从文件位置提取ACL列表,并将所有信息导出到Excel。我的第一列很好,但第二列给了我一条错误消息。我认为原因是我试图将多行数据或可能的数组类型数据放入第二列。请帮我挥动这面白旗

$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告诉我这个想法之后,我添加了一些逻辑,为拒绝访问的用户添加了另一列。那么哪一个是更新的代码?