Build HTML reporting

Depuis quelque temps, on voit sur les forums de nombreuses personnes faisant du reporting avec PowerShell en HTML. Effectivement c’est un outil génial et parfaitement adapté pour collecter des données et se fait un monitoring par email.

Dans la pluspart des cas, et c’est pourquoi je publie un billet là dessus, on voit des trucs, bien fait, mais clairement pas pensés objet.

Un exemple de truc pas joli joli…

0..($array0.Count-1) | %{
  $msg.Body += "<BR><FONT COLOR=Black>" + $array0[$_]
  $msg.Body += "</FONT> <FONT COLOR=Black>" + [math]::round(($array2[$_] - $array1[$_]),2)
  $msg.Body += "</FONT> <FONT COLOR=Black>" + $array1[$_]  $msg.Body += "</FONT> <FONT COLOR=Black>" + $array2[$_] + "</FONT>"
  $msg.Body += "</FONT> <FONT COLOR=Black>" + [math]::round(($array2[$_] - $array1[$_]),2) + "</FONT>"
  $msg.Body += " <FONT COLOR=Black>" + [math]::Round((100 * $array1[$i] / $array2[$i]),0)+"$Percent"+"</FONT><BR>"}
}

On sent que y’a une volonté de faire bien, que avec un formattage, mais c’est comme celui de dessous.., il manque quelque chose ! (Même si y’a déjà plus de subtilité!)

 $body = @("
  <center><table border=1 width=60% cellspacing=0 cellpadding=8 bgcolor=Black cols=3>
  <tr bgcolor=White><td>Virtual Machine</td><td>Snapshot</td><td>Size in MB</td></tr>")
   $i = 0
   do {
  if($i % 2){$body += "<tr bgcolor=#D2CFCF><td>$($VMsWithSnaps[$i].VM)</td><td>$($VMsWithSnaps[$i].Name)</td><td>$($VMsWithSnaps[$i].Sizemb)</td></tr>";$i++}

Je dis pas que le code ressortit ne fonctionnera pas ou bien que ça ne sera pas classe, mais clairement c’est pas la méthode la plus simple.

L’équipe qui développe PowerShell nous a mis à disposition un cmdlet vraiment bien fait : ConvertTo-HTML

ConvertTo-HTML

Accordons quelques minutes à la liste des arguments acceptés:

  • Head sera l’entête de votre fichier HTML
  • Title le titre de votre page WEB
  • Body, le corps de votre page web évidement
  • CSSUri un lien pour pointer vers un fichier css
  • Precontent Pour afficher du contenu avant PostContent
  • Fragment qui va vous permettre de faire un
  • As [Table/List] pour sortir une liste ou un tableau , par défaut table est utilisé.
  • Fragment génère suelement un tableau. The HTML, HEAD, TITLE, et BODY balises sont zappées.

Comment utiliser ce cmdlet.

Tout d’abord, il faut construire un objet, A l’aide d’une fonction, je vais construire un objet qui me ressortira des informations sur la configuration de mes nics.

function Get-InfoNIC {
    $Output = @()
    Get-WmiObject -class Win32_NetworkAdapterConfiguration -ErrorAction Silentlycontinue | ? { $_.IpAddress -match "."} | % {
        [String]$IpAddress = $_.IpAddress[0]
        if ($wmi.Version -lt 6) {[String]$IPAddress = $_.IpAddress}
        [String]$SubnetMask = $_.IPSubnet[0]
        if ($wmi.Version -lt 6) {[String]$SubnetMask = $_.IPSubnet}  
        $props = @{'NICName'=$_.ServiceName;
                   'Gateway'=$($_.DefaultIPGateway);
                   'SubNetMask'=$SubnetMask
                   'MACAddress'=$_.MACAddress;
                   'IPAddress'=$IpAddress;
                   'DNSServer'=$($_.DNSServerSearchOrder)}
       $Output += New-Object -TypeName PSObject -Property $props
    }
    $Output
}

Ensuite, je passe cet objet dans la moulinette de ConvertTo-HTML

$NicInfos = Get-InfoNIC |
                ConvertTo-Html -Fragment |
                Out-String

Out-String, va  permettre de réutiliser $NicInfos dans PostContent ou dans un corps de mail.

Et pour finir je constuis la HashTable que je vais faire manger par le ConvertTo-HTML

$PreContent = '<h1><Font color="green">Network configuration for ' + $computer + '</Font></h1>'
$params = @{'Head'="<Title>Report for $computer</title>";
            'PreContent'=$PreContent;
            'PostContent'=$Postcontent}
ConvertTo-Html @params | Out-File -FilePath "C:\temp\$env:computername.html"

Maintenant, un fichier HTML est créé.

Si par exemple vous voulez envoyer le report par mail directement, sans passer par l’envoi de pièce jointe, c’est possible aussi, le corps du message devra être définit en tant que string, et après c’est comme d’hab 😉

$MailBody = ConvertTo-Html @params | Out-String

En espérant que cela vous serve, autant qu’à ceux que j’ai vu sur les forums !

Pour aller plus loin dans la création de reports HTML, je vous conseil l’ebook gratuit réalisé par notre maitre à tous Don Jones, disponible sur le site Powershell.Org qui vous expliquera comment créer des reports utilisant des CSS et bien plus encore. Etant une buse finie en HTML, je vais m’arrêter là !