Cette page wiki ressence toutes les étapes d'installation, de debug ou autres problèmes rencontrés sur l'environnement Exchange.
La première étape consiste à mettre à jour le serveur Exchange vers le dernier CU. Pour cela, téléchargez le dernier CU Exchange 2013 (voir liste CU Exchange 2013). Attention à télécharger le dernier CU et non le dernier patch.
Voici la différence
❌
Il suffit de lancer l'exécutable, et de patienter jusqu'à la fin de la mise à jour. La mise à jour peut durer plusieurs heures (environ 1h en temps normal).
La première étape consiste à importer un certificat publique sur le serveur Exchange (ou sur les serveurs dans le cas d'un DAG), pour cela, vous devrez disposer d'un certificat avec une extension en .pfx. Une fois le certificat exporté, ouvrez une nouvelle fenêtre Exchange Management Shell, puis exécutez la commande suivante :
Import-ExchangeCertificate -FileData ([System.IO.File]::ReadAllBytes('D:\certificates\exchange\SelfSignedUMCert.pfx')) -Password:(Get-Credential).password
Une fois le certificat importé, nous allons devoir le rajouter sur les URL.
Pour configurer les URL, vous pouvez utiliser le script suivant, attention à bien modifier les variables au début. Pour appliquer le certificat importé précédemment, vous devrez récupérer en avance le Thumprint.
Pour récupérer le Thumbprint , vous pouvez utiliser cette commande : Get-ExchangeCertificate | Select-Object Subject,Status,Thumbprint
# Définition des variables
$server = "VotreNomDeServeur"
$webmail = "https://webmail.votreDomaine.com"
$autodiscover = "https://autodiscover.votreDomaine.com/Autodiscover/Autodiscover.xml"
$certificat = "ThumbprintDuCertificat"
# Modification des URLs
Set-owaVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalUrl "$webmail/owa" -ExternalUrl "$webmail/owa"
Set-EcpVirtualDirectory -Identity "$server\ecp (Default Web Site)" -InternalUrl "$webmail/ecp" -ExternalUrl "$webmail/ecp"
Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalUrl "$webmail/Microsoft-Server-ActiveSync" -ExternalUrl "$webmail/Microsoft-Server-ActiveSync"
Set-OabVirtualDirectory -Identity "$server\oab (Default Web Site)" -InternalUrl "$webmail/oab" -ExternalUrl "$webmail/oab"
Set-ClientAccessService -Identity "$server" -AutodiscoverServiceInternalURI "$autodiscover"
Set-WebServicesVirtualDirectory -Identity "$server\ews (Default Web Site)" -InternalUrl "$webmail/ews" -ExternalUrl "$webmail/ews"
Set-MapiVirtualDirectory -Identity "$server\mapi (Default Web Site)" -InternalUrl "$webmail/mapi" -ExternalUrl "$webmail/mapi"
# Activer les services du certificat
Enable-ExchangeCertificate -Thumbprint $certificat -Services 'SMTP, IMAP, POP, IIS'
Une fois les URLs de l'Exchange vérifié et les certificats appliqués, il suffit de créer une synchronisation AD Connect entre les utilisateurs et Microsoft 365. Attention, si un utilisateur n'est pas synchronisé, celui-ci ne pourras pas être migré !
Lorsque l'on tente de se connecter à l'OWA où l'ECP, nous pouvons avoir l'erreur suivante apparaître :
Sur ce même serveur, lorsque nous tentons de se connecter avec l'interface administrateur en local, nous pouvons avoir une erreur similaire :
Pour résoudre ce problème, il suffit d'effectuer la manipulations suivantes :
Récupérer le Thumprint du certificat utilisé avec la commande suivante :
Get-ExchangeCertificate
Une fois le Thumprint récupéré, il suffit d'éxécuter les commandes suivantes :
Set-AuthConfig -NewCertificateThumbprint "Thumprint du certificat" -NewCertificateEffectiveDate (Get-Date)
Set-AuthConfig -PublishCertificate
Set-AuthConfig -ClearPreviousCertificate
iisreset
Pour vérifier le statut de votre certificat OAuth existant, exécutez la commande suivante dans Exchange Management Shell :
(Get-AuthConfig).CurrentCertificateThumbprint | Get-ExchangeCertificate | Format-List
Créez un certificat OAuth en exécutant la commande suivante :
New-ExchangeCertificate -KeySize 2048 -PrivateKeyExportable $true -SubjectName "cn=Microsoft Exchange Server Auth Certificate" -FriendlyName "Microsoft Exchange Server Auth Certificate" -DomainName @()
Définissez le nouveau certificat pour l’authentification du serveur. Pour ce faire, exécutez les commandes suivantes :
Set-AuthConfig -NewCertificateThumbprint <Thumbprint> -NewCertificateEffectiveDate (Get-Date)
Set-AuthConfig -PublishCertificate
Set-AuthConfig -ClearPreviousCertificate
iisreset
Lors de la mise à jour où la désinstallation de l'Exchange, il est possible qu'une erreur de certificat apparaisse. Pour cela il suffit de lancer un utilitaire Microsoft qui permettra de résoudre ce problème .

Utilitaire de résolution des problèmes
Une fois exécuté, cliquez sur “Désinstallation” dans le cas d'une désinstallation ou d'une mise à jour. Sélectionnez ensuite le pack de langue concerné puis cliquez sur “Suivant” puis “Terminer”.
Avant de décommissionner un Exchange, il faut s'assurer qu'aucuns mails ne transitent sur l'Exchange, pour cela, il suffit d'exécuter la commande suivante depuis le cmdlet Exchange :
Get-MessageTrackingLog -Start (Get-Date).AddDays(-10) -End (Get-Date) -ResultSize Unlimited | Where-Object {$_.EventId -eq "DELIVER" -or $_.EventId -eq "SEND"} | Select-Object Timestamp, Source, EventId, MessageSubject, Sender, Recipients
La première étape consiste à sauvegarder les ProxyAddresses de tous les utilisateurs, cela arrive que l'Exchange supprime les attributs ProxyAddresses des utilisateurs ayant une adresse mail. Si vous n'avez pas d'Hybridation et que les ProxyAddresses ne sont pas utilisés, vous n'avez pas nécessairement besoin de sauvegarder les attributs. Pour cela, éxecutez le script suivant :
ipmo activedirectory
cls
cd C:\
$contactou = "OU=users ,DC=mondomaine,DC=intra"
$datesuffix = get-date -Format yyy-MM-dd_HHmmss
$allcontacts = get-adobject -filter {objectclass -eq "user" } -searchbase $contactou -property DistinguishedName,ObjectGUID,proxyaddresses
$allcontacts | select DistinguishedName,ObjectGUID,@{Name='proxyAddresses';Expression={[string]::join(";", $($_.proxyAddresses))}} | export-csv -delimiter ";" -notype alldominocontacts_$($datesuffix).csv
Write-Host "-----------------"
Write-Host "Export termine"
Une fois les attributs sauvegardés, il faut désactiver la synchronisation afin d'éviter tout problèmes :
Set-ADSyncScheduler -SyncCycleEnabled $False
Nous allons ensuite passer aux étapes de désinstallation de l'Exchange avec des commandes Powershell :
Etape 1 : Activer la visibilité de tous les objets de l'AD
Set-ADServerSettings -ViewEntireForest $true
Etape 2 : Supprimer toutes les move request :
Get-MoveRequest | Remove-MoveRequest -Confirm:$false
Etape 3 : Supprimer les import/export :
Get-MailboxImportRequest | Remove-MailboxImportRequest -Confirm:$false
Get-MailboxExportRequest | Remove-MailboxExportRequest -Confirm:$false
Si la commande n'est pas recconu, il suffit de ce donner les droits admin import/export et de relancer l'Exchange Management Shell : New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "DOMAINE\User"
Etape 4 : Supprimer les Offline Address Book :
Get-OfflineAddressBook | Remove-OfflineAddressBook -Confirm:$false
Etape 5 : Désactiver les boites aux lettres (attention, une suppression entraine la suppression dans l'AD, le therme adéquat est “désactiver”) :
Get-Mailbox -ResultSize Unlimited | Disable-Mailbox -Confirm:$false
Get-Mailbox -ResultSize Unlimited -Archive | Disable-Mailbox -Confirm:$false
Get-Mailbox -ResultSize Unlimited -PublicFolder | Disable-Mailbox -Confirm:$false
Get-Mailbox -AuditLog | Disable-Mailbox -Confirm:$false
Get-Mailbox -Arbitration | Disable-Mailbox -Arbitration -DisableLastArbitrationMailboxAllowed -Confirm:$false
Si vous rencontrez une erreur lors de la suppression d'une boîte aux lettres d'arbitration, vous pouvez supprimer la boite aux lettres depuis l'Active Directory pour régler le problème.
Etape 6 : Supprimer les Bases de Données
Get-MailboxDatabase | Remove-MailboxDatabase -Confirm:$false
Vous pouvez ensuite désinstaller l'Exchange depuis le panneau de configuration
Pensez à rétablir les ProxyAddresses si ceux-ci ont étés supprimés avec le script suivant :
cls
$contactou = "OU=users ,DC=mondomaine,DC=intra"
cd C:\
Import-Csv "alldominocontacts.csv" -delimiter ";" | ForEach-Object{
$guid = $_.ObjectGUID
$proxyAddresses = $_.proxyaddresses -split ';'
$find = Get-ADObject -filter {(objectGUID -eq $guid)} -searchbase $contactou -Properties Name,ProxyAddresses
Write-Host "Utilisateur:"
Write-Host $find.Name
Write-Host "Current ProxyAddresses:" $find.proxyaddresses
Write-Host "Old ProxyAddresses :" $proxyAddresses
Set-ADObject -Identity $guid -Replace @{proxyAddresses=$proxyAddresses}
Write-Host "-----------------"
Write-Host
}
Relancer ensuite la synchronisation :
Set-ADSyncScheduler -SyncCycleEnabled $True
Voici un script pour la libération des logs sur un serveur Exchange, attention de modifier les variables déclarés au début avec celle de votre Exchange et de définir le nombres de jours de conservation des longs. Ce script peut-être ajouté dans une tâche cron :
$days=2
$IISLogPath="C:\inetpub\logs\LogFiles\"
$ExchangeLoggingPath="C:\Program Files\Microsoft\Exchange Server\V15\Logging\"
$ETLLoggingPath="C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\ETLTraces\"
$ETLLoggingPath2="C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\Logs"
Function CleanLogfiles($TargetFolder)
{
if (Test-Path $TargetFolder) {
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$Files = Get-ChildItem $TargetFolder -Include *.log,*.blg, *.etl, *.txt -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{Write-Host "Deleting file $File" -ForegroundColor "white"; Remove-Item $File -ErrorAction SilentlyContinue | out-null}
}
Else {
Write-Host "The folder $TargetFolder doesn't exist! Check the folder path!" -ForegroundColor "white"
}
}
CleanLogfiles($IISLogPath)
CleanLogfiles($ExchangeLoggingPath)
CleanLogfiles($ETLLoggingPath)
CleanLogfiles($ETLLoggingPath2)
Créer une nouvelle OAB :
New-OfflineAddressBook -Name "Name OAB" -AddressLists "Liste d'adresses globale par défaut","Tous les utilisateurs" -GlobalWebDistributionEnabled $true
Pour lister les autres Address Lists, vous pouvez utiliser la commande Get-AddressLists
Vous pouvez ensuite appliquer cette OAB sur les bases de données Exchange :
Set-MailboxDatabase -Identity "DB01" -OfflineAddressBook "Name OAB"
Voici un script qui permet de modifier toutes les URL puis d'activer les services sur le certificat. Pensez à bien modifier les variables en début de script.
Pour récupérer le Thumbprint , vous pouvez utiliser cette commande : Get-ExchangeCertificate | Select-Object Subject,Status,Thumbprint
# Définition des variables
$server = "VotreNomDeServeur"
$webmail = "https://webmail.votreDomaine.com"
$autodiscover = "https://autodiscover.votreDomaine.com/Autodiscover/Autodiscover.xml"
$certificat = "ThumbprintDuCertificat"
# Modification des URLs
Set-owaVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalUrl "$webmail/owa" -ExternalUrl "$webmail/owa"
Set-EcpVirtualDirectory -Identity "$server\ecp (Default Web Site)" -InternalUrl "$webmail/ecp" -ExternalUrl "$webmail/ecp"
Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalUrl "$webmail/Microsoft-Server-ActiveSync" -ExternalUrl "$webmail/Microsoft-Server-ActiveSync"
Set-OabVirtualDirectory -Identity "$server\oab (Default Web Site)" -InternalUrl "$webmail/oab" -ExternalUrl "$webmail/oab"
Set-ClientAccessService -Identity "$server" -AutodiscoverServiceInternalURI "$autodiscover"
Set-WebServicesVirtualDirectory -Identity "$server\ews (Default Web Site)" -InternalUrl "$webmail/ews" -ExternalUrl "$webmail/ews"
Set-MapiVirtualDirectory -Identity "$server\mapi (Default Web Site)" -InternalUrl "$webmail/mapi" -ExternalUrl "$webmail/mapi"
# Activer les services du certificat
Enable-ExchangeCertificate -Thumbprint $certificat -Services 'SMTP, IMAP, POP, IIS'
La ligne de commande suivante est à exécutée dans le cmdlet Exchange Toolbox. Cela permet de récupérer les messages des 10 derniers jours avant de décommissionner un Exchange :
Get-MessageTrackingLog -Start (Get-Date).AddDays(-10) -End (Get-Date) -ResultSize Unlimited | Where-Object {$_.EventId -eq "DELIVER" -or $_.EventId -eq "SEND"} | Select-Object Timestamp, Source, EventId, MessageSubject, Sender, Recipients
# Importez le module ActiveDirectory
Import-Module ActiveDirectory
# Définissez le domaine que vous souhaitez ajouter à l'UPN
$domaine = "@domaine.com"
# Spécifiez le chemin du fichier CSV pour sauvegarder les UPNs existants
$cheminFichierSauvegarde = "C:\sauvegardeUPNs.csv"
# Récupérez tous les utilisateurs du domaine ayant une adresse e-mail
$utilisateurs = Get-ADUser -Filter 'mail -like "*"' -Properties mail, UserPrincipalName
# Créez ou écrasez le fichier CSV de sauvegarde
"SamAccountName,OldUPN,NewUPN" | Out-File -FilePath $cheminFichierSauvegarde
foreach ($user in $utilisateurs) {
# Extraire la partie de l'adresse e-mail avant le '@'
$mailPrefix = $user.mail.Split('@')[0]
# Construisez le nouvel UPN
$newUPN = $mailPrefix.ToLower() + $domaine
# Sauvegardez l'ancien et le nouvel UPN dans le fichier CSV
$ligneSauvegarde = "$($user.SamAccountName),$($user.UserPrincipalName),$newUPN"
Add-Content -Path $cheminFichierSauvegarde -Value $ligneSauvegarde
echo "L'utilisateur $user va remplacer le UPN $($user.UserPrincipalName) par le nouvel UPN $newUPN"
pause
# Mettez à jour l'UPN de l'utilisateur
Set-ADUser -Identity $user -UserPrincipalName $newUPN
}
Write-Output "Les UPNs de tous les utilisateurs ont été mis à jour et sauvegardés dans $cheminFichierSauvegarde"
# Importez le module ActiveDirectory
Import-Module ActiveDirectory
# Spécifiez le chemin du fichier CSV utilisé pour la sauvegarde
$cheminFichierSauvegarde = "C:\sauvegardeUPNs.csv"
# Lire le fichier CSV
$utilisateursSauvegardes = Import-Csv -Path $cheminFichierSauvegarde
foreach ($utilisateur in $utilisateursSauvegardes) {
# Récupérez le SamAccountName et l'UPN original depuis le fichier CSV
$samAccountName = $utilisateur.SamAccountName
$oldUPN = $utilisateur.OldUPN
# Restaurez l'UPN de l'utilisateur
Set-ADUser -Identity $samAccountName -UserPrincipalName $oldUPN
}
Write-Output "La restauration des UPNs à partir de $cheminFichierSauvegarde est terminée."
Ouvrir un ISE puis importer le module Exchange :
Exchange 2010 :Add-PSsnapin Microsoft.Exchange.Management.PowerShell.E2010
Exchange 2013/2016/2019 :Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Exécuter le script suivant :
# Récupérer les informations de boîtes aux lettres et les statistiques, puis les exporter dans un fichier CSV
Get-Mailbox -ResultSize Unlimited | Where-Object { $_.RecipientTypeDetails -eq "UserMailbox" -or $_.RecipientTypeDetails -eq "SharedMailbox" -or $_.RecipientTypeDetails -eq "RoomMailbox" } | ForEach-Object {
$stats = Get-MailboxStatistics $_.Identity
[PSCustomObject]@{
Type = switch ($_.RecipientTypeDetails) {
"UserMailbox" { "User" }
"SharedMailbox" { "Shared Mailbox" }
"RoomMailbox" { "Room" }
}
DisplayName = $_.DisplayName
PrimarySmtpAddress = $_.PrimarySmtpAddress
Alias = $_.Alias
LastLogonTime = $stats.LastLogonTime
}
} | Export-Csv -Path "C:\ExchangeExports\users_with_last_login.csv" -NoTypeInformation
Tout d'abord, vous aurez besoin d'un csv sous le format suivant (vous pouvez rajouter des lignes séparés par des virgules, le champ “Email” est obligatoire):
Email
jdoe@example.com
asmith@example.com
Après cela, voilà le script qui permet de convertir les bal (à exécuter sur l'Exchange en Admin) :
# Chemin vers le fichier CSV
$csvPath = "C:\path\to\users.csv"
# Importer les données du CSV
$users = Import-Csv -Path $csvPath
#Import du module Exchange (2013/2016/2019)
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
# Boucle sur chaque utilisateur du CSV
foreach ($user in $users) {
# Récupérer la boîte aux lettres correspondant à l'alias ou à l'e-mail
$mailbox = Get-Mailbox -Identity $user.Email -ErrorAction SilentlyContinue
if ($null -ne $mailbox) {
# Convertir la boîte aux lettres en boîte aux lettres partagée
Set-Mailbox -Identity $mailbox.Identity -Type Shared
Write-Output "Converted mailbox for $($user.Email) to shared."
} else {
Write-Output "No mailbox found for $($user.Email)."
}
}
# Confirmation finale
Write-Output "Conversion process completed."