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

Powershell : repadmin sur tous les DC du domaine

Je vais partager aujourd'hui un snippet qui va me servir de base pour implémenter un contrôle des réplications qui fonctionne aujourd'hui uniquement sur base d'un appel de dcdiag.

Ce snippet récupère donc les contrôleurs de domaine et récupère les timestamp des dernières réplications. Ensuite, pour chaque DC, il affiche en vert celles qui date de moins d'une heure et en rouge celles qui datent de plus d'une heure.

$dc = (Get-AdDomain).ReplicaDirectoryServers
$csvpath = "C:\temp\replications.csv"
$dc | Foreach { 
	if(Test-Path $csvpath) { Remove-Item $csvpath }
	Add-Content -Path $csvpath -Value (repadmin /showrepl $_ -csv)
	$csvcontent = Import-CSV $csvpath
	Write-Host -ForegroundColor Cyan `r`n$_
	$csvcontent | foreach {
        if(([datetime]$_.'Last Success Time').AddHours(1) -gt (Get-Date)) { Write-Host -ForegroundColor Green ($_.'Source DSA')($_.'Naming Context')($_.'Last Success Time') }
        else {  Write-Host -ForegroundColor Red ($_.'Source DSA')($_.'Naming Context')($_.'Last Success Time') }
    }
} 
if(Test-Path $csvpath) { Remove-Item $csvpath }

Si, au départ, je pensais avoir à manipuler le texte renvoyé par la commande pour extraire les bonnes informations, la commande repadmin avec l'argument showrepl accepte le paramètre -csv pour réaliser un export qui est ensuite facilement interprétable par Powershell.

Vous pouvez trouver toute la documentation nécessaire à l'utilisation de la commande repadmin sur le site de Microsoft.

Exchange et Powershell : uniformisation des adresses mail

Ce script Powershell récupère la liste des mailbox présentes pour les utilisateurs membres de l'OU spécifiée et ajoute comme adresse mail principale une adresse au format prenom.nom@domaine.tld.

Ce script permet donc d'uniformiser les adresses mail en gérant les divers caractères spéciaux et accents, tout en conservant les anciennes adresses qui peuvent servir comme alias, évitant d'avoir à communiquer par rapport à sa nouvelle adresse.

function process {
	Param([string] $name)
	$specials = @("- '","âä","éèëê","ïîì","ôö","üûù","ÿ")
	for($i=0; $i -lt $specials.Length; $i++) {
		for($j=0; $j -lt $specials[$i].Length; $j++) {
			switch($i) {
				"0" { $l = "" }
				"1" { $l = "a" }
				"2" { $l = "e" }
				"3" { $l = "i" }
				"4" { $l = "o" }
				"5" { $l = "u" }
				"6" { $l = "y" }
			}
			$name = $name.Replace(($specials[$i].SubString($j,1)),$l)
		}
	}
	return $name
}
 
$mailboxes = Get-Mailbox | Where-Object { $_.OrganizationalUnit -like "dundermifflin.inc/USERS/*"}
foreach ($mailbox in $mailboxes) {
	$adUser = Get-AdUser $mailbox.Name
	$newsmtp = ((process($adUser.GivenName))+"."+(process($adUser.Surname))).ToLower()+"@dundermifflin.inc"
	Set-Mailbox $mailbox -PrimarySmtpAddress $newsmtp
}

Comme toujours, vous pouvez télécharger le script dans une version commentée grâce au lien suivant.