Exchange et Powershell : définition de quotas en envoi et réception

Ayant récemment défini des quotas concernant la taille des mails en envoi et en réception afin de séparer une population standard et une population VIP, j'ai développé un script afin de traiter la population standard composée de plusieurs centaines de boîtes aux lettres.

La règle de transport posant la limite maximale, aucune boîte aux lettres n'avait de limite fixée individuellement. Ce script applique une règle de 10 Mo pour ces boîtes.

$UnltdMbx = Get-Mailbox -ResultSize unlimited | Where-Object { $_.MaxSendSize -eq "unlimited" -and $_.MaxReceiveSize -eq "unlimited" }
$UnltdMbx | % {
	echo $_.Alias
	Set-Mailbox $_ -MaxSendSize 10MB -MaxReceiveSize 10MB
}

Ensuite, si nécessaire, il faut ajuster la configuration globale du transport. Ici, la limite sera de 20 Mo.

Set-TransportConfig -MaxReceiveSize 20MB -MaxSendSize 20MB

De même, il est nécessaire de vérifier les tailles limites spécifiées dans les connecteurs et liens AD si nécessaire :

Get-ReceiveConnector | Set-ReceiveConnector -MaxMessageSize 20MB
Get-SendConnector | Set-SendConnector -MaxMessageSize 20MB
Get-ADSiteLink | Set-ADSiteLink -MaxMessageSize 20MB

En exécutant ces commandes, je permets donc aux utilisateurs standard d'envoyer ou recevoir des mails pesant jusqu'à 10 Mo, et aux utilisateurs n'ayant aucune limite de configurée d'envoyer ou recevoir des mails jusqu'à 20 Mo.

Plusieurs choses tout de même à retenir de cela :

  • La règle de transport sera toujours prioritaire sur un quota défini au niveau d'une mailbox.
  • Mettre un quota trop élevé peut se révéler contre-productif, puisque les serveurs de messagerie sont globalement configurés pour recevoir ou émettre des mails de 20 ou 30 Mo maximum. Si les mails sont trop volumineux en sortie, les destinataires ne les recevront jamais, soit bloqués par une solution anti-spam ou bien par le serveur de messagerie lui-même !
  • Les clients de messagerie ainsi que les quotas de boîte affectés ne sont pas conçus pour recevoir des mails de 50 Mo ou plus... il est bien important de s'assurer du bon dimensionnement des serveurs de mailbox et des quotas avant d'autoriser tout un chacun à envoyer des mails volumineux, bien que ça ne soit pas nécessairement une action courante... De nombreux systèmes existent de nos jours pour partager des fichiers lourds en passant simplement par un lien envoyé dans un mail ne contenant que du texte !

Naturellement, avant une application sur un environnement de production, il sera intéressant de tester sur un environnement de recette car l'on touche bien plus qu'un simple serveur de messagerie... Il est possible qu'il ait des effets de bord sur toute la chaîne de messagerie (relai SMTP, solution antispam / antivirus, liens réseau, stockage...)

Powershell : liste des serveurs sur lesquels un user est connecté

J'ai eu un incident concernant un lock de compte AD récurrent sur diverses stations. Afin de pouvoir déterminer sur quels serveurs était connecté ce login, j'ai développé un script Powershell qui parcourt un fichier CSV contenant une liste de serveurs (facilement générable à partir de l'ActiveDirectory).

Le script utilise l'application CLI win32 quser et prend en paramètre un nom de login d'utilisateur.

param([Parameter(Mandatory=$true)][string]$Login)
$serverlist = Import-CSV server-list.csv
foreach($server in $serverlist) {
	$qo = quser /server:$($server.Name) 2>$null
	if($qo -ne $null){
		$qo | foreach {
			if($_.Contains($Login)){
				Write-Host "Logged in on $($server.name)" -ForegroundColor "Green"
			}
		}
	}
}

Powershell : liste des entrées DNS sans reverse

Ce script permet d'afficher la liste des enregistrements DNS "A" d'une zone qui n'ont pas d'enregistrements reverse DNS (PTR). Après affichage des enregistrements, un export CSV est réalisé permettant une exploitation plus simple dans Excel ou simplement une injection dans un autre script.

param([Parameter(Mandatory=$true)][string] $Zone, [Parameter(Mandatory=$true)][string] $DNSHost)

$records = Get-DnsServerResourceRecord -Computer $dnshost -ZoneName $zone -RRtype "A"
$output = @()
foreach($record in $records){
	$ipStr = $record.RecordData.IPv4Address.ToString()
	$ipB1 = $ipStr.SubString(0,$ipStr.IndexOf("."))
	$ipstr = $ipstr.SubString(($ipB1.Length)+1,($ipstr.Length-$ipB1.Length)-1)
	$ipB2 = $ipStr.SubString(0,$ipStr.IndexOf("."))
	$ipstr = $ipstr.SubString(($ipB2.Length)+1,($ipstr.Length-$ipB2.Length)-1)
	$ipB3 = $ipStr.SubString(0,$ipStr.IndexOf("."))
	$ipstr = $ipstr.SubString(($ipB3.Length)+1,($ipstr.Length-$ipB3.Length)-1)
	$ipB4 = $ipStr.Substring(0,$ipStr.Length)
	$zoneptr = $record.RecordData.IPv4Address.ToString().SubString(0,$ipB1.Length)+".in-addr.arpa"
	if($ipB1 -ne $lastzone) { $recptr = Get-DnsServerResourceRecord -Computer $dnshost -ZoneName $zoneptr }
    $lastzone = $ipB1
	$ipptr = $ipB4+"."+$ipB3+"."+$ipB2
	if(($recptr | Where-Object { $_.HostName -like $ipptr }) -eq $null) { 
		Write-Host $record.HostName";"$record.RecordData.IPV4Address 
		$noptr = New-Object PSCustomObject
		$noptr | Add-Member -Name "Hostname" -Value $record.HostName -MemberType NoteProperty
		$noptr | Add-Member -Name "IPV4Address" -Value $record.RecordData.IPV4Address -MemberType NoteProperty
		$output+=$noptr
		}
}
$output | Export-CSV DNSnoPTR.csv -Encoding UTF8

Le script prend en paramètre ZoneName le nom de la zone DNS que l'on souhaite scanner et DnsHost le nom du serveur DNS qui renverra les enregistrements. Le script pourra donc être appelé de cette manière :

.\win_dnsnoptr.ps1 -Zone intra.dundermifflin.inc -DNSHost dc01

Comme toujours, le script avec quelques commentaires est disponible en téléchargement.

Powershell : affichage de la taille de répertoires

M'occupant de migrer des serveurs de fichiers vers des versions plus récentes de Windows et ayant conçu un nouveau "design" de ceux-ci, j'ai développé un script Powershell qui fait +/- le même travail que l'application TreeSize. L'avantage est que ce script peut appeler des répertoires réseau, ce que ne permet pas l'application dans sa version gratuite.

Ce script peut-être une bonne base pour être amélioré ensuite pour n'afficher que les répertoires plus gros qu'une taille spécifiée. Il est également aisé de faire un export CSV des valeurs retournées (il suffira de piper $results avec un Export-CSV).

param([string]$path)
$tierone = Get-ChildItem $path -Directory
$results = @()
foreach($toneitem in $tierone){
	$size = 0
	$tiertwo = Get-ChildItem $toneitem.FullName -Recurse -File | select Name, Length
	foreach($ttwoitem in $tiertwo){
		$size += $ttwoitem.Length   
	}
    $size = [math]::Round($size/1048576,0)
	$pso = New-Object PSCustomObject
	$pso | Add-Member -Name "Name" -Value $toneitem.Name -MemberType NoteProperty
	$pso | Add-Member -Name "Size (M)" -Value $size -MemberType NoteProperty
	$results+=$pso
}
$results

Ce script me permet donc de visualiser rapidement la taille des répertoires principaux d'une arborescence, et de pouvoir redistribuer plus efficacement ces répertoires sur des disques d'une taille plus petite.

Une version du script avec des commentaires est disponible.