使用输入文件夹列表审核NTFS权限

时间:2014-11-18 17:32:10

标签: powershell file-permissions

我正在尝试对某些文件夹进行审核。我需要获得输入文件中列出的每个文件夹的NTFS权限。我有一个带有文件夹路径的folderlist.txt。

这是我的脚本:

$InputFile = "C:\Folderlist.txt"
$OutputFile = "C:\FolderPermissions.csv"
$FolderList = Get-Content $InputFile

ForEach ($Folder in $FolderList)
{
    $Permissions = (Get-ACL $Folder).access | ForEach-Object {$_ |
        Add-Member -MemberType NoteProperty -Name Folder -Value $Folder}
    $Report += $Permissions
}

$Report | Select-Object Folder,IdentityReference,FileSystemRights,IsInherited |
    Where {$_.Folder -ne $Null -and $_.IdentityReference -like "HARRAHS*" -and $_.IsInherited -ne "TRUE"} |
    Export-CSV $OutputFile -NoTypeInformation

但它没有给出任何输出。我是powershell noob,有人可以指导我并告诉我我做错了什么? 我需要的输出基本上是文件夹的名称,组和具有权限的用户。 E.g:

Folder Path    IdentityReference    AccessControlType
C:\Folder1\    DOMAIN\User1         Read
C:\Folder1\    DOMAIN\Group1        Write
C:\Folder2\    DOMAIN\User2         Modify
C:\Folder2\    DOMAIN\Group2        Full

非常感谢任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:1)

这是你的罪魁祸首:

$Permissions = (Get-ACL $Folder).access | ForEach-Object {
  $_ | Add-Member -MemberType NoteProperty -Name Folder -Value $Folder
}

将ACE管道传输到一个循环中,向每个循环添加一个属性。但是,| Add-Member构造不会输出修改后的对象,因此没有任何内容可以分配给$Permissions

可以通过在; $_语句后添加Add-Member来修复此问题,以便将对象重新注入管道:

$Permissions = (Get-ACL $Folder).access | ForEach-Object {
  $_ | Add-Member -MemberType NoteProperty -Name Folder -Value $Folder; $_
}
然而,我会建议采用略有不同的方法。由于您以后无论如何都要过滤对象属性,因此您可以直接将ACE封装到Select-Object cmdlet中,并使用calculated property添加路径:

Get-Content $InputFile | % {
  $Folder = $_
  (Get-Acl $Folder).Access |
    Select-Object @{n='Folder';e={$Folder}}, IdentityReference,
                  FileSystemRights, IsInherited
} | ? {
  $_.Folder -ne $null -and
  $_.IdentityReference -like "HARRAHS*" -and
  $_.IsInherited -ne 'True'
} | Export-CSV $OutputFile -NoTypeInformation