PI Services

Le blog des collaborateurs de PI Services

Windows Server 2012–Evaluer l’impact de la déduplication

Windows Server 2012 intègre la notion de déduplication des données. Cette nouvelle fonctionnalitée permettrait d’economiser de l’espace disque, mais combien?

Pour cela Microsoft a intégrer un outil d’analyse permettant de prendre une décision sur l’activation ou non de la déduplication sur certains volume. Cet outils se nomme ddpeval.exe.

L’outil est automatiquement installer lors de l’ajout de la fonction déduplication.:

image

Une fois l’outil installer, il se trouve dans le répertoire c:\Windows\system32

L’outils peut etre copier sur d’autre serveur afin de réaliser les test.

L’outils peut etre copier sur d’autre serveur afin de réaliser les test.

Lancer une invite de commande puis lancer l’outils suivi du chemin a analyser:

Attention ddpeval.exe ne peut pas etre éxécuté sur un disque system, de démarrage ou encore un volume surlequel la déduplication est deja activée. L’analyse peux prendre plusieurs heures en fonction de la volumétrie:

image

Une fois l’analyse finie un compte rendu est affiché. Dans cet exemple 25% de l’espace peut etre economisé si la compression est activée.

Pour plus de détail sur la déduplication:

http://technet.microsoft.com/fr-fr/library/hh831700.aspx

Powershell : Modifier l'affichage d'un compte sous Outlook 2010

Introduction

Dans le cadre d'une migration inter-organization Exchange 2003 vers Exchange 2010, il fallait reconfigurer le profil pour que le nom de compte dans Outlook 2010 soit mis à jour avec la nouvelle adresse email (ainsi que le nom des arborescences des emails et de dossiers publics associées).

Blog1blog2

Afin de répondre à cette problématique en impactant le moins d'utilisateurs possibles, la solution proposée réalisait des modifications via un script déployer en GPO (logon script).
Ci-dessous vous trouverez les informations nécessaires à ce paramétrage via Powershell.

Récupération des informations de comptes

Afin d'effectuer ces modifications il faut aller les chercher dans le registre.
Ainsi, la ruche "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\" liste tout les profiles Outlook enregistré (par défaut le premier profil est appelé Outlook) pour l'utilisateur connecté.
Dans les ruches enfantes, si la clé de registre 001f6620 est présente c'est qu'il s'agit d'un compte Outlook. Cette dernière définit le nom du compte.

De plus, toujours dans les ruches sous-jacentes au nom d'un profile, si la clé 0003660a est positionné alors il s'agit d'une arborescence de emails ou de dossiers publics (ce sont celles qui nous intéressent dans le cas d'un changement de nom).
Si elle a la valeur "0x03,0x00,0x00,0x00" c'est qu'elle représente une arborescence de dossiers publics tandis que "0x01,0x00,0x00,0x00" représente la même chose pour des emails.
Le nom de l'arborescence est contenu dans la clé 001f3001.

Avec ces informations nous pouvons donc facilement retrouver le nom d'un compte et le profile associé pour le modifier. Pour modifier les noms des arborescences, nous avons les clés de registres à changer.

Modification du nom de compte

Pour modifier le nom du compte il n'existe actuellement qu'une seule méthode puisque la propriété du accessible via la librairie Interop (permettant d'interagir avec Outlook) n'est accessible qu'en lecture seule. Un module Powershell a été développé pour gérer les comptes Outlook : Outlook Account Manager. Il est disponible à cette adresse : http://psoutlookmanager.codeplex.com/

Il propose un jeu de commandes permettant de récupérer les profiles (Get-Profile), les comptes (Get-MAPIAccount) et de modifier ces derniers (Set-MAPIAccount).

Voici un exemple permettant le modification du nom d'un compte :

On récupère le compte Outlook que l'on souhaite renommer (Il faut spécifier le profil)
$Account = Get-MAPIAccount -ProfileName "Nom du profil" | Where-Object `   {$_.AccountName -eq "Mon compte à modifier"}
On change l'attribut AccountName avec le nouveau nom que l'on souhaite obtenir.
$Account.AccountName = "Nouveau nom"
On enregistre les changements sur le compte que l'on a mis à jour.
Set-MAPIAccount $Account

Il est à noter que le module Outlook Account Manager ne s'exécute qu'avec Powershell 32 bits. On peut donc lancer le script via la commande ci-dessous :
&"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" $Path
$Path représente ici le chemin du script.

Cette méthode peut être exécuter pendant qu'Outlook est lancé. Le résultat sera visible dès l'exécution du script (sans avoir à redémarrer Outlook).

Modification du nom d'affichage

Pour mettre à jour le nom d'affichage dans l'arborescence Outlook, il existe plusieurs méthodes.

La première, consiste à utiliser les classes Interop Outlook. Cela va lancer un processus Outlook en tâche de fond.
Tout d'abord on invoque une instance d'Outlook
$Outlook = New-Object -comObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")

Permet d'obtenir tous les comptes.
$Accounts = $Namespace.Accounts

Cette méthode présente l'avantage d'obtenir un résultat visible même si Outlook est lancé (sans avoir à le redémarrer). Cependant, l'utilisateur sera prompté pour lui dire qu'un autre processus souhaite accéder à Outlook, et cela nécessitera donc une intervention manuelle. Il peut aussi être concevable de fermer toutes les instances d'Outlook avant d'exécuter ce script, ce qui peut être déroutant pour l'utilisateur.

Voici un exemple de code permettant la dernière proposition :
$OutlookProcesses = Get-Process | Where-Object {$_.Name -like "Outlook"}
ForEach($Outlook in $OutlookProcesses){
    Stop-Process $Outlook.Id
}

A la fin du script on n'oublie pas de fermer le processus ouvert par la création de l'objet COM :
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Outlook)

La seconde méthode consiste à modifier directement la clé de registre. Pour mettre en œuvre cette opération il faut changer la valeur de la clé "001f3001" que l'on a identifier au préalable. Attention, le type de cette clé est un tableau de bytes. Bien qu'il soit possible de donner une chaine de caractère classique (String), tout en impactant pas le fonctionnement d'Outlook, cela va modifier le type. Voici donc un exemple pour créer un tableau de bytes à partir d'une chaine de caractère :

Exemple de résultat à obtenir :
blog4

On encode une String  en tableau de bytes
$enc = [system.Text.Encoding]::UTF8
$mystring = "This is a string"
$data = $enc.GetBytes($mystring)

Chaque caractère est séparé par une valeur en byte équivalente à un zéro. Pour que notre tableau soit correct il faut ajouter ce zéro après chaque caractère.
On crée un tableau modifiable (ArrayList)
$ArrayBytes = New-Object System.Collections.ArrayList
Entre chaque byte on ajoute un zéro.
foreach($d in $data){
    $ArrayBytes.Add($d)
    $ArrayBytes.Add(0)
}

Enfin on peut modifier la valeur de la clé de registre :

Set-ItemProperty "$RegistryPath" -Name 001f3001 -Value $ArrayBytes
$RegistryPath représente le chemin vers la clé de registre.

L'avantage de cette méthode est de n'avoir pas à exécuter de processus Outlook et l'utilisateur ne se rend pas compte du changement (pas de prompt ni de fermetures intempestives d'Outlook). Cependant si Outlook est lancé, le résultat ne sera visible qu'au prochain démarrage de celui-ci.

Powershell : Générer des fichiers Excel

Introduction

En Powershell, lorsque l'on souhaite exporter des données, le format de fichier le plus couramment prisé et le CSV (comma separated value). Cependant, il arrive souvent que ce fichier soit retravaillé avec de la mise en forme notamment. A ce moment là, il faut donc utiliser Excel et faire quelques clics... Heureusement, Microsoft fournit des classes C# accessibles en Powershell pour toute la suite Office. Il va donc être question de réaliser ces exports de façon automatisée avec la mise en page que l'on souhaite.

Utilisation d'Excel via Interop

Nous verrons ici les principales fonctions pour généré un fichier Excel et le mettre en forme. La totalité des fonctionnalités proposées étant disponible ici : 
http://msdn.microsoft.com/fr-fr/library/microsoft.office.interop.excel(v=office.11).aspx

Tout d'abord il faut appeler Excel en créant un nouvel.
$objExcel = new-object -comobject excel.application
On remarque que cette commande crée un processus Excel.
Pour accéder à un classeur il suffit d'utiliser cette commande (pour un fichier existant) :
$finalWorkBook = $objExcel.WorkBooks.Open($ExcelFilePath)
"$ExcelFilePath" représente le chemin du fichier que l'on souhaite ouvrir
S'il s'agit d'un nouveau fichier :
$finalWorkBook = $objExcel.Workbooks.Add()

Ensuite il est possible d'accéder à chaque onglet en précisant l'index dans la commande ci-dessous :
$finalWorkSheet = $finalWorkBook.Worksheets.Item(1)
Mais on peut aussi le renommer :
$finalWorkBook.Worksheets.Item(1).Name = "MyPSTab"

On peut ensuite accéder aux cellules de l'onglet :
$finalWorkSheet.Cells.Item(4,5) = "MyCell01"
Le premier chiffre est le numéro de la ligne et le second le numéro de la colonne (ci-dessus, ligne 4 - colonne 5). On peut donc facilement réaliser des boucles sur ces index pour changer de cellule.

Pour récupérer la valeur d'une cellule dans le cas où on se sert d'un fichier Excel en entrée d'un script :
myValue = $finalWorkSheet.Cells.Item(1,1).Text

Voici quelques commandes de mise en forme :
Pour mettre un texte en gras :
$finalWorkSheet.Cells.Item(1,4).Font.Bold
Pour surligner une cellule :
$finalWorkSheet.Cells.Item(3,2).Interior.ColorIndex = 42
Le nombre passé en paramètre correpond à une couleur.
Enfin pour ajuster la taille des colonnes automatiquement :
Pour une colonne spécifique (1 est l'index de la colonne):
$finalWorkSheet.Columns.Item(1).Autofit()
Pour l'intégralité du tableau :
$UR = $finalWorkSheet.UsedRange
$UR.EntireColumn.AutoFit()

Lorsque l'on souhaite sauvegarder un classeur Excel il existe deux méthodes. Dans le cas où le fichier existe :
$finalWorkBook.Save()
Si ce n'est pas le cas alors on utilise la méthode SaveAs avec le chemin du fichier :
$finalWorkBook.SaveAs(C:\TestExcelPS.xlsx)

Enfin, on n'oublie pas de fermer le processus ouvert par la création de l'objet COM :
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel)

Astuce : Si l'on souhaite voir le résultat pendant que le script s'exécute il suffit de rendre l'objet Excel visible en changeant la valeur de l'attribut éponyme :
$objExcel.Visible =$true

Script d'exemple

Ci-dessous un script réalisant un export des comptes désactivés d'un annuaire Active Directory. Ensuite, les comptes sont triés par unité d'organisation puis exporté dans un fichier Excel. A l'affichage chaque utilisateur est surligné d'une couleur différente en fonction de son unité d'organisation.

##################################################################

# Help                                                                                                        #

##################################################################

<#

    .SYNOPSIS

    Get Disabled Accounts      

    .DESCRIPTION

    Get Disabled Accounts, sort them by OU and Export by Excel or CSV

    .EXAMPLE

    01-Get-DisabledAccounts.ps1

    Description

    -----------

    Get Disabled Accounts, sort them by OU and Export by Excel or CSV

#>

##################################################################

# Main                                                                                                       #

##################################################################

# Récupération du chemin du fichier du script

$RootFolder = Split-Path -Path $MyInvocation.MyCommand.Definition

# Test de la présence du module Active Directory

if((Get-Module ActiveDirectory) -eq $null){

    try{

        Import-Module ActiveDirectory

    }catch{

        Write-Host "The execution computer doesn't have ActiveDirectory Powershell Module. The script can't continue." -ForegroundColor Red

        return

    }

}

# Création de l'objet application Excel sinon on réalise un export au format CSV

try{

    $objExcel = new-object -comobject excel.application

    Write-Host "Excel is installed on this Computer, disabled Users will be export in a fashioned excel file."

    $ExcelTest = $true

}catch{

    Write-Host "Excel is not installed on this Computer, disabled Users will be export in a plain old CSV file."

    $ExcelTest = $false

}

# Génération de la date du jour pour le nom du fichier d'export

$Date = Get-Date -Format ddMMyyyy

# Si Excel est disponible

if($ExcelTest){

    # Génération du chemin du fichier d'export

    Write-Host "Create Excel file"

    $ExcelPath = "$RootFolder\DisabledAccounts_$Date.xlsx"

   # Si le fichier Existe on l'ouvre

    if (Test-Path $ExcelPath) {

        $finalWorkBook = $objExcel.WorkBooks.Open($ExcelPath)

       # On choisi l'onglet sur lequel on travaille

        $finalWorkSheet = $finalWorkBook.Worksheets.Item(1)

        # Donne un nom au à l'onglet

        $finalWorkBook.Worksheets.Item(1).Name = "DisabledAccounts"

    }else{

        # Création d'un nouveau fichier

        $finalWorkBook = $objExcel.Workbooks.Add()

        $finalWorkSheet = $finalWorkBook.Worksheets.Item(1)

        $finalWorkBook.Worksheets.Item(1).Name = "DisabledAccounts"

    }

    #$objExcel.Visible =$true

    Write-Host "Create header"

   # Rempli la première ligne

    $finalWorkSheet.Cells.Item(1,1) = "SamAccountName"

    # Met le texte en gras

    $finalWorkSheet.Cells.Item(1,1).Font.Bold = $True

    $finalWorkSheet.Cells.Item(1,2) = "FirstName";

    $finalWorkSheet.Cells.Item(1,2).Font.Bold = $True

    $finalWorkSheet.Cells.Item(1,3) = "LastName"

    $finalWorkSheet.Cells.Item(1,3).Font.Bold = $True

    $finalWorkSheet.Cells.Item(1,4) = "LastLogonDate"

    $finalWorkSheet.Cells.Item(1,4).Font.Bold = $True

    $finalWorkSheet.Cells.Item(1,5) = "DistinguishedName"

    $finalWorkSheet.Cells.Item(1,5).Font.Bold = $True

}else{

    # Création du chemin du fichier CSV

    $CSVPath = "$RootFolder\DisabledAccounts_$Date.csv"

    # Création du header du fichier CSV

    $Header = "SamAccountName;FirstName;LastName;LastLogonDate;DistinguishedName"

    # Ecriture du header

    $Header | Out-File -FilePath $CSVPath

}

Write-Host "Rrieving data..." -ForegroundColor Green

# Récupération des utilisateurs désactivées

$ListUser = Get-ADUser -Filter {Enabled -eq $false} -Properties * | Select CanonicalName, CN, DistinguishedName, SamAccountName, GivenName, SurName, LastLogonDate, `

@{Name="OU";Expression={(($_.CanonicalName).Substring($_.CanonicalName.IndexOf("/")+1)).replace("/$($_.CN)","")}} `

| Sort-Object OU

Write-Host "Writing data..." -ForegroundColor Green

# On commence à la seconde ligne (la 1ère est consacrée au Header)

$FinalExcelRow = 2

# Choix d'une couleur pour surligner la ligne

$ColorIndex = 41

# Récupéraiton de l'OU du premier utilisateur

if($ListUser.Count -gt 0){

    $OU = $ListUser[0].OU

}

$i = 0

#On boucle sur chaque utilisateur

ForEach($User in $ListUser){

    #On affiche une barre de progression montrant le nombre d'utilisateur déjà traités

    $PercentComplete = [System.Math]::Round($($i*100/($ListUser.Count)),2)

    Write-Progress -Activity "Exporting data to Excel" -status "Effectué : $PercentComplete %" -percentcomplete $($i*100/($ListUser.Count))

    $i++

    if($ExcelTest){

        # Si l'OU est à changé on change aussi l'index de la couleur

        if($OU -ne $User.OU){

            $ColorIndex++

            if($ColorIndex -ge 56){

                $ColorIndex = 3

            }

        }

       # Récupéraiton de l'OU de l'utilisateur en cours

        $OU = $User.OU

        #On stocke les différentes valeurs

        $finalWorkSheet.Cells.Item($FinalExcelRow,1) = $User.SamAccountName

        #On attribut la couleur définit plus haut pour la case concerné

        $finalWorkSheet.Cells.Item($FinalExcelRow,1).Interior.ColorIndex = $ColorIndex

        $finalWorkSheet.Cells.Item($FinalExcelRow,2) = $User.GivenName

        $finalWorkSheet.Cells.Item($FinalExcelRow,2).Interior.ColorIndex = $ColorIndex

        $finalWorkSheet.Cells.Item($FinalExcelRow,3) = $User.SurName

        $finalWorkSheet.Cells.Item($FinalExcelRow,3).Interior.ColorIndex = $ColorIndex

        $finalWorkSheet.Cells.Item($FinalExcelRow,4) = $User.LastLogonDate

        $finalWorkSheet.Cells.Item($FinalExcelRow,4).Interior.ColorIndex = $ColorIndex

        $finalWorkSheet.Cells.Item($FinalExcelRow,5) = $User.DistinguishedName

        $finalWorkSheet.Cells.Item($FinalExcelRow,5).Interior.ColorIndex = $ColorIndex

        # On incrémente le numéro de la ligne en cours d'écriture

       $FinalExcelRow++

    }else{

        $Result = $User.SamAccountName+";"+$User.GivenName+";"+ `                            $User.SurName+ ";"+$User.LastLogonDate+";"+$User.DistinguishedName

        $Result | Out-File -FilePath $CSVPath -Append 

    } 

}

Write-Host "Saving data and closing Excel." -ForegroundColor Green

if($ExcelTest){

    # Sélectionne les cellules utilisées

    $UR = $finalWorkSheet.UsedRange

   # Auto ajustement de la taille de la colonne    

    $null = $UR.EntireColumn.AutoFit()

    if (Test-Path $ExcelPath) {

        # Si le fichier existe déjà, on le sauvegarde

        $finalWorkBook.Save()

    }else{

        # Sinon on lui donne un nom de fichier au moment de la sauvegarde

        $finalWorkBook.SaveAs($ExcelPath)

    }

    # On ferme le fichier

    $finalWorkBook.Close()

}

# Le processus Excel utilisé pour traiter l'opération est arrêté

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel)

Orchestrator & System Center 2012 : Mise en place de l’intégration pack SCOM

 

Executez le package “System_Center_2012_Orchestrator_Integration_Packs.exe” disponible sur le site http://www.microsoft.com/en-us/download/details.aspx?id=28725

Depuis la console “Orchestrator Deployment Manager” faites un clic droit sur le noeud Integration Pack et selectionner Register IP with the Orchestrator

image

image

Cliquez Next

image

Cliquez Add

image

Sélectionnez l’integration pack de SCOM, précédemment extrait de l’archive

image

Cliquez Next

image

Cliquez Finish

image

Cliquez Accept

image

L’integration Pack apparait sous le noeud Integration Pack

image

Faites un clic-droit dessus et selectionnez Deploy IP to Runbook Server or Runbook Designer…

image 

Cliquez Next

image

Cochez L’integration pack de SCOM et cliquez Next

image

Ajoutez le nom du serveur Runbook Designer et cliquez Next

image

Cochez la seconde option pour ne pas stopper les Runbooks automatiquement et vous laisser la possibilité de redémarrer le serveur manuellement si nécessaire.

image

Cliquez Finish

image

Exécutez la console Runbook Designer

image

La boite a outil SC 2012 Operations Manager est disponible désormais dans la console.

Threat Management Gateway 2010 SP2 – Logs.

L’utilitaire “Logging Task” sous TMG 2010 est souvent nécessaire pour rechercher

des informations, pour dépanner, etc…

Ayant rencontré de fréquents problèmes lors de recherches “passées”, j’ai travaillé

avec Microsoft pendant plusieurs mois sur ce problème. Les multiples analyses

ont amené Microsoft à écrire un correctif privé (Unofficial RU).

Ce correctif devrait pris en compte par le prochain RU (RU4 ?).

image

Exchange 2010–Queue Viewer

En observant les files d’attentes d’un serveur de transport on peut parfois observer une

file en mode “suspended” ne contenant aucun message dont le “delivery type” est

“DnsConnectorDelivery”. La présence de ce type est compréhensible lorsqu’un connecteur

utilise un serveur DNS pour connaitre la passerelle distante, dans mon cas il n’y a que des

connecteurs utilisant une remise vers un “smarthost” !

 

clip_image002

Quoiqu’il en soit supprimons cette file.

Passez la file en mode “resume”. Elle va passer en “ready”:

clip_image002[5]

Redémarrez le service MS Exchange Transport.

Relancez la console Queue Viewer.

clip_image002[7]

La file a disparue.

ForeFront Protection 2010 for Exchange server.

 

Ayant observé des échecs de mise à jour du moteur VirusBuster, j’ai donc effectué

quelques recherches.

Microsoft ne travaille plus avec cet éditeur. Il est donc fortement recommandé de désactiver

la mise à jour et l’utilisation de ce moteur.

clip_image002

Voici ce que l’on peut lire sur le site de VirusBuster.

image

Désactivons cet antivirus:

clip_image002[5]

Quitter la console en sauvegardant.

 

Un peu plus tard….

clip_image002[7]

Voilà, tout est au vert.

SCOM 2012 – Principes de APM (Application Performance Monitoring)

Voici les grandes étapes de mise en place de la supervision d’une application .NET a travers la fonctionnalité APM de SCOM 2012.

L’application pris en exemple, DotNetNuke, peut etre installée facilement a travers WPI (Web Platform Installer), outil de déploiement de toutes les application web gratuite fournies par Microsoft.

  1. Import des management pack IIS 7

Fichier Microsoft.Windows.InternetInformationServices.CommonLibrary.mp

Fichier Microsoft.Windows.InternetInformationServices.2008.mp

  1. Import des management pack APM IIS 7

Fichier Microsoft.SystemCenter.Apm.Web.IIS7.mp

  1. Deploiement d’un agent SCOM sur le serveur IIS hebergeant l’application

 

Le pool d’application DotNetNuke est découvert a la suite de l’installation de l’agent.

image

  1. Creation d’un groupe dédié

image

  1. Ajout a ce groupe de l’objet “Windows Computer” correspondant au serveur DotNetNuke

 

image

  1. Execution du template .NET Application Performance Monitoring

image

image

  1. Ajout de l’application DotNetNuke, Sélection du type d’environnement et ciblage vers le groupe crée précédemment.

image

  1. Configuration des réglages spécifiques

image

  1. Fin de création du moniteur - L’assistant averti qu’il peut être nécessaire de redémarrer le service IIS pour permettre au moniteur crée de fonctionner.

image

image

 

  1. L’assistant a crée une arborescence spécifique a l’application, au sein du groupe de vues Application Monitoring.

image

SCOM–Nouveaux Management Pack

 

Management pack pour Remote Access 2012

Supervision du nouveau service d’acces distant de Windows (Unification de Direct Access et Routing and Remote Acces Server).

Management Pack for Windows Server Hyper-V 2012

Supervision de Hyper-V v3.

Global Service Management Packs

Ce management pack, couplé a l’abonnement au Global Service Monitor de la plate-forme  Azure  implemente la possibilité d’avoir une prespective de disponibilité d’une application depuis un site externe a l’entreprise. (Notion de “agent in the cloud”)

Monitoring Pack for Windows Server Backup

Supervision des services de sauvegarde de Windows.

Les événements supervisés sont notamment:

· Backup cancelled

· Backup failed

· Backup failed due to snapshot

· Backup partially succeeded

· Backup succeeded with skipped files

· Recovery failed

· Recovery succeeded with warnings

Microsoft Dynamics NAV 2013 Management Pack

Supervision de Microsoft Dynamics NAV 2013 , progiciel de gestion pour les petites et moyennes organisations qui automatise et simplifie les processus métier.

http://pinpoint.microsoft.com/en-US/applications/microsoft-dynamics-nav-2013-management-pack-for-system-center-12884952897

 

Security Monitoring for Endpoint Protection

Supervision des clients anti-virus EndPoint Protection

Monitoring Pack for UNIX and Linux Operating Systems

Supervision des systemes Unix/Linux suivants:

AIX 5.3, 6.1 et 7

HPUX 11 V2 et V3

RHEL 4, 5 et 6

Suse Linux ES 9,10 et 11

Solaris 9,10 et 11

Exchange 2010 SP2 – Erreur MapiExceptionNetworkError lors du déplacement des boîtes aux lettres

Symptôme

Dans le cadre d’une migration depuis une plateforme Exchange Server 2007 SP3 vers une plateforme Exchange 2010 SP2 RU5v2, l’erreur MapiExceptionNetworkError apparaît de manière régulière dans les logs des requêtes de déplacement de boîtes aux lettres (MoveRequests).

Voici un exemple :

18/01/2013 19:03:15 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:13:54 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:19:31 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:25:48 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:36:51 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:42:58 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 19:53:52 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 20:00:00 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 20:11:11 [SRV] Transient error MapiExceptionNetworkError has occurred.
18/01/2013 20:17:22 [SRV] Transient error MapiExceptionNetworkError has occurred

Le code d’erreur détaillé est le suivant :

Error details: MapiExceptionNetworkError: Unable to open entry ID. (hr=0x80040115, ec=0)

Les déplacements de boîtes aux lettres ne se terminent jamais car à chaque occurrence de l’erreur réseau, le transfert des données depuis les serveurs Exchange 2007 vers les serveurs Exchange 2010 repart à zéro.

18/01/2013 20:17:53 [SRV] Restarting the move because checkpoint data doesn't exist or isn't valid in 'Primary (f3e507d4-a687-416b-a615-23d2b9173011)'.
18/01/2013 20:17:53 [SRV] Connected to source mailbox 'Primary (f3e507d4-a687-416b-a615-23d2b9173011)', database 'CLUST01\StorageGroup\DB001', Mailbox server 'CLUST01.domain.local' Version 8.3 (Build 213.0).
18/01/2013 20:17:54 [SRV] Request processing started.
18/01/2013 20:17:54 [SRV] An old copy of the mailbox was removed from the destination database. The operation will try again in 30 seconds.

 

En parallèle, on remarque sur les boîtes aux lettres migrées vers Exchange 2010, l’apparition de nombreux évènements ayant pour source Outlook et pour ID 26 sur les postes clients (équipés d’Outlook 2010).

image

L’évènement émis par Outlook avec ID 26 a pour description “La connexion MAPI a été rétablie”.

Explication

Par défaut les sessions MAPI initiées par les serveurs Exchange 2010 ont une durée de vie de deux heures (7200 secondes).

Il peut arriver qu’un équipement réseau (routeur, pare-feu, HLB…) détecté une connexion MAPI comme étant inactive (idle) et coupe la session. En cas de coupure de session les clients MAPI tentent généralement de se reconnecter.

Dans notre cas c’est ce qui se produisait d’une part avec les clients Outlook (d’où les nombreux évènements au sujet d’une connexion MAPI “rétablie”) et d’autre part lorsque les serveurs CAS déplaçaient des boîtes aux lettres (d’où les erreurs “réseau”, suivies d’une reprise de la copie à son état de départ).

Remarque : Cette problématique de timeout est documentée dans la fiche support KB 2535656 (http://support.microsoft.com/kb/2535656/en-us) mais l’impact possible sur les déplacement de boîtes aux lettres (erreur “MapiExceptionNetworkError: Unable to open entry ID) n’y est pas référencé.

Résolution

Pour résoudre ce problème, deux approches sont possibles :

A) Identifier l’équipement réseau possédant un timeout trop court et reconfigurer ce timeout sur une valeur cohérente avec celle d’Exchange 2010 (2 heures)

B) Identifier la durée du timeout (dans notre cas 300s) et ajouter la clé de registre KeepAliveTime sur l’ensemble des serveurs Exchange 2010 et 2007 pour que le timeout Exchange soit inférieur au timeout de l’équipement (par exemple positionner la valeur KeepAlive sur 180 secondes)

Dans notre cas de figure l’option la plus simple et la plus pertinente a consisté à augmenter le timeout du “protocol profil” FastL4 sur les boitiers F5 (par défaut le timeout sur ce profil était configuré à 300 secondes et il a été relevé à 7200 secondes).

clip_image001[4]

Cette opération a résolu l’ensemble des problèmes rencontrés sur la plateforme (plus d’erreurs 26 sur les clients ni d’erreur MapiNetworkException lors des transferts de boîtes aux lettres).

A titre informatif, voici un exemple de configuration de la clé KeepAliveTime (attention la valeur à entrer est en millisecondes).

image