Jun 12 2012

Powershell: Defragmentation hors ligne du NTDS.dit

Nous allons voir dans cet article comment réaliser une défragmentation hors ligne de la base de données AD (NTDS) sous Windows 2008. A partir de cette version, plus besoin de redémarrer en mode DSRM pour effectuer ce type d’opération, il vous suffit de stopper le service Active Directory.

Nous allons ensuite lancer l’utilitaire ntdsutil.exe et lui donner en entrée les commandes de défragmentation stockées dans le fichier $compactinput. La base est compactée dans le répertoire courant d’exécution du script. Le résultat de la commande sort dans le fichier $compactresult pour analyse.

add-content $compactinput 'activate instance ntds'
add-content $compactinput 'files'
$compact = 'compact to '+ (get-location).path
add-content $compactinput $compact
add-content $compactinput 'quit'
add-content $compactinput 'quit'
get-content $compactinput | ntdsutil.exe > $compactresult

Si la défragmentation est réalisée avec succès, le fichier $compactresult doit contenir la chaine de caractères “Compaction is successful. You need to:“. Nous devons ensuite purger les logs ADDS et copier la base NTDS compactée dans le dossier contenant la base Jet, pour obtenir ces dossiers il vous suffit de les lire dans le registre du DC. L’ancien fichier NTDS est conservé et renommé en ntds.dit.old dans ce même dossier.

Avant de redémarrer le service NTDS, nous réalisons une analyse d’intégrité de la nouvelle base NTDS.dit compactée, en entrée nous prenons le contenu du fichier $integrityinput et analysons la sortie de $integrityresult:

add-content $integrityinput 'activate instance ntds'
add-content $integrityinput 'files'
add-content $integrityinput 'integrity'
add-content $integrityinput 'quit'
add-content $integrityinput 'quit'
get-content $integrityinput | ntdsutil.exe > $integrityresult

Si l’analyse d’intégrité est réalisée avec succès, le fichier $integrityresult doit contenir la chaine de caractères “Integrity check successful“. Si ce n’est pas le cas, répéter la procédure de défragmentation manuellement en récupérant le fichier ntds.dit.old. De manière générale, en cas de problème, se référer à cet article technet, nous ne faisons que scripter les différentes étapes.

Si tout est OK nous redémarrons le service NTDS, puis attendons que l’événement ci-dessous apparaisse:

Pour cela nous allons utiliser le cmdlet Wait-event, tant que le message du journal Directory Service et d’event ID 1394 n’est pas apparu nous suspendons l’exécution du script. Nous nous inspirons de ce post des Scripting Guy’s:

$QueryString = "SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent' AND TargetInstance.Logfile = 'Directory Service' AND TargetInstance.EventCode = '1394'"
Register-WMIEvent -query $QueryString -sourceIdentifier "AppLogEntry"
$Event = Wait-Event -sourceIdentifier "AppLogEntry" -timeout 90

Le timeout d’attente de cet événement est de 90 secondes, si au bout de ce temps l’évènemment n’apparait pas dans le journal “Directory Service”, alors nous considérons que le service NTDS n’a pas redémarré normalement ($Event.TimeGenerated est nul), se référer alors au chapitre “If errors appear when you restart AD DS“, de l’article technet déjà cité.

Pour télécharger le script complet c’est ici:

Attention: Pour que le script fonctionne correctement vérifiez d’avoir l’espace disque nécessaire: i.e. 2 fois la taille de votre base ADDS dans la partition AD (ntds.dit courant plus ntds.dit.old) plus une autre fois la taille de la base ADDS car celle ci est compactée dans le répertoire courant d’exécution du script. Pour terminer, avant toute défragmentation hors ligne, assurez vous d’avoir un backup fonctionnel de votre DC.

This post is also available in: Anglais

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs