Before I used the tool Security Explorer from Little Wonders.. And found out that through several take overs this is now Dell... (Scriptlogic -> Quest --> Dell)
since the software had gotten richer over the years with additional functions the price had also gone up, and is now only available in a time limited license..
So I thought, I can do this myself in PowerShell... And the result was very good (as I do say so myself)
I started out with the following script to get the permissions on the first 3 levels..
$OutFile = "C:\temp\folder-Permissions.csv"
$Header = "Folder Path,IdentityReference,AccessControlType,FileSystemRights,IsInherited"
Del $OutFile
Add-Content -Value $Header -Path $OutFile
$RootPath = "z:\"
$Folders = get-CHildItem $RootPath | where {$_.psiscontainer -eq $true}
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Folder.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
$Folders = get-CHildItem $RootPath\* | where {$_.psiscontainer -eq $true}
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Folder.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
$Folders = get-CHildItem $RootPath\*\* | where {$_.psiscontainer -eq $true}
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Folder.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
$Folders = get-CHildItem $RootPath\*\*\* | where {$_.psiscontainer -eq $true}
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Folder.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
So since this worked, I started optimizing the code for posting on my blog.. and came up with the following. (Remember I want only the first 3 levels)
$OutFile = "C:\temp\folder-Permissions.csv"
$Header = "Folder Path,IdentityReference,AccessControlType,FileSystemRights,IsInherited"
Del $OutFile
Add-Content -Value $Header -Path $OutFile
$RootPath = "z:\"
Function getSubFolderpermissions ($folders){
foreach ($Folder in $Folders){
$ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Folder.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
}
$Folders = get-CHildItem $RootPath | where {$_.psiscontainer -eq $true}
getSubFolderpermissions $folders
$Folders = get-CHildItem $RootPath\* | where {$_.psiscontainer -eq $true}
getSubFolderpermissions $folders
$Folders = get-CHildItem $RootPath\*\* | where {$_.psiscontainer -eq $true}
getSubFolderpermissions $folders
$Folders = get-CHildItem $RootPath\*\*\* | where {$_.psiscontainer -eq $true}
getSubFolderpermissions $folders
but still I didn't like this..
so after I little active rewriting I found this:
$OutFile = "C:\temp\folder-Permissions.csv"
$Header = "Folder Path,IdentityReference,AccessControlType,FileSystemRights,IsInherited"
remove-item $OutFile
Add-Content -Value $Header -Path $OutFile
$RootPath = "\\san2\hdswbr$\Docs"
$levelsdeep = 3
Function getSubFolderpermissions ($Folders, $currentlevel){
if ($currentlevel -lt ($levelsdeep + 1)){
foreach ($map in $Folders){
$subfolders = get-CHildItem $map.fullname | where {$_.psiscontainer -eq $true}
if (!($subfolders -eq $null)){
getSubFolderPermissions $subfolders ($currentlevel +1)
}
$ACLs = get-acl $map.fullname | ForEach-Object { $_.Access }
Foreach ($ACL in $ACLs){
if ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $map.Fullname + ";" + $ACL.IdentityReference + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}
}
}
$Mappen = get-CHildItem $RootPath | where {$_.psiscontainer -eq $true}
getSubFolderpermissions $Mappen, 0

Two comments:
ReplyDelete1) Change $Header to use same delimiter as $OutInfo
$Header = "Folder Path;IdentityReference;AccessControlType;FileSystemRights;IsInherited"
2) Recursion works but when run against a unc path after gettting all levels points back to C: drive and then resurses from there
Thanks for the comments..
ReplyDeleteAbout your comment number 2, I didn't run into this, the recursion was working... I am currently searching for the actual script which I used, to see if I missed something in my post.
Thanks for the feedback. I will update my post later.
I had problems with the recursion falling back to C:\ as well. I resolved it by eliminating the recursion:
ReplyDelete$MasterDirectory = "\\SERVERNAME\SHARENAME"
$Date = "{0:yyyyMMdd-HHmm}" -f (Get-Date)
$OutFile = $("C:\Output\FolderPermissions_" + $Date + ".txt")
$Header = "Folder Path;IdentityReference;AccessControlType;FileSystemRights;IsInherited"
remove-item $OutFile
Add-Content -Value $Header -Path $OutFile
$Directories = ls $MasterDirectory -directory -r | % {$_.FullName}
ForEach ($Directory in $Directories){
$ACLs = get-acl $Directory | % { $_.Access}
ForEach ($ACL in $ACLs){
If ($ACL.IdentityReference -eq "BUILTIN\Administrators"){
}else{
$OutInfo = $Directory + ";" + $Name.ToString() + ";" + $ACL.AccessControlType + ";" + $ACL.FileSystemRights + ";" + $ACL.IsInherited
Add-Content -Value $OutInfo -Path $OutFile
}
}
}