Un premier exemple simple pour lister les droits sur C:\Program Files
get-acl "C:\Program Files" | select -expand access | Out-GridView
Lien vers le fichier : cliquez ici
Voir
get-acl "C:\Program Files" | select -expand access | Select IdentityReference
Lien vers le fichier : cliquez ici
Cette version simple affiche les droits en place sur C:\, et cela sous la forme d'un tableau
clear-host
$MesACLs = get-acl "C:\"
$ListeACL = @()
ForEach ($OneACL in $MesACLs.Access) {
$OneAclResult = New-Object -TypeName PSObject
$MaVariable = [string] $OneACL.IdentityReference
$OneAclResult | Add-Member -Type NoteProperty -Name IdentityReference -Value $OneACL.IdentityReference #$MaVariable
$OneAclResult | Add-Member -Type NoteProperty -Name FileOneAclResultRights -Value $OneACL.FileOneAclResultRights
$OneAclResult | Add-Member -Type NoteProperty -Name IsInherited -Value $OneACL.IsInherited
$OneAclResult | Add-Member -Type NoteProperty -Name AccessControlType -Value $OneACL.AccessControlType
$OneAclResult | Add-Member -Type NoteProperty -Name InheritanceFlags -Value $OneACL.InheritanceFlags
$ListeACL += $OneAclResult
}
$ListeACL | Format-Table
#$ListeACL | Where-Object {$_.IdentityReference -match ""} | Format-Table
Lien vers le fichier : cliquez ici
Exemple de résultat :
Celle-ci résoud le SamAccountName pour afficher le "Name" qui, avec le la chance, contient le nom et prénom
clear-host
$MesACLs = get-acl "C:\Program Files"
$ListeACL = @()
ForEach ($OneACL in $MesACLs.Access) {
$OneAclResult = New-Object -TypeName PSObject
$MaVariable = [string] $OneACL.IdentityReference
$OneAclResult | Add-Member -Type NoteProperty -Name IdentityReference -Value $OneACL.IdentityReference #$MaVariable
$LongSamAccountName = [string] $OneACL.IdentityReference
$SamAccountName = $LongSamAccountName.substring($LongSamAccountName.indexof("\")+1)
$FullName = ""
$FullName = Get-ADUser -Identity $SamAccountName | Select Name
$OneAclResult | Add-Member -Type NoteProperty -Name FullName -Value $FullName.Name
$ListeACL += $OneAclResult
}
$ListeACL | Format-Table
Lien vers le fichier : cliquez ici
Cette autre version un poil plus compliquée écrit le résultat dans un fichier texte
#Export NTFS rapide dans un fichier des droits NTFS d'un répertoire
#Version du 19/01/2018
Clear-Host
$MyLine = [string]
$NomFichierACreer = [string]
$MonResultat = [string]
$NomObjet = [string]
function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
$ScriptFolderPath = Split-Path $Invocation.MyCommand.Path
return $ScriptFolderPath
}
function ListACL(){
param([string]$ObjectToProcess)
#On recupere les droits de l objet a traiter
$objACL = Get-ACL $ObjectToProcess
foreach ($MySubACL in $objACL.Access)
{
$MyLine = "" + $MySubACL.IdentityReference + "`t" + $MySubACL.AccessControlType + "`t" + $MySubACL.FileSystemRights + "`t" + $MySubACL.IsInherited + "`t" + $MySubACL.PropagationFlags
add-content $MonFichier $MyLine
}
}
$DefaultValue = Get-ScriptDirectory
$ObjectToProcess = Read-Host "Chemin du répertoire à traiter (par défaut : $DefaultValue)"
if($ObjectToProcess -eq $null){$ObjectToProcess = $DefaultValue}
if($ObjectToProcess -eq ""){$ObjectToProcess = $DefaultValue}
if ($ObjectToProcess.Length -igt 0){
$NomFichierACreer = $ObjectToProcess -replace '\\','_' ##Remplace les \ par _
$NomFichierACreer = $NomFichierACreer -replace '[^a-zA-Z 0-9_]+','' #Remplace tous les caractères spéciaux saut les espaces et les _
$SubFolderModified = $NomFichierACreer -replace '[ ]+',' ' ##Histoire de retirer les espaces consécutifs
$NomFichierACreer = "Groupes en acces sur $SubFolderModified.txt"
}
else{break}
$EmplacementFichier = Get-ScriptDirectory
$EmplacementFichier = "$EmplacementFichier\$NomFichierACreer"
#Création du fichier avec les résultats
$MonFichier = New-Item -type file $EmplacementFichier -Force
add-content $MonFichier "Accès en place sur $ObjectToProcess :"
add-content $MonFichier ""
ListACL -ObjectToProcess $ObjectToProcess
Write-Host "C'est terminé."
Lien vers le fichier : cliquez ici
Version où on extrait les comptes en accès ainsi que les membres des groupes en accès
clear-host
$MesACLs = get-acl "C:\"
$ListeACL = @()
ForEach ($OneACL in $MesACLs.Access) {
$OneAclResult = New-Object -TypeName PSObject
$MaVariable = [string] $OneACL.IdentityReference
$NomDuGroupe = $MaVariable.substring($MaVariable.indexof("\")+1)
#write-host $NomDuGroupe
try{
if ($NomDuGroupe -ne "Utilisa. du domaine") {$MonGroupe = Get-ADGroupMember -identity $NomDuGroupe -Recursive | select name, SamAccountName }
}
catch{
$MonGroupe = $null
#Write-host $($_.exception.message)
}
$OneAclResult | Add-Member -Type NoteProperty -Name IdentityReference -Value $OneACL.IdentityReference #$MaVariable
$OneAclResult | Add-Member -Type NoteProperty -Name FileOneAclResultRights -Value $OneACL.FileOneAclResultRights
$OneAclResult | Add-Member -Type NoteProperty -Name IsInherited -Value $OneACL.IsInherited
$OneAclResult | Add-Member -Type NoteProperty -Name AccessControlType -Value $OneACL.AccessControlType
$OneAclResult | Add-Member -Type NoteProperty -Name InheritanceFlags -Value $OneACL.InheritanceFlags
$ListeACL += $OneAclResult
$OneAclResult = $null
#Si le membre est un groupe, on ajoute les membres du groupe
if ($MonGroupe-ne $null) {
foreach ($UneLigne in $MonGroupe){
$OneAclResult = New-Object -TypeName PSObject
$OneAclResult | Add-Member -Type NoteProperty -Name IdentityReference -Value "$NomDuGroupe : $($UneLigne.name)"
$OneAclResult | Add-Member -Type NoteProperty -Name FileOneAclResultRights -Value $OneACL.FileOneAclResultRights
$OneAclResult | Add-Member -Type NoteProperty -Name IsInherited -Value $OneACL.IsInherited
$OneAclResult | Add-Member -Type NoteProperty -Name AccessControlType -Value $OneACL.AccessControlType
$OneAclResult | Add-Member -Type NoteProperty -Name InheritanceFlags -Value $OneACL.InheritanceFlags
$ListeACL += $OneAclResult
$OneAclResult = $null
}
#write-host $NomDuGroupe
}
write-host ""
}
$ListeACL | sort-object -property IdentityReference | Format-Table
#$ListeACL | Where-Object {$_.IdentityReference -match ""} | Format-Table
Lien vers le fichier : cliquez ici
Version ou l'on traite les droits du répertoire et ses sous-répertoires.
On ecrit le tout dans un fichier csv
#Export NTFS rapide dans un fichier des droits NTFS d'un répertoire
#Version du 30/05/2018
Clear-Host
$MyLine = [string]
$NomFichierACreer = [string]
$MonResultat = [string]
$NomObjet = [string]
$varCheminRepertoireScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
write-host $varCheminRepertoireScript
$DefaultValue = $varCheminRepertoireScript
$ObjectToProcess = Read-Host "Chemin du répertoire à traiter (par défaut : $DefaultValue)"
if($ObjectToProcess -eq $null){$ObjectToProcess = $DefaultValue}
if($ObjectToProcess -eq ""){$ObjectToProcess = $DefaultValue}
if ($ObjectToProcess.Length -igt 0){
$NomFichierACreer = $ObjectToProcess -replace '\\','_' ##Remplace les \ par _
$NomFichierACreer = $NomFichierACreer -replace '[^a-zA-Z 0-9_]+','' #Remplace tous les caractères spéciaux saut les espaces et les _
$SubFolderModified = $NomFichierACreer -replace '[ ]+',' ' ##Histoire de retirer les espaces consécutifs
$NomFichierACreer = "Groupes en acces sur $SubFolderModified.csv"
}
else{break}
$EmplacementFichier = $varCheminRepertoireScript
$EmplacementFichier = "$EmplacementFichier\$NomFichierACreer"
#Création du fichier avec les résultats
$MonFichier = New-Item -type file $EmplacementFichier -Force
add-content $MonFichier "Accès en place sur $ObjectToProcess :"
add-content $MonFichier ""
add-content $MonFichier "Répertoire`tCompte`tAccès`tDroits`tHéritage`tPropagation"
#On recupere les droits de l objet a traiter
$objACL = Get-ACL $ObjectToProcess
foreach ($MySubACL in $objACL.Access)
{
$MyLine = "$ObjectToProcess`t$($MySubACL.IdentityReference)`t" + $MySubACL.AccessControlType + "`t" + $MySubACL.FileSystemRights + "`t" + $MySubACL.IsInherited + "`t" + $MySubACL.PropagationFlags
add-content $MonFichier $MyLine
}
#On traite maintenant les sous-répertoires
$MonFolder = Get-ChildItem -Path $ObjectToProcess -recurse | Where-Object {$_.PSIsContainer}
foreach ($MySubFolder in $MonFolder)
{
Write-Host $MySubFolder.FullName
$ObjectToProcess = $MySubFolder.FullName
#On recupere les droits de l objet a traiter
$objACL = Get-ACL $ObjectToProcess
foreach ($MySubACL in $objACL.Access)
{
$MyLine = "$($ObjectToProcess)`t$($MySubACL.IdentityReference)`t" + $MySubACL.AccessControlType + "`t" + $MySubACL.FileSystemRights + "`t" + $MySubACL.IsInherited + "`t" + $MySubACL.PropagationFlags
add-content $MonFichier $MyLine
}
}
Write-Host "C'est terminé."
Lien vers le fichier : cliquez ici
Version où en plus de lister les droits en place, on liste les personnes membres des groupes.
Cela fait appel à Quest.ActiveRoles, du coup ce n'est pas top
#Export NTFS rapide dans un fichier des droits NTFS d'un répertoire avec appel récursif pour les membres des groupes
#Version du 18 avril 2013
Clear-Host
$MyLine = [string]
$NomFichierACreer = [string]
$MonResultat = [string]
$NomObjet = [string]
#Valeurs nécessaire dans tous les cas
$DefaultADPath = 'OU=MonOU,DC=Mondomaine,DC=Com'
function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
$ScriptFolderPath = Split-Path $Invocation.MyCommand.Path
return $ScriptFolderPath
}
function CheckQuestActiveRolesADM()
{
#Test la présence des outils Quest
$Error.Clear()
Get-PSSnapin Quest.ActiveRoles.ADManagement
if($Error.Count -ne 0)
{
Clear-Host
Write-Host "`n`n`t`t ERROR - To run this script, the Quest.ActiveRoles.ADManagement must be installed and registered with Powershell." -foregroundcolor red -backgroundColor yellow
Write-Host "`t`t go to the Settings menu in Powershell Plus and click on Manage Snapins." -foregroundcolor red -backgroundColor yellow
break
}
}
function ListACL(){
param([string]$ObjectToProcess)
#On recupere les droits de l objet a traiter
$objACL = Get-ACL $ObjectToProcess
foreach ($MySubACL in $objACL.Access)
{
$MyLine = "" + $MySubACL.IdentityReference + "`t" + $MySubACL.AccessControlType + "`t" + $MySubACL.FileSystemRights + "`t" + $MySubACL.IsInherited + "`t" + $MySubACL.PropagationFlags
add-content $MonFichier $MyLine
$NomObjet = $MySubACL.IdentityReference
$NomObjet = [string] $NomObjet
$Error.Clear()
$ErrorActionPreference = "silentlycontinue"
#$MesGroupes = Get-QADGroupMember -name $NomObjet -searchroot $ADRoot -sizelimit 0
#$MesGroupes = Get-QADGroupMember $NomObjet -Indirect -ErrorVariable Err -ErrorAction SilentlyContinue
$MesGroupes = Get-QADGroupMember $NomObjet -Indirect -ErrorVariable Err
if ($error.Count -ieq 0){
add-content $MonFichier "`tMembres de $NomObjet"
foreach ($UneLigne in $MesGroupes){
add-content $MonFichier "`t`t$UneLigne"
}
}
else{
#Affichage éventuel de l'erreur
#Write-Host $Err[0]
}
}
}
#Test de la présence des outils Quest
CheckQuestActiveRolesADM
$DefaultValue = Get-ScriptDirectory
$ObjectToProcess = Read-Host "Chemin du répertoire à traiter (par défaut : $DefaultValue)"
if($ObjectToProcess -eq $null){$ObjectToProcess = $DefaultValue}
if($ObjectToProcess -eq ""){$ObjectToProcess = $DefaultValue}
if ($ObjectToProcess.Length -igt 0){
$NomFichierACreer = $ObjectToProcess -replace '[^a-zA-Z 0-9]+',''
$SubFolderModified = $NomFichierACreer -replace '[ ]+',' ' ##Histoire de retirer les espaces consécutifs
$NomFichierACreer = "Groupes en acces sur $SubFolderModified.txt"
}
else{break}
$EmplacementFichier = Get-ScriptDirectory
$EmplacementFichier = "$EmplacementFichier\$NomFichierACreer"
$ADRoot = Read-Host "Racine de l'AD (par défaut : $DefaultADPath)"
if($ADRoot -eq $null){$ADRoot = $DefaultADPath}
if($ADRoot -eq ""){$ADRoot = $DefaultADPath}
#Création du fichier avec les résultats
$MonFichier = New-Item -type file $EmplacementFichier -Force
add-content $MonFichier "Accès en place sur $ObjectToProcess :"
add-content $MonFichier ""
ListACL -ObjectToProcess $ObjectToProcess
Write-Host "C'est terminé."
Lien vers le fichier : cliquez ici
Article(s) suivant(s)
Article(s) en relation(s)