Architecture¶
Le dépôt¶
Code/
Classes/ classes PowerShell : le modèle (GPO, liens, OU, annuaire), ADMX,
Registry.pol, GptTmpl.inf, préférences, descripteurs de sécurité, plateforme
Functions/Private/ l'implémentation : LDAP, SYSVOL, sauvegardes, workflow, fenêtre, arbres…
Functions/Public/ les commandes du module
CI/
03_Build.ps1 construit le module depuis Code/
tests/ les tests Pester (et leurs fixtures)
HGPM/
HGPM.psd1 le manifest (FunctionsToExport écrit par le build)
HGPM.psm1 construit : les classes, puis les fonctions privées et publiques (jamais modifié à la main)
Resources/ Configuration.psd1, Preferences.json, AvaloniaPackages.json, Icons/
Avalonia/ Get-AvaloniaBinaries.ps1, et bin/ (le runtime, non versionné)
Samples/ Directory.sample.json, PasswordPolicy.sample.json (les environnements de démonstration)
docs/ cette documentation (en, fr, assets)
CI/03_Build.ps1 concatène les classes et les fonctions dans HGPM.psm1 et écrit les
fonctions publiques dans le manifest. La construction est reproductible : pas de date, les
fichiers dans l'ordre de leurs noms, des fins de ligne LF, pour que les mêmes sources donnent les
mêmes octets sur tout ordinateur (installation hors ligne).
Le module s'appelle toujours HGPM, quel que soit le
nom du dossier du dépôt.
Les couches¶
flowchart TB
subgraph UI[Fenêtre - Avalonia]
window[Start-PSGPOManagerWindow<br/>XAML lu à l'exécution]
trees[New-PSGPODirectoryTree<br/>New-PSGPOPolicyTree<br/>Get-PSGPODirectoryDetail]
end
subgraph Commands[Commandes publiques]
cmds[Get-PSGPODirectory, Backup-PSGPO,<br/>Restore-PSGPO, Approve-PSGPO<br/>et les autres commandes PSGPO]
end
subgraph Model[Modèle - classes]
dir[GPOToolsDirectory<br/>en mémoire]
ldapdir[GPOToolsLdapDirectory<br/>un domaine]
end
subgraph Domain[Le domaine]
ldap[LDAP<br/>System.DirectoryServices.Protocols]
sysvol[SYSVOL<br/>UNC / smbclient / bindings Python]
tools[RSAT / samba-tool]
end
window --> trees --> dir
cmds --> dir
ldapdir -. hérite .-> dir
ldapdir --> ldap
ldapdir --> sysvol
ldapdir --> tools
Le modèle¶
GPOToolsDirectory est un domaine en mémoire : ses OU (GPOToolsSom), leurs liens
(GPOToolsGpoLink), ses GPO (GPOToolsGpo). Ses méthodes publiques sont les opérations de la
console (NewGpo, NewLink, RemoveLink, SetGpoStatus, NewFilteringGroups, RemoveGpo,
RestoreGpo, ApproveGpo, WritePolicyFile…) : elles vérifient la demande (droits, noms, GPO par
défaut…), puis appellent une méthode cachée Save* / Load* qui fait le travail.
- En mémoire (
Import-PSGPODirectory, l'environnement de démonstration, les tests), ces méthodes gardent les modifications en mémoire. GPOToolsLdapDirectory(Get-PSGPODirectory) les redéfinit pour écrire dans le domaine.
La fenêtre et les commandes sont donc le même code pour un domaine et pour les tests, et une modification refusée par le domaine laisse le modèle tel qu'il était.
Les stratégies de mot de passe affinées suivent le même modèle, sans les GPO :
GPOToolsPasswordPolicyStore contient les PSO (GPOToolsPasswordPolicy), la stratégie de mot de
passe du domaine et, en mémoire, les utilisateurs et groupes (GPOToolsPasswordAccount) ; ses
méthodes NewPolicy, SetPolicy, RemovePolicy, AddSubject, RemoveSubject vérifient, puis
appellent Save*. GPOToolsLdapPasswordPolicyStore (Connect-PSGPOPasswordPolicyStore, utilisé
par Show-PSOManagerAvalonia et les commandes) les écrit en LDAP. Resolve-PSGPOPasswordPolicy
ordonne les PSO qui concernent un compte, avec les groupes que compte chaque contrôleur de domaine
(LDAP).
La plateforme¶
Get-PSGPOPlatform détecte une fois ce qu'est l'ordinateur : Windows ou Linux, membre d'un
domaine ou contrôleur de domaine (smb.conf de Samba, krb5.conf), son domaine, samba-tool, la
bibliothèque LDAP. Chaque opération prend ensuite le chemin de sa plateforme :
| Opération | Windows | Linux |
|---|---|---|
| Lire l'annuaire | LDAP, l'identité de la session | LDAP, Kerberos (SASL GSSAPI) |
| Lire et écrire SYSVOL | chemin UNC | smbclient avec Kerberos |
| Droits SYSVOL | contrôle d'accès .NET | bindings Python de Samba (libsmb) |
| Créer et supprimer des GPO | New-GPO, Remove-GPO (RSAT) |
samba-tool gpo create / del |
| Liens, statut, filtrage de sécurité, workflow | LDAP | LDAP |
| Stratégies de mot de passe affinées | LDAP | LDAP |
Principes¶
- Aucun mot de passe n'est jamais donné à un outil : Kerberos pour
samba-tooletsmbclient(jamais d'invite : pas d'entrée standard,--use-kerberos=required), jamais de mot de passe en LDAP en clair. - Les droits sont ceux du domaine : la console lit les délégations, propose ce qu'elles permettent, et laisse le domaine refuser le reste (délégation).
- Aucune modification n'est perdue : une valeur LDAP est remplacée en retirant l'ancienne et en ajoutant la nouvelle dans une seule requête, refusée si quelqu'un l'a changée entre-temps ; la version d'une GPO est augmentée à partir de celle que l'annuaire contient.
- Lus comme des données : les fichiers de configuration sont lus avec
Import-PowerShellDataFile, jamais exécutés. - Ce que la console ne modifie pas est conservé : attributs inconnus et ciblage des préférences, valeurs de registre en plus, ACE qu'elle ne touche pas.