Exchange et Powershell : volumétrie des mails

Ce script à exécuter dans l'Exchange Management Shell qui prend pour paramètre un nombre de jours calcule grâce au tracking logs le nombre de mails qui ont été envoyés hors du domaine spécifié et reçus par un expéditeur hors du domaine, afin de pouvoir calculer une taille totale et une moyenne.

param([Parameter(Mandatory=$true)][int] $Days)
$today = (Get-Date)
$TrxS = Get-MessageTrackingLog -EventID "SEND" -Start $today.AddDays(-$Days) -End $today -ResultSize 5000
$TrxD = Get-MessageTrackingLog -EventID "DELIVER" -Start $today.AddDays(-$Days) -End $today -ResultSize 5000
$FltS = $TrxS | Where-Object { $_.Recipients -notmatch "@dundermifflin.inc"}
$FltD = $TrxD | Where-Object { $_.Sender -notmatch "@dundermifflin.inc" }
$FltS | foreach { $SendSize += $_.TotalBytes }
$FltD | foreach { $DelSize += $_.TotalBytes }
Write-Host "Total messages sent:"$FltS.Count
Write-Host "Total sent bytes:"$SendSize" ("([math]::Round($SendSize/1024/1024,1))"MB )"
Write-Host "Average sent message size (KB):"([math]::Round(($SendSize/$FltS.Count)/1024,1))`r`n
Write-Host "Total messages received:"$FltD.Count
Write-Host "Total received bytes:"$DelSize" ("([math]::Round($DelSize/1024/1024,1))"MB )"
Write-Host "Average received message size (KB):"([math]::Round(($DelSize/$FltD.Count)/1024,1))

Blocage de libwidevinecdm.dylib par Gatekeeper sous macOS Catalina

J'ai upgrade mon MacBook Air de 2018 vers OS X 10.15 Catalina dès que celui-ci était disponible. Si je n'ai pas eu de casse particulière à part le fameux bug de setup post-installation, je me suis aperçu que certains sites de streaming ne fonctionnaient plus correctement sous Safari : en effet, sur myCanal ou Amazon Prime Video par exemple, le son est bien diffusé mais pas la vidéo, ce qui est plutôt contraignant.

En passant par Firefox, je suis confronté à un message d'erreur m'indiquant que la librairie libwidevinecdm.dylib est bloquée car elle ne provient pas d'un développeur identifié par Apple (comprendre qu'elle ne provient pas du Mac App Store et que son développeur n'a pas payé sa taxe à Apple, le parallèle peut être fait avec les drivers pour Windows qui ne sont pas signés).

Pourtant, sur mon installation précédente de Mojave (je n'ai pas procédé à une clean install), j'avais réduit la sécurité de Gatekeeper afin qu'il soit un peu plus lâche concernant la sécurité des applications tierces. En me rendant dans les préférences systèmes et les options de Gatekeeper, celui-ci n'a pas changé.

Il semblerait qu'avec Catalina, Apple ait renforcé Gatekeeper car du coup il bloque la librairie en question. Si pour un exécutable, il est possible de forcer Gatekeeper à accepter le lancement de ce dernier en restant appuyé sur la touche majuscule au moment du double clic (si ma mémoire est bonne !), pour une librairie ou autre composant téléchargé via une application cela n'est pas possible. Il est donc nécessaire de l'autoriser dans les préférences systèmes. Ensuite, de retour sur la vidéo, je peux confirmer l'exécution de ladite librairie.

La vidéo apparaît ensuite correctement et je peux enfin profiter des plateformes de streaming sur le Mac.

Il ne reste plus qu'à espérer qu'un correctif pour Safari arrive prochainement car cette solution ne fonctionne que pour Firefox et les navigateurs utilisant cette librairie (par exemple, Chromium).

Création d'un custom attribute dans ActiveDirectory

La création d'un custom attribute dans ActiveDirectory est une opération nécessitant de modifier le schéma. Une réflexion est nécessaire en amont car il n'est pas possible de supprimer un custom attribute une fois que celui-ci a été écrit dans le schéma.

Si votre infrastructure comporte un serveur Exchange par exemple, alors votre AD contient déjà des attributs personnalisés. En effet, lors de l'installation, Exchange modifie le schéma pour y ajouter ses custom attributes lui permettant de stocker des informations dont il a besoin.

Dans cet exemple, je vais créer un custom attribute nommé CreatedBy permettant de stocker dans une chaîne de caractères le nom de l'utilisateur qui procède à la création d'un objet.

Il est nécessaire de faire partie du groupe Schema Admins pour pouvoir créer un custom attribute, le groupe Domain Admins n'est pas suffisant.

Se connecter à un serveur en RDP, puis ouvrir une console MMC vide, et y ajouter le snap-in Active Directory Schema (File > Add/Remove Snap-in). Si celui-ci n'apparaît pas, il faut alors l'enregistrer ; dans une invite de commande, saisir ceci :

regsvr32.exe schmmgmt.dll

Normalement, la MMC doit donc ressembler à ceci :

En faisant un clic droit sur Attributes puis Create Attribute, un message apparaît indiquant que la création d'un attribut personnalisé est irrémédiable ; on arrive ensuite sur une fenêtre avec plusieurs détails à remplir.

  • Le Common Name est le nom que l'on souhaite donner à son attribut ;
  • Le LDAP Display Name est le nom LDAP, c'est celui-ci qui apparaîtra lors de requêtes LDAP directes ou via Powershell par exemple, ou encore dans l'ADSI Edit ;
  • Le Unique X500 Object ID est un identifiant qui doit être généré en fonction du domaine, je vais venir sur ce point juste après ;

Ensuite, en fonction du type de données que l'on souhaite stocker dans cet attribut, il faut choisir une syntaxe. Celle-ci peut être un booléen, une chaîne de caractères, un entier, etc.

Le point le plus sensible lors de la création de l'attribut est la génération de l'identifiant unique X500. En effet, cet identifiant est basé sur une suite de chiffres qui est unique par domaine. Il n'est donc pas possible d'en choisir un au hasard. Microsoft propose ce script VBS permettant de récupérer la racine de l'identifiant unique, à laquelle on rajoutera par exemple un incrément. Par exemple, si l'OID retourné par le script se finit en 4941237, l'identifiant unique pourra finir par 4941237.1. De nombreux topics d'aide sont disponibles sur le technet en cas d'incompréhension sur ce point.

Une fois l'attribut créé, il faut le rattacher à une classe (plus communément type d'objet). Dérouler les classes, puis dans le cadre de l'exemple, ouvrir les propriétés de la classe user d'un clic-droit > Properties. Ensuite, dans l'onglet Attributes, il est possible d'ajouter l'attribut que nous venons de créer, et de définir si il est obligatoire ou optionnel.

Appliquer, la création du custom attribute et son rattachement aux objets de type user est terminée. On peut ensuite requêter via Powershell l'AD par exemple sur cet attribut :

Powershell : extraction des adresses du champ "To" d'une entête SMTP

J'ai développé en Powershell un script permettant d'extraire les adresses mail d'une en-tête SMTP. Mon but était de récupérer dans un fichier CSV une liste d'adresses pour effectuer sur ces adresses un traitement supplémentaire.

Dans Outlook, il suffit donc d'ouvrir l'entête SMTP du mail en question, de copier-coller le champ "To" dans un fichier texte et de le passer en paramètre lors de l'exécution du script pour obtenir la liste des adresses dans l'output console Powershell ainsi que dans le fichier CSV passé en paramètre. On peut donc l'appeler ainsi :

.\regex-to-smtp-header.ps1 -Header to.txt -CsvOutput addresses.csv

Voici le script, la version commentée est disponible après celui-ci.

param([Parameter(Mandatory=$true)][string]$Header, [Parameter(Mandatory=$true)][string]$CsvOutput)
$CsvExport = @()
$smtpheader = Get-Content -Path $Header -Raw -ErrorAction stop
while($smtpheader.IndexOf("<") -ne -1) {
    $ls = $smtpheader.IndexOf("<")
    $rs = $smtpheader.IndexOf(">")
    $adrlgt = $rs-$ls
    $adr = $smtpheader.SubString(($ls+1),($adrlgt-1))
    echo $adr
    $adrcsv=@{Address=$adr}
    $adrexp = New-Object PSObject -Property $adrcsv
    $CsvExport+=$adrexp
    $smtpheader = $smtpheader.Substring($rs+1,(($smtpheader.Length-$rs)-1))
}
$CsvExport | Export-CSV $CsvOutput -NoTypeInformation