Bonjour
J'ai créé ce petit script qui permet d'analyser tous les droits d'un ou des utilisateurs.
Le problème est ma fonction de récursivité.
Les données ce chargement en mémoire tant que la boucle n'est pas terminé.
Je débute en powershell (merci à Laurent Dardenne pour le cour sur les porté)
Et je ne sais pas comment libéré mes données au fur et a mesure.
avez vous des piste à me donner ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 Param([String]$Path=(Get-Location).Path, [bool]$Recurse=$false) #Import ActiveDirectory Module if not loaded $Module = Get-Module ActiveDIrectory If ($Module -eq $Null) {Import-Module ActiveDirectory} $strPATH = $Path #Initialisation du tableau $tabACL=@() Function fAD_Name{ Param ([string]$strAccountName) if ($strAccountName.Contains("\")){ #Retourne uniquement le sAMAccountName return [String]$strAccountName = ($strAccountName.Split("\")[-1]).Trim() } Else { return $strAccountName.Trim() } } Function fAddTab(){ Param([String]$strDirectory,[String]$strMemberName,[String]$strMemberOf='',[PSObject]$Access) $Dico=New-Object PSObject $Dico | Add-Member -Name Directory -MemberType NoteProperty -Value $strDirectory $Dico | Add-Member -Name User -MemberType NoteProperty -Value $strMemberName $Dico | Add-Member -Name MemberOf -MemberType NoteProperty -Value $strMemberOf $Dico | Add-Member -Name FileSystemRights -MemberType NoteProperty -Value $($Access.FileSystemRights).ToString() -PassThru $Dico | Add-Member -Name AccessControlType -MemberType NoteProperty -Value $($Access.AccessControlType).ToString() -PassThru $Dico | Add-Member -Name IsInherited -MemberType NoteProperty -Value $($Access.IsInherited).ToString() -PassThru Return $Dico } Function fAD_AddMembers(){ Param ( [String]$strCNObjectAD, [String]$strFolder, [PSObject]$Ace, [String]$strSubCNObjectAD='' ) $strCNObjectAD = $strCNObjectAD.Trim() #Récupureation de l'objet Active Directory (User ou Group) $objADObject = Get-ADObject -LDAPFilter "(sAMAccountName=$strCNObjectAD)" -properties Name, ObjectClass, Member Switch ([String]$objADObject.ObjectClass){ "group" { #Pour Chaque membre du groupe ForEach ($Member in $objADObject.member){ $objADO = Get-ADObject -LDAPFilter "(distinguishedName=$Member)" -properties cn, ObjectClass #Si dans les membres ont trouve un autre groupe, alors ont rappel la fonction if ($objADO.ObjectClass -like 'group') { fAD_AddMembers -strCNObjectAD $objADO.cn -strFolder $strFolder -Ace $Ace -strSubCNObjectAD $strCNObjectAD }Else{ $script:tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADO.cn -strMemberOf $strCNObjectAD -Access $Ace } } break } "user"{ #Entrée utilisateur $script:tabACL+=fAddTab -strDirectory $strFolder -strMemberName $objADObject.Name -Access $Ace break } Default{ $script:tabACL+=fAddTab -strDirectory $strFolder -strMemberName $strCNObjectAD -Access $Ace } } } if($Recurse -eq $true){ $liste_repertoire = Get-childitem $strPATH -recurse }Else{ $liste_repertoire = Get-childitem $strPATH } foreach ($repertoire in $liste_repertoire){ if($repertoire.Attributes -eq "Directory"){ $global_acl = Get-Acl $repertoire.FullName foreach ($droit in $global_acl.Access){ $strIdentification = fAD_Name $droit.IdentityReference fAD_AddMembers -strCNObjectAD $strIdentification.trim() -strFolder $repertoire.FullName -Ace $droit } } } return $tabACL
Partager