TUTOS.EU

Extraire les droits NTFS d un répertoire

Lister les personnes en accès sur un répertoire

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 Copier le code

Voir

get-acl "C:\Program Files" | select -expand access | Select IdentityReference
Lien vers le fichier : cliquez ici Copier le code

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 Copier le code

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 Copier le code

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 Copier le code

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 Copier le code

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 Copier le code

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 Copier le code

2