Je partage avec vous la découverte d’un script Powershell qui permet de faire un audit des droits d’accès à un dossier sous Windows.
Quand on gère un serveur de fichier sous Windows, au bout d’un certain temps et grâce aux idées folles de nos directeurs, ça devient souvent un peu le bazar dans les droits d’accès aux dossiers sur le serveur.
J’ai trouvé un script Powershell qui permet de faire l’audit d’un répertoire en faisant sortir à la fois les groupes ayant accès mais aussi les utilisateurs derrières ces groupes.
Le script original peut se trouver ici.
J’ai amélioré le script d’origine pour inclure la possibilité d’exclure certains groupes du résultat. Oui car les groupes du genre Domain Admins, on en a pas vraiment besoin dans le rapport.
Utilisation
Pour l’utiliser il vous faudra avoir vous même accès au répertoire à auditer, et avoir le module Active Directory pour Powershell.
La variable $ListExclusion à la ligne 9 vous permet de donner une liste de groupe à exclure du rapport.
La syntaxe :
.\Get-FolderACL.ps1 -Path CheminLocal_OuReseau | ConvertTo-HTML | Out-File c:\resultat.html
Les pipes ConvertTo-HTML et Out-File permettent d’avoir le rapport au format HTML.
Plusieurs options sont disponibles :
- Verbose : affiche les étapes du script
- Recurse : Permet de donner les droits de chaque dossier dans le dossier cible

Résultat d’un audit
Access.ps1
<#
.Synopsis
This script is used to give the list of users with write access to the given path.
.DESCRIPTION
This script is used to give the list of users with write access to the given path.
-Recurse : The Recurse option allows you to browse also the subdirectories
The variable $ListExclusion allows to give groups to be excluded from the result (Example: Admins Domain)
Geo Holz https://blog.jolos.fr
.EXAMPLE
Access.ps1 - Path "PATH_TO_DIRECTORY" -Recurse
#>
[CmdletBinding()]
Param (
[ValidateScript({Test-Path $_ -PathType Container})]
[Parameter(Mandatory=$true)]
[string]$Path,
[switch]$Recurse
)
$ListExclusion = "local.local\domain admins", "local.local\other_group_to_exclude"
Write-Verbose "$(Get-Date): Script begins!"
Write-Verbose "Getting domain name..."
$Domain = (Get-ADDomain).NetBIOSName
Write-Verbose "Getting ACLs for folder $Path"
If ($Recurse)
{ Write-Verbose "...and all sub-folders"
Write-Verbose "Gathering all folder names, this could take a long time on bigger folder trees..."
$Folders = Get-ChildItem -Path $Path -Recurse | Where { $_.PSisContainer }
}
Else
{ $Folders = Get-Item -Path $Path
}
Write-Verbose "Gathering ACL's for $($Folders.Count) folders..."
ForEach ($Folder in $Folders)
{ Write-Verbose "Working on $($Folder.FullName)..."
$ACLs = Get-Acl $Folder.FullName | ForEach-Object { $_.Access }
ForEach ($ACL in $ACLs)
{
If ($ListExclusion -notcontains $ACL.IdentityReference)
{
If ($ACL.IdentityReference -match "\\")
{ If ($ACL.IdentityReference.Value.Split("\")[0].ToUpper() -eq $Domain.ToUpper())
{ $Name = $ACL.IdentityReference.Value.Split("\")[1]
If ((Get-ADObject -Filter 'SamAccountName -eq $Name').ObjectClass -eq "group")
{ ForEach ($User in (Get-ADGroupMember $Name -Recursive | Select -ExpandProperty Name))
{ $Result = New-Object PSObject -Property @{
Path = $Folder.Fullname
Group = $Name
User = $User
FileSystemRights = $ACL.FileSystemRights
AccessControlType = $ACL.AccessControlType
Inherited = $ACL.IsInherited
}
$Result | Select Path,Group,User,FileSystemRights,AccessControlType,Inherited
}
}
Else
{ $Result = New-Object PSObject -Property @{
Path = $Folder.Fullname
Group = ""
User = Get-ADUser $Name | Select -ExpandProperty Name
FileSystemRights = $ACL.FileSystemRights
AccessControlType = $ACL.AccessControlType
Inherited = $ACL.IsInherited
}
$Result | Select Path,Group,User,FileSystemRights,AccessControlType,Inherited
}
}
Else
{ $Result = New-Object PSObject -Property @{
Path = $Folder.Fullname
Group = ""
User = $ACL.IdentityReference.Value
FileSystemRights = $ACL.FileSystemRights
AccessControlType = $ACL.AccessControlType
Inherited = $ACL.IsInherited
}
$Result | Select Path,Group,User,FileSystemRights,AccessControlType,Inherited
}
}
}
}
}
Write-Verbose "$(Get-Date): Script completed!"
Je découvre ce site et j’adore.
Pour ma petite contribution, voici un logiciel qui fait le même boulot et revira ceux qui sont allergique au PowerShell.
http://www.cjwdev.com/Software/NtfsReports/Info.html
Petit bémol, il n’exporte pas directement en .csv ou .xls
Autre outils sympa:
http://www.cjwdev.com/Software/ADTidy/Info.html
Il permet de faire des recherche dans l’AD et, avec les bons droits, de réaliser des actions en fonctions d’états directement.
Bonne continuation.
Sympa, merci 🙂
Bonjour
Possibilité d’avoir $ListExclusion?
J’ai un script ou je demande Path Groupe Droits et LastwriteTime et j’aimerai supprimer les comptes adm et autre system.
Cordialement
Jean-luc
Je viens de mettre à jour le blog pour afficher correctement le script
Bonjour,
Votre script corresponds exactement au besoin que j’ai actuellement. Avez-vous la possibilité de me le fournir car je ne le trouve pas sur le site ?
Cordialement,
Julien
Je viens de mettre à jour le blog pour afficher correctement le script
script presque parfait, on a bien la liste de tout les utilisateurs même dans des sous groupes.
Cependant dans le HTML final, les infos dans la colonne groupe sont toujours les mêmes, cela n’affiche pas dans quelgroupe l’utilisateur est. C’est dommage, comment peut on régler ce problème ?
Merci!
Parfait 🙂