To determine the ACL’s on a specific foldertree use the following script. It will display the Path, FileSystemRights, IsInherited, Name of the underlying folders.
$path = "\\server\path\"
$targetFile = "file.csv" # Not working yet
$foldersToQuery = Get-ChildItem $Path | Where {$_.PSIsContainer} | select -expandproperty FullName
# Get access list, change any domain
foreach ($folder in $foldersToQuery) {
$Access = (Get-Acl $Folder).Access |
Select-Object @{n='Path';e={ $Folder }}, *,
@{n='ADObject';e={
If ($_.IdentityReference -NotMatch "^(NT AUTH|BUILTIN|$($Env:ComputerName))") {
$Searcher = [ADSISearcher]"(sAMAccountName=$($_.IdentityReference -Replace '^.+\\'))"
$Searcher.PropertiesToLoad.AddRange(@("name", "distinguishedName", "objectClass"))
$Searcher.FindOne()
} }} |
Select-Object *, @{n='Name';e={ $_.ADObject.Properties['name'][0] }},
@{n='DN';e={ $_.ADObject.Properties['distinguishedname'][0] }},
@{n='Class';e={ ([String[]]$_.ADObject.Properties['objectclass'])[-1] }} -Exclude ADObject
$Access | ForEach-Object {
$Entry = $_
If ($Entry.Class -eq 'group') {
$Searcher = [ADSISearcher]"(memberOf:1.2.840.113556.1.4.1941:=$($Entry.DN))"
$Searcher.PageSize = 1000
$Searcher.PropertiesToLoad.AddRange(@("name", "distinguishedName", "objectClass"))
$Searcher.FindAll() | ForEach-Object {
$ADObject = $_
$Entry | Select-Object *, @{n='Name';e={ $ADObject.Properties['name'][0] }},
@{n='DN';e={ $ADObject.Properties['distinguishedname'][0] }},
@{n='Class';e={ ([String[]]$ADObject.Properties['objectclass'])[-1] }} -Exclude Name, DN, Class
}
} Else {
$Entry
}
} | ft Path, FileSystemRights, IsInherited, Name, class -AutoSize
}