Exchange et Powershell : listes de distribution et propriétaires

Ce script permet de lister l’intégralité des listes de distribution et leur propriétaire (attribut-objet ManagedBy) pour en faire un export CSV.

Si cela peut paraître simple de prime abord, il est nécessaire de traiter l’objet ManagedBy en faisant un cast en chaîne de caractères car il n’est pas possible d’accéder directement aux propriétés de l’objet. En le convertissant en chaîne de caractères, on peut ensuite manipuler le CanonicalName qu’il contient pour garder uniquement le nom de l’utilisateur.

$Output=@()
$DistList = Get-DistributionGroup -Result unlimited | Select Name, ManagedBy
foreach($Dist in $DistList){
	$object = New-Object PSCustomObject
	$object | Add-Member -MemberType NoteProperty -Name "Name" -Value $Dist.Name
	$ManBy = [string]$Dist.ManagedBy
	$object | Add-Member -MemberType NoteProperty -Name "Owner" -Value ($ManBy | ForEach { $_.Split("/")[-1] })
	$Output+=$Object
} 
$Output | Export-CSV DistributionGroupsOwners.csv -Encoding UTF8

Powershell : suppression d’enregistrements DNS depuis un import CSV

Ce snippet permet de supprimer les enregistrements DNS à partir d’une liste au format CSV passée en paramètre.

Le script sera appelé de cette manière :

.\win_dns-deletion.ps1 -zone superdomaine.local -csv exportdns.csv

Seuls les enregistrements de type A sont supprimés par ce code ; le paramètre peut se modifier pour cibler un autre type. Par défaut, la commande demande confirmation avant suppression ; le paramètre -Force permet de passer outre cette confirmation. Attention au moment d’exécuter le script.

param([string]$zone, [string]$csv)
 $records = Import-CSV $csv
 foreach($record in $records){
     Remove-DnsServerResourceRecord -ZoneName $zone -RRType "A" -Name $record.Name -Force
 }

Powershell : liste des groupes vides et export CSV

Afin de compléter le script que j’ai proposé dans l’article hier permettant de lister les OU vides, j’ai conçu un script effectuant le même travail mais pour des groupes. Seule la requête à l’AD est différente.

Il est possible que le script renvoie des erreurs si il tente d’interroger un groupe dont il y a un membre qui n’est pas membre du domaine local mais membre d’un domaine approuvé ; c’est la commande Get-AdGroupMember qui la renvoie mais cette erreur n’a aucune incidence sur le traitement du script.

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 = @()

$AllGroups = Get-AdGroup -filter * | select SamAccountName,DistinguishedName
foreach ($Group in $AllGroups){
    if((Get-ADGroupMember $Group.SamAccountName).Count -eq 0){
        $emptyGrp = New-Object PSCustomObject
		$emptyGrp | Add-Member -Name "DN" -Value $Group.SamAccountName -MemberType NoteProperty
		$output+=$emptyGrp
    }
}

$fileExpl.DefaultExt = "csv"
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty groups list to CSV file"
$fileExpl.Filename = "emptygrp.csv"
$fileExpl.ShowDialog() | out-null
if ($fileExpl.Filename -ne "") {
	$output | Export-CSV $fileExpl.Filename -Encoding UTF8
}

Powershell : liste des OU vides et export CSV

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
}