Tu ferais comme ça ?Envoyé par powershell
Tu ferais comme ça ?Envoyé par powershell
Je suis aussi développeur !
Alors 1 000 000 fois oui !
Parce que dis moi, sinon, admettons qu'on trouve un truc pour te cacher le message d'erreur.
Comment tu traiterais le cas ou le groupe n'existe pas ?
Ça m’intéresse
Ces deux lignes de code servent à récupérer les membres d'un groupe et à afficher leur distinguishedName
Donc en effet si tu veux boucler sur une liste de groupe, il faut rajouter quelque chose
J'ai viré les commande powerquest de mon script. Ca consomme un peu moins de mémoire, mais c'est pas encore ça. Je sèche sur ce qui peut consommer comme ça !
Dans les grandes lignes que fais ton script au final ?
Depuis un fichier CSV où j'ai des chemins de répertoire, j'analyse les droits d'accès de ceux-ci : Je relève les utilisateurs / groupes et le type d'accès.
Ensuite, si j'ai des groupes (locaux ou de domaine), je relève les membres (afin d'avoir une liste d'utilisateur)
Une fois que j'ai ceci, je créer un nouveau groupe sur l'AD, qui répond à la nomenclature et j'ajoute les membres obtenu à l'étape précédente. Ensuite, j'applique ce groupe aux répertoire et j'applique des droits.
En gros, je remplace les groupes existant par des nouveaux, et au passage je vire les imbrications de groupe pour avoir une liste unique d'utilisateur. Je fais ceci en prérequis d'un projet qui demande ça.
Par la suite, je viendrais taguer les anciens groupes que j'ai remplacé par les nouveaux en vu des les supprimer plus tard.
J'ai l'impression que ma fonction GetGroupsMembers en est la cause avec mes recherches récursives sur l'AD. Il cumule les données au fur et à mesure de l'avancement du script sans libérer la mémoire après utilisation.
Ah oui sympa
Une belle usine nucléaire au maïs quoi !
Je n'ai que très peu survolé ton code mais genre :
=>
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 # Conversion SID vers SamAccountName Function ConvertFrom-SID{ [CmdletBinding()] param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)]$sid, [Parameter(Mandatory=$true,ValueFromPipeline=$true)][string[]]$ComputerName ) $objSID = New-Object System.Security.Principal.SecurityIdentifier($sid) try { # Conversion sur le domaine $objUser = $objSID.Translate( [System.Security.Principal.NTAccount]) $name = $objUser.Value $GetQADObject = Get-QADObject $sid | SELECT Type,DN $ObjectType = $GetQADObject.Type+" domain" $DN = $GetQADObject.DN } catch { # Conversion sur la machine local $adsi = [adsi]"WinNT://$ComputerName" $users = $adsi.Children | where {($_.SchemaClassName -eq 'user') -OR ($_.SchemaClassName -eq 'group')} $users | ForEach-Object{ $localSID = New-Object System.Security.Principal.SecurityIdentifier($_.objectSid.Value,0) if ($localSID.Value -eq $sid) { $Split = $_.Path -Split '/' $name = $Split[$Split.count-1] $ObjectType = $_.SchemaClassName+" local" $DN = "Compte local" # Pas de DN car en local } } } # Affichage des résultats New-Object -TypeName PSObject -Property @{ SID = $sid Name = $name ObjectType = $ObjectType DN = $DN } | Select SID,Name,ObjectType,DN }
Code : Sélectionner tout - Visualiser dans une fenêtre à part [wmi]"Win32_SID.SID='<SID>'"
Le services est HS ???
Comment ça ?
WMI c'est, pour moi en tout cas, indispensable !
En plus j'ai des outils de supervision qui utilise WMI pour surveiller les espaces disques et d'autres joyeuseté sur mes serveurs
Tu utilise quoi du coup dans ta fonction GetGroupsMembers ?
Get-QADGroupMember, Get-ADGroupMember, ADSI ?
Miam.... CHOCOLAT !!!!!!!
Oui je comprends, dommage car ce genre d'astuce réduit considérablement les temps de traitement et la charge du code
Et pourquoi pas ADSI du coup ?
Bah il faut que j'essai. Il faut que je code la fonction. J'ai fais en sorte de pouvoir remonter le DN du groupe pour l'utiliser avec ADSI
Avec ce code,
y-a-t-il moyen d'avoir le Sid, Name, objectClass et le distinguishedName (que nous avons déjà) des membres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $Group = [ADSI]"LDAP://CN=Administrateurs,CN=Builtin,DC=xxxxxx,DC=local" $Members = $Group.Member | %{[ADSI]"LDAP://$($_)"}
Bien sur...
Il n'y a que le objectSID qui est en fait un tableau qui décompose la valeur....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $Group = [ADSI]"LDAP://CN=Administrateurs,CN=Builtin,DC=xxxxxx,DC=local" $Members = $Group.Member | %{[ADSI]"LDAP://$($_)"} $Members[0].name $Members[0].objectSID $Members[0].objectClass $Members[0].distinguishedName
Donc si tu en as absolument besoin il faudra le reconvertir.
Je ne pige pas trop ton code.
Enfin si je le comprend mais je ne comprend pas pourquoi j'ai ce résultat.
CN=test2,OU=GroupShare,OU=FileSharing,OU=ouSecurityGroups,OU=ouSite,DC=domain,DC=com
test2
1
5
0
0
0
0
0
5
21
0
0
0
250
79
12
47
38
118
30
47
35
95
99
107
47
81
7
0
top
group
Il n'y a que le objectSID qui est en fait un tableau qui décompose la valeur....
Donc si tu en as absolument besoin il faudra le reconvertir.
oui, j'ai bien vu, mais je ne comprend pas pourquoi...
Ben parce qu'il est stocké comme ca dans l'objet User ADSI....
Donc si tu en as besoin il faut le convertir ou le récupérer à partir du Name (ce qui est largement plus simple !).
Bon, je n'arrive pas a avoir ce que je souhaite. Pas grave.
J'ai pensé à une autre méthode pour exécuter mon script :
Je pourrais faire un script principal qui parcoure mon fichier CSV et exécuter une autre instance POWERSHELL avec mon script usine nucléaire.
L'idée est d'espérer qu'à la fin de l'exécution du second script, la mémoire soit libéré.
Je pensais tester cette solution avec des Jobs (start-jobs), mais aucune idée si cela peut fonctionner. Qu'en penses-tu ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager