Avec le temps, un ActiveDirectory peut contenir de plus en plus d’OU ne contenant aucun objet, car ceux-ci ont été déplacés ailleurs ou il s’agit tout simplement d’un reliquat. Le script Powershell suivant parcourt l’annuaire et liste les OU qui ne contiennent aucun objet pour ensuite en faire un fichier CSV à l’emplacement spécifié par l’utilisateur.
A noter que les OU ont eu leur chemin inversé, c’est à dire que plutôt que de commencer à l’OU pour aller vers la racine du domaine, le script écrit dans le fichier CSV le nom en commençant par la racine du domaine ; cela permet une fois que la conversion CSV > tableau est réalisée, de pouvoir trier et lire plus facilement les chemins vers les OU.
Par exemple, au lieu d’avoir un tableau comme ceci :
On obtient ceci, plus exploitable et compréhensible car on reprend le chemin qui sera parcouru dans la console pour retrouver l’OU en question :
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$fileExpl = New-Object System.Windows.Forms.SaveFileDialog
$fileExpl.ValidateNames = $true
$fileExpl.CreatePrompt = $false
$fileExpl.OverwritePrompt = $true
$fileExpl.RestoreDirectory = $false
$fileExpl.InitialDirectory = "$env:userprofile"
$output = @()
$OUs = Get-ADOrganizationalUnit -filter * | select DistinguishedName
foreach ($OU in $OUs){
$OUObjects = Get-ADObject -Filter * -SearchBase $OU.DistinguishedName -SearchScope OneLevel
if($OUObjects -eq $null){
$emptyOU = New-Object PSCustomObject
$emptyOU | Add-Member -Name "DN" -Value $OU.DistinguishedName -MemberType NoteProperty
$output+=$emptyOU
}
}
$fileExpl.DefaultExt = "csv"
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty OU list to CSV file"
$fileExpl.Filename = "emptyOU.csv"
$fileExpl.ShowDialog() | out-null
if($fileExpl.Filename -ne "") {
$output | Export-CSV $fileExpl.Filename -Encoding UTF8
}