# Audit GPResult — Ordinateur Paquet WAPT d'audit des GPO et des groupes de sécurité de l'ordinateur. Le résultat structuré est enregistré dans **`audit-gpresult.computer-gpo`**. ## Fonctionnement 1. `install()` ne réalise aucune action. 2. `audit()` supprime un éventuel rapport temporaire précédent, puis lance GPResult avec un délai maximal de 120 secondes : ```text gpresult.exe /SCOPE COMPUTER /X "" /F ``` 3. Le script analyse la section `ComputerResults`, collecte l'identité du poste, classe les GPO et les groupes de sécurité. 4. Il transmet un dictionnaire à `WAPT.write_audit_data_if_changed`, avec `keep_days=365` et `max_count=1`. 5. La suppression du rapport est tentée dans `finally`, après succès comme après erreur. Le chemin de GPResult est construit avec `makepath(system32(), "gpresult.exe")`. L'audit consulte les données RSoP disponibles, sans lancer de `gpupdate` ni modifier les stratégies. Aucune session utilisateur active n'est nécessaire. Les GPO et groupes du contexte utilisateur sont collectés par le paquet utilisateur séparé. ## Prérequis - Poste Windows disposant de GPResult et de données RSoP machine accessibles. - Agent WAPT fournissant `setuphelpers` et `WAPT.write_audit_data_if_changed`. - Droits suffisants pour consulter le RSoP machine et écrire dans le répertoire temporaire du contexte d'exécution. ## Données produites Catégorie : `audit-gpresult` ; clé : `computer-gpo`. Exemple illustratif d'un résultat de succès : ```json { "status": "OK", "computer": { "name": "POSTE01", "account": "EXEMPLE\\POSTE01$", "account_domain": "EXEMPLE", "domain": "exemple.lan", "site": "Default-First-Site-Name" }, "summary": { "applied_gpo_count": 2, "denied_gpo_count": 1, "total_gpo_count": 3, "domain_group_count": 1, "local_group_count": 1, "system_group_count": 1, "other_group_count": 0 }, "applied_gpos": ["Local Group Policy", "Default Domain Policy"], "denied_gpos": ["GPO non appliquee"], "domain_groups": ["EXEMPLE\\Domain Computers"], "security_groups": { "domain": ["EXEMPLE\\Domain Computers"], "local": ["BUILTIN\\Users"], "system": ["NT AUTHORITY\\Authenticated Users"], "other": [] } } ``` | Champ | Signification | | --- | --- | | `status` | État de la collecte ; ce n'est pas un verdict de conformité. | | `computer.name` | Nom du poste issu de `COMPUTERNAME`. | | `computer.account` | Premier texte `Name` trouvé dans `ComputerResults`, utilisé comme compte RSoP machine. | | `computer.account_domain` | Préfixe du compte avant `\`, généralement au format NetBIOS ; vide si aucun préfixe n'est présent. | | `computer.domain` | Premier texte `DomainName`, sinon premier texte `Domain`, dans le sous-arbre machine. | | `computer.site` | Premier texte `Site` trouvé dans le sous-arbre machine. | | `summary.applied_gpo_count` / `summary.denied_gpo_count` | Nombre de GPO retenues dans chaque liste. | | `summary.total_gpo_count` | Somme des deux compteurs de GPO. | | `summary.domain_group_count` / `summary.local_group_count` / `summary.system_group_count` / `summary.other_group_count` | Nombre de groupes retenus dans chaque catégorie. | | `applied_gpos` / `denied_gpos` | Noms des GPO, dans l'ordre de collecte. | | `domain_groups` | Même liste que `security_groups.domain`, pour faciliter le reporting. | | `security_groups` | Groupes de sécurité répartis entre `domain`, `local`, `system` et `other`. | La recherche de texte est récursive et ignore les namespaces XML. Les informations non trouvées restent des chaînes vides. Le champ `computer.domain` peut contenir un nom DNS lorsqu'il est fourni par l'export ; le repli sur `Domain` ne garantit pas ce format. ## Classement des GPO Une GPO est appliquée si `Enabled`, `IsValid` et `FilterAllowed` sont vrais et si `AccessDenied` est faux. Toutes les autres entrées retenues vont dans `denied_gpos` : cette liste couvre les GPO non appliquées, y compris les GPO filtrées, désactivées ou invalides. Les valeurs `true`, `1`, `yes` et `oui`, sans distinction de casse, sont vraies. Toute autre valeur ou un champ absent est faux. Un indicateur positif absent empêche donc le classement comme GPO appliquée ; un `AccessDenied` absent est considéré comme faux. La recherche des balises `GPO` est récursive. Les entrées sans nom sont ignorées et les doublons sont éliminés selon `(nom, VersionDirectory, VersionSysvol)`. Un nom peut apparaître plusieurs fois si les versions diffèrent. Les listes de GPO ne sont pas triées. Les compteurs décrivent les entrées retenues, sans constituer un inventaire de toutes les GPO du domaine. ## Classement des groupes de sécurité Les groupes sont extraits des balises `SecurityGroup` du RSoP, sans requête LDAP supplémentaire. Le classement utilise les préfixes des noms, dans cet ordre : | Catégorie | Règle | | --- | --- | | `system` | Préfixe `NT AUTHORITY\`. | | `local` | Préfixe `BUILTIN\` ou nom du poste suivi de `\`. | | `domain` | Préfixe du compte RSoP suivi de `\`, si ce préfixe est non vide et différent du nom du poste. | | `other` | Toutes les autres identités. | Les comparaisons et la déduplication des noms ignorent la casse. Les entrées sans nom sont ignorées ; chaque liste est triée alphabétiquement sans distinction de casse. Ce classement repose sur les noms présents dans l'export, sans validation du domaine par SID ou LDAP. Les noms localisés ou les groupes d'un autre domaine peuvent rester dans `other`. Les listes reflètent les données RSoP collectées ; elles ne constituent pas un inventaire exhaustif des groupes AD ou locaux. ## Statuts | Statut enregistré | Retour WAPT | Situation | | --- | --- | --- | | `OK` | `OK` | Export, analyse et enregistrement terminés, même avec des GPO non appliquées ou des listes vides. | | `ERROR` | `ERROR` | Exception capturée : commande en échec, rapport absent, XML invalide, section `ComputerResults` absente, etc. | En cas d'erreur, la même clé reçoit uniquement `status: ERROR` et `message`. Les listes et compteurs du précédent succès ne sont pas recopiés. Consulter `status` avant d'exploiter le résultat. Aucun statut `WARNING` n'est utilisé. ## Déploiement et dépannage 1. Mettre à jour `setup.py` dans les sources du paquet existant. 2. Adapter si nécessaire la description de `WAPT/control` pour mentionner les groupes de sécurité, en conservant l'identité et les autres métadonnées du paquet ; incrémenter sa version selon les conventions du dépôt. 3. Reconstruire, signer, téléverser et déployer le paquet, puis lancer l'audit depuis WAPT. 4. Consulter `audit-gpresult.computer-gpo` et le journal, qui indique les compteurs de GPO et de groupes de domaine ou l'erreur rencontrée. La fréquence des audits dépend de la configuration WAPT ; le script ne crée pas de planification. En cas d'échec, vérifier les droits de l'agent, les données RSoP, l'accès à GPResult et au répertoire temporaire. Le rapport utilise le nom fixe `wapt-gpresult-computer.xml` dans `tempfile.gettempdir()`. Éviter les audits simultanés partageant ce répertoire. Un échec de nettoyage est ignoré et peut laisser le fichier sur disque. ## Contenu du dépôt - `setup.py` : collecte et analyse des GPO et groupes de sécurité machine. - `README.md` : fonctionnement, schéma de données et exploitation. - `WAPT/description.txt` : description fournie pour le contrôle existant ; elle décrit les GPO et ne mentionne pas encore les groupes de sécurité. Ce fichier ne remplace pas un `WAPT/control` complet.