Reporting Exchange 2007

Le couple Exchange 2007 et Powershell fonctionne très bien, voir est même indispensable pour certaines actions (par exemple, pas d’interface graphique pour gérer les permissions clients d’un dossier public…)

On peut aussi se servir de Powershell pour effectuer plein de tâches d’administration, et même de reporting.

Par exemple, sur Exchange 2003, si on voulait récupérer un listing de la taille réelle consommée des BAL de certains utilisateurs ainsi que de leur quota, il fallait passer par 2 actions, une qui récupérait la taille réelle consommée (requête WMI) et une qui récupérait le quota (requête LDAP par exemple) et il fallait croiser le tout via un critère commun (prenons par exemple le samAccountName).

Cela marchait, mais c’était loin d’être léger en terme d’exécution, surtout sur une grosse infrastructure.

Sur Exchange 2007, on peut utiliser Powershell pour faire cela. Et dans ce cas, le même résultat est atteint avec une seule ligne de code. Bon certes, la ligne est assez complexe, mais ça démontre quand même les possibilités de Powershell.

Voici par exemple un script que l’on utilise pour faire un reporting BAL utilisateur sur une plateforme Exchange 2007 / HMC 4.5

# Reporting total des mailbox
# Export au format csv des fichiers reporting
#

# Anciennes variables pour export CSV
$rootPath = "D:\Reporting\MailboxFull\"
$cheminCSV = $rootPath + "ReportingMailboxFull+" + $dateExport + ".csv"
$dateExport = Get-Date -uformat "%Y%m%d%H00"
$SMTPSRV = "xxx"
$EmailFrom = "administrator@xxx"
$EmailTo = "administrator@xxx"

# Fonction d'envoi de mail
function Send-SMTPmail($to, $from, $subject, $smtpserver, $body) {
	$mailer = new-object Net.Mail.SMTPclient($smtpserver)
	$msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body)
	$msg.IsBodyHTML = $false
	$mailer.send($msg)
}

# Récupération des infos de BAL
$dataMailbox = Get-Mailbox -ResultSize Unlimited | where { $_.OrganizationalUnit -ne "xxx/Users" -AND $_.OrganizationalUnit -notlike "xxx/ServiceAccounts/*" -AND $_.OrganizationalUnit -notlike "xxx/Hosting/xxx/Recette*" } | Select-Object DisplayName,Name,samAccountName, @{Name="Revendeur";Expression={$_.OrganizationalUnit.Split("/")[2]}}, @{Name="Client";Expression={$_.OrganizationalUnit.Split("/")[3]}}, @{Name="Forfait";Expression={if($_.ProhibitSendQuota -ge 500MB){"PCWEB" + $_.ProhibitSendQuota}Else{"POP" + $_.ProhibitSendQuota}}}, @{Name="WhenCreated";Expression={Get-Date $_.WhenCreated -Format d}},@{Name="TailleMB";Expression={if($stats=(Get-MailboxStatistics $_ -WarningAction SilentlyContinue)){($stats.TotalItemSize.Value.ToMB()+1)}Else{"0"}}}, serverName

# Export en CSV
#$dataMailbox | Export-Csv -NoTypeInformation -Encoding UTF8 -Path $cheminCSV -Delimiter ";"

# Export en base SQL
$connexionSQL = New-Object System.Data.SqlClient.SqlConnection("Data Source=xxx;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;pwd=xxx")
$connexionSQL.Open()
$cmd = $connexionSQL.CreateCommand()
$dataMailbox | ForEach-Object {
	$tmpDate = $dateExport
	$tmpDate = $tmpDate.Insert(10,":")
	$tmpDate = $tmpDate.Insert(8," ")
	$tmpDate = $tmpDate.Insert(6,"-")
	$tmpDate = $tmpDate.Insert(4,"-")
	$cmd.CommandText ="INSERT INTO xxx (dateStat, displayName, userPrincipalName, samAccountName, revendeur, client, forfait, whenCreated, tailleMB, serverName) VALUES ( '" + $tmpDate + "', '" + $_.DisplayName.Replace("'","''") + "', '" + $_.Name + "', '" + $_.samAccountName + "', '" + $_.Revendeur + "', '" + $_.Client + "', '" + $_.Forfait + "', '" + (Get-Date($_.WhenCreated)) + "', '" + $_.TailleMB + "', '" + $_.serverName + "')"
	$cmd.ExecuteNonQuery()
	$cmd.CommandText
}

$connexionSQL.Close()

# Si erreur, on envoi un mail
if ($tmpErr) { Send-SMTPmail $EmailTo $EmailFrom "[ERR] reportingMailboxFull $dateExport" $SMTPSRV $tmpErr }

Je le détaillerai un peu plus tard (surtout la ligne de récupération d’info Exchange en fait, le reste est assez simple).

Laisser un commentaire

Required fields are marked *.