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 :

    gpresult.exe /SCOPE COMPUTER /X "<rapport.xml>" /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 :

{
  "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.
S
Description
Audite les GPO appliquées/refusées sur la machine
Readme GPL-3.0
55 KiB
0 Stars 3 Watchers 0 Forks
Languages
Python 100%