Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles Ă  la une

Exchange Hybride & Publication KEMP – Erreur lors des migrations

Contexte

Dans une architecture Exchange 2013 Hybride où les publications web sont faites par des boitiers KEMP vous ne pouvez pas faire de migration.

En effet vous obtenez l’erreur suivante The connection to the server ‘Exchange Server’ could not be completed.

01

Explications et solution

La première chose à valider est l’activation du proxy MRS sur les serveurs Exchange.

Pour cela depuis le centre d’administration Exchange, allez dans Serveurs puis Répertoires virtuels et vérifiez que sur l’ensemble des répertoires EWS l’option Activer le point de terminaison du proxy MRS est cochée.

2016-09-15_145522

2016-09-15_145247

Si c’est bien le cas, le problème peut venir de la configuration de la publication des services web d’Exchange sur le KEMP.

Depuis l’interface d’administration KEMP, allez dans System Configuration > Miscellaneous Options > L7 Configuration.

Modifiez la valeur du paramètre 100-Continue Handling pour RFC-7231 Compliant.

03

La modification de cette valeur va permettre au boitier KEMP de ne pas rejeter la demande de l’assistant de migration.

En essayant à nouveau de faire une migration, l’assistant passera à l’étape suivante.

FIM Synchronization Service Partie 6 : CrĂ©ation d’une règle d’extension (transformations d’attributs)

Introduction

La gestion des identitĂ©s en entreprise est une problĂ©matique de plus en plus importante. En effet, des thĂ©matiques telles que la mise en place d’un rĂ©fĂ©rentiel d’identitĂ© unique, le SSO (authentification unique), la gestion du cycle de vie d’un utilisateur (provisioning et deprovisioning, gestion du mot de passe, …) et bien d’autres deviennent essentielles dans des environnements toujours plus complexes et offrant plus de services. Il devient donc primordial d’intĂ©grer des solutions permettant de gĂ©rer les identitĂ©s au sein d’une entreprise. Cela permet notamment :

  • d’automatiser des processus de gestions de comptes (exemple la saisie/modification/suppression d’un compte dans une base RH dĂ©clenche les actions nĂ©cessaires sur les infrastructures du système d’information)
  • d’Ă©viter les erreurs humaines de manipulations
  • de rĂ©duire les tâches d’exploitation
  • de n’avoir qu’un seul point d’entrĂ©e pour la saisie d’informations (rĂ©fĂ©rentiel RH par exemple, …)

Dans cette sĂ©rie d’articles, nous allons nous intĂ©resser au composant Synchronisation Service. Si certains composants fonctionnent ensemble, ce n’est pas le cas de celui-ci qui peut ĂŞtre installĂ© seul. L’objectif est de dĂ©couvrir les possibilitĂ©s offertes par cet outil. Pour cela, nous allons utiliser le contexte d’une sociĂ©tĂ© « MyCompany » souhaitant synchroniser les changements de son rĂ©fĂ©rentiel d’identitĂ© (une base de donnĂ©es SQL Server) vers l’annuaire Active Directory (synchronisation d’attributs). Aussi, nous verrons comme gĂ©rer le cycle de vie des objets tels que les utilisateurs ou les groupes via un mĂ©canisme de Provisioning/Deprovisioning.

Ces articles vont s’articuler de la façon suivante :

Durant la configuration des Managements Agents, j’ai Ă©voquĂ© plusieurs configurations pouvant ĂŞtre personnalisĂ©es via du dĂ©veloppement. MalgrĂ© que cela puisse paraĂ®tre compliquĂ©, il n’est pas nĂ©cessaire de possĂ©der de très grandes compĂ©tences en dĂ©veloppement pour rĂ©aliser ce type d’implĂ©mentation. Le langage utilisĂ© est le VB.Net ou le C#. Dans cet article j’utiliserai le C#. J’expliquerai comment crĂ©er une règle d’extension Ă  partir de FIM, les notions liĂ©es Ă  FIM pour le dĂ©veloppement de celles-ci, ainsi qu’un exemple concret avec une règle simple rĂ©alisant une transformation d’un attribut lors d’un d’import. Pour rĂ©aliser ce guide, il est nĂ©cessaire de possĂ©der Visual Studio (en version 2008 ou supĂ©rieure).

NB : En AoĂ»t 2015, Microsoft a sorti une nouvelle version de la suite FIM, renommĂ© pour l’occasion MIM (Microsoft Identity Manager) suite Ă  l’abandon de la gamme de produits Forefront. Cette nouvelle mouture apporte quelques fonctionnalitĂ©s supplĂ©mentaires. Cependant le contenu de ces articles restent valables.

Ajout d’une règle d’extension

Avant de crĂ©er le projet Visual Studio est de dĂ©velopper nos règles personnalisĂ©s, il faut les ajouter au sein du Management Agent. Prenons l’exemple d’une règle standardisant le formatage du prĂ©nom des objets de type person. Celle-ci permettra d’avoir tous les prĂ©noms avec la première lettre de chaque mot en majuscule et le reste en minuscule. Pour ce faire, il est nĂ©cessaire d’Ă©diter le flux d’attribut du Management Agent. Dans cet article, nous allons effectuer cette modification lors de l’import des donnĂ©es dans la mĂ©taverse (dans le Management Agent SQL). Toutefois, cela aurait aussi Ă©tĂ© possible pendant l’export des donnĂ©es dans l’annuaire Active Directory et donc dans le Management associĂ© (Ă  la diffĂ©rence que la transformation ne sera pas visible dans la mĂ©taverse).

Le changement de flux d’attribut consiste Ă  dĂ©finir le type Ă  Advanced au lieu de Direct.

msohtmlclipclip_image001

Un panel s’ouvre. Il faut alors choisir le type Rule Extension. Le nom associĂ© peut ĂŞtre customisĂ©. Il sera utilisĂ© lors du dĂ©veloppement pour identifier les actions qui seront associĂ©es.

msohtmlclipclip_image002

Enfin, il convient de dĂ©finir le nom de la DLL dans l’onglet Configure Extensions. Ces dernières sont contenues dans l’arborescence 2010\Synchronization Service\Extensions du dossier d’installation de FIM Synchronisation Service (par dĂ©faut C:\Program Files\Microsoft Forefront Identity Manager\).

msohtmlclipclip_image003

Attention, lorsque cette configuration est appliquĂ©e, le Management Agent n’est plus fonctionnelle tant que la DLL n’a pas Ă©tĂ© créée. De plus, le flux d’import Ă©chouera si la mĂ©thode permettant de traiter cette règle avancĂ©e n’a pas Ă©tĂ© implĂ©mentĂ©e dans la DLL.

Création du projet Visual Studio

Les règles d’extensions reposent sur une DLL que l’on peut gĂ©nĂ©rer Ă  partir de Visual Studio. Aussi, FIM Synchronisation Service inclus des options permettant de simplifier le dĂ©veloppement de celles-ci. Ainsi, il va ĂŞtre possible de gĂ©nĂ©rer un projet et l’intĂ©gralitĂ© du squelette C# ou VB.Net. Ce dernier contient toutes les règles de personnalisation qu’il convient ou nous de complĂ©ter en fonction de ses besoins. Il ne restera plus qu’Ă  complĂ©ter le projet. Une mĂ©thode C# correspond Ă  chaque personnalisation possible (c’est-Ă -dire Ă  chaque endroit dans la configuration du Management Agent oĂą l’on peut indiquer une règle d’extension). Nous reviendrons sur les possibilitĂ©s offertes par chaque mĂ©thode dans le chapitre suivant. Si les règles Ă  intĂ©grer sont simples, il ne faudra alors que quelques lignes pour mettre en place ce type de configuration (c’est ce que nous verrons dans l’exemple dĂ©crit en fin d’article).

Par convention, une dll d’extension est attribuĂ©e Ă  un Management Agent Ă  la fois. Celle-ci contiendra donc toutes les règles de personnalisation d’un Management Agent. Pour crĂ©er une nouvelle règle d’extension. Il est nĂ©cessaire de se rendre dans l’onglet Management Agent, de sĂ©lectionner le Management Agent pour lequel on souhaite dĂ©velopper une règle d’extension puis de cliquer sur le menu Actions et enfin de cliquer sur Rules Extension dans Create Extension Projects.

01

Un assistant permet de dĂ©finir le langage, la version de Visual Studio, le nom du projet et l’emplacement oĂą il sera stockĂ©. A noter que si vous utiliser une version supĂ©rieure Ă  Visual Studio 2012, vous pouvez indiquer cette dernière comme version cible. Aussi, en cochant la case Launch in VS.Net IDE, vous avez la possibilitĂ© d’ouvrir directement le projet dans Visual Studio. Cette option ne sera fonctionnelle que si Visual Studio est installĂ© sur le mĂŞme serveur que FIM Synchronisation Service. Cette implĂ©mentation est en gĂ©nĂ©ral envisageable lorsque l’on travaille sur un serveur de dĂ©veloppement. Il suffira ensuite d’exporter le Management Agent et la DLL sur le serveur de production.

msohtmlclipclip_image005

Lorsque le projet est ouvert, on constate que l’arborescence reste simple. Le fichier qui nous intĂ©resse est celui avec l’extension .cs portant le nom de la règle d’extension. Le dĂ©veloppement Ă  rĂ©aliser ne concernera que la modification de ce fichier.

msohtmlclipclip_image006

Lorsque vous générer la solution via le menu Build, la DLL est automatiquement placée dans le répertoire adéquat de FIM Synchronisation Service.

Notions

Les méthodes

En dehors des mĂ©thodes initialize et terminate qui ne s’exĂ©cute qu’une seule fois par exĂ©cution d’un Management Agent, les autres mĂ©thodes sont appelĂ©es pour chaque objet qui est traitĂ© lorsqu’il satisfait une configuration appelant une règle d’extension (la règle de flux d’import par exemple). Chaque mĂ©thode ne peut donc modifier qu’un objet d’un connector space ou de la mĂ©taverse Ă  la fois.

Initialize

Cette mĂ©thode est exĂ©cutĂ©e la première fois qu’une règle d’extension est appelĂ©e lors de l’exĂ©cution d’un Management Agent. Elle permet de gĂ©rer un code d’initialisation du Management Agent comme le chargement de paramètres via un fichier XML (exemple : des paramètres de logging, une ouverture de connexion Ă  une base de donnĂ©es).

Terminate

Contrairement Ă  la première mĂ©thode, celle-ci est appelĂ©e lorsqu’aucune règle d’extension n’a Ă©tĂ© exĂ©cutĂ©e depuis 5 minutes (FIM considère alors que la synchronization est terminĂ©e). Celle-ci est utilisĂ©e pour libĂ©rer des ressources qui auraient pu ĂŞtre instanciĂ©es pendant la mĂ©thode initialize (exemple : clore la connexion Ă  une base de donnĂ©es).

ShouldProjectToMV

Il s’agit d’une mĂ©thode influant le comportement des règles de projection. En temps normal, si aucune règle de jointure ne permet de crĂ©er un connecteur alors un objet d’un connector space est créé si une règle de projection a Ă©tĂ© dĂ©fini. Lorsque cette dernière est configurĂ©e pour utiliser une règle d’extension alors on peut utiliser cette mĂ©thode pour traiter des cas particulier. En effet, le retour de cette mĂ©thode dĂ©finit si l’objet doit ĂŞtre projeter dans la mĂ©taverse ou non.

Deprovision

La mĂ©thode Deprovision est en charge de dĂ©finir l’action de deprovisioning lorsqu’un objet d’un connector space est dĂ©connectĂ© suite Ă  la suppression de son Ă©quivalent dans la mĂ©taverse. Au lieu de dĂ©finir une seule action possible comme nous l’avions vu dans les articles sur la configuration des Management Agent, on peut choisir de calculer cette action en fonction de paramètres spĂ©cifiques. Les actions possibles restent les mĂŞmes :

  • DĂ©connexion (l’objet peut ĂŞtre reconnectĂ© s’il satisfait une règle de jointure ou une règle de projection)
  • DĂ©connexion explicite (l’objet ne peut ĂŞtre reconnectĂ© automatiquement, il faut alors utiliser l’onglet Joiner)
  • Suppression (dans le connector space puis sur le système connectĂ© lors du prochain export)

FilterForDisconnection

Cette mĂ©thode permet de dĂ©finir un filtre personnalisĂ© pour exclure des objets du connector space d’ĂŞtre synchronisĂ©. Cela correspond Ă  la règle d’extension que l’on peut configurer dans l’onglet Configure Connector Filter.

MapAttributesForJoin

MapAttributesForJoin offre la possibilitĂ© d’ajouter des valeurs calculĂ©s pour effectuer une jointure. Cette dernière retourne une collection d’attributs prĂ©sent sur l’objet du connector space ou ajoutĂ©es par cette fonction.

ResolveJoinSearch

Grâce Ă  cette mĂ©thode, il est possible d’affiner la rĂ©solution d’une jointure lorsque des règles directes ne peuvent pas faire correspondre un objet d’un connector space avec un objet de la metaverse. En effet, il est ainsi possible d’Ă©viter le cas oĂą plusieurs objets de la metaverse correspondent.

MapAttributesForImport

et

MapAttributesForExport

Il s’agit des mĂ©thodes permettant de gĂ©rer les flux d’attributs entre la metaverse et le connector space (et Ă  fortiori le système connectĂ©). La première est en charge des modifications d’attributs lors des opĂ©rations d’import (connector space vers metaverse) tandis que la seconde est utile pour les opĂ©rations d’export. Grâce Ă  elles, il est possible de transformer des attributs. On peut aussi utiliser plusieurs attributs en entrĂ©e pour calculer la valeur d’un attribut en sortie. La mĂ©thode MapAttributesForImport ne permet de modifier qu’un objet de la mĂ©taverse (l’objet correpondant dans le connector space n’est accessible qu’en lecture) et vice versa pour la mĂ©thode MapAttributesForExport.

NB : Par défaut, toutes les méthodes possèdent la ligne de code ci-dessous :

Celle-ci signifie qu’aucun traitement n’a Ă©tĂ© implĂ©mentĂ©. NĂ©anmoins, il n’est pas nĂ©cessaire de changer ce comportement pour les mĂ©thodes qui ne seront jamais appelĂ©es par le Management Agent.

Les variables

csentry

Cette variable correspond Ă  l’objet au sein du connector space en cours d’accès.

mventry

Cette variable correspond Ă  l’objet au sein de la mĂ©taverse en cours d’accès.

flowRuleName

Il s’agit du nom de la règle qui a Ă©tĂ© dĂ©fini dans le Mangement Agent. En effet, la dll contient toutes les règles d’extension. Par exemple, si nous dĂ©finissons plusieurs règles avancĂ©es d’import lors du flux d’attribut, le code associĂ© pour celles-ci sera inclus au sein de la mĂ©thode MapAttributesForImport. Cette variable permet ainsi de savoir qu’elle règle a Ă©tĂ© appelĂ©e pour exĂ©cutĂ©e le bon traitement. La convention est d’utiliser une structure algorithmique de type switch sur la valeur de cette variable pour diffĂ©rencier les règles d’extensions (nous verrons cette structure dans le paragraphe suivant).

Exemple de règle d’import

Le but de cet exemple simple et de montrer le code nĂ©cessaire Ă  la standardisation du format de l’attribut firstname comme nous l’avons vu au dĂ©but de cet article lors de la configuration de la règle d’extension.

Astuce : Si vous ajouter toutes vos règles d’extension dans la configuration du Management Agent avant de crĂ©er le projet Visual Studio alors la structure algorithmique contenant les diffĂ©rents nom de règles est prĂ© gĂ©nĂ©rĂ©e. Cela facilite encore plus le dĂ©veloppement.

msohtmlclipclip_image007

Vous trouverez ci-dessous la fonction MapAttributesForImport complète. On remarque qu’un test est effectuĂ© afin de savoir si l’objet du connector space possède une valeur pour l’attribut firstname. Si tel est le cas, la valeur est rĂ©cupĂ©rĂ©e(grâce Ă  la variable csentry) via la propriĂ©tĂ© value. Elle est ensuite formatĂ©e (première lettre de chaque mot en majuscule) puis affectĂ©e Ă  l’objet correspondant dans la mĂ©taverse (via la variable mventry) Le cas par dĂ©faut remonte une erreur d’implĂ©mentation si aucune règle porte le bon nom de la structure de type switch :

Il ne reste plus qu’Ă  compiler la solution via le menu Build afin que la dll soit gĂ©nĂ©rĂ©e dans le rĂ©pertoire adĂ©quat. Cet exemple se veut simple mais il est possible d’imaginer des cas de personnalisations beaucoup plus complexes ou faisant intervenir d’autres types de configuration (filtrage, jointure, …) via les autres mĂ©thodes disponibles.

NB : MĂŞme si cette possibilitĂ© n’a pas Ă©tĂ© utilisĂ©e dans cet exemple, une mĂ©thode permet de rechercher des objets dans la mĂ©taverse. Ces derniers ne sont toutefois accessibles qu’en lecture. NĂ©anmoins cela peut ĂŞtre utile pour consolider des informations dans l’objet en cours de traitement (le manager d’un employĂ© par exemple). L’une des façons les plus simples de l’utiliser correspond Ă  l’exemple ci-après :

Le premier paramètre est le nom de l’attribut sur lequel la recherche est effectuĂ©e (quelque soit le type d’objet) tandis que le second correspond Ă  la valeur attendue. Il est fortement recommandĂ© d’effectuer cette recherche sur des attributs indexĂ©s afin d’optimiser le temps de traitement.

SCOM – Script Rapport Etat des instances d’une liste de classe (Sortie Cmdline)

Le script ci-dessous génère un rapport formaté dans la ligne de commande, de l’état des instances d’une liste de classe.

#SCOM - SCRIPT DE REQUETE D'ETAT DES OBJETS D'UNE LISTE DE CLASSE #Variables $MGroup = "MyGroup" $MS= "MyMS" $cred = Get-Credential "MyDomain\" #Liste de classe a recuperer $ClassList = ('SQL DB Engine','SQL Database','SQL DB File','SQL Agent','SQL Reporting Services','SQL Analysis Services') #Import du module SCOM try { Import-Module -Name OperationsManager -ErrorAction stop } catch { write-host -ForegroundColor red "Erreur lors de l'import du module SCOM" } #Connection au management group $MGroup New-SCOMManagementGroupConnection -ComputerName $MS -Credential $cred #Recuperation des classes $MonitoringClasses = $ClassList | foreach {Get-SCOMClass -DisplayName $_} if ($MonitoringClasses -eq $null) { write-host "ERROR - UNABLE TO RETRIEVE CLASSES" -ForegroundColor red } write-host "#################################################### `n" write-host "SCOM Management Group: $MGroup `n" write-host "#################################################### `n`n" #Recuperation des instances de chaque classe foreach ($class in $MonitoringClasses) { $MonitoringObjects = $class | Get-SCOMClassInstance -erroraction silentlycontinue | Sort-Object -Descending -Property HealthState write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n" write-host -BackgroundColor white -ForegroundColor blue " *** OBJETS DE LA CLASSE "$class.displayname" `n" write-host -BackgroundColor white -ForegroundColor blue " **************************************************************** `n`n" write-host " --- $(get-date -Format F) --- `n`n" write-host " NUMBER OF OBJECT: $($MonitoringObjects | measure-object | select-object -property count -expandproperty count) `n`n" write-host " STATE ----------------- OBJECT`n`n" foreach ($object in $MonitoringObjects) { switch ($object.HealthState) { "Success" {write-host " " -NoNewline ; write-host -ForegroundColor green $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ; write-host $object.FullName} "Error" {write-host " " -NoNewline ; write-host -ForegroundColor red $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Warning" {write-host " " -NoNewline ; write-host -ForegroundColor yellow $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} "Uninitialized" {write-host " " -NoNewline ; write-host -ForegroundColor blue $object.HealthState -NoNewline ; write-host " -------- " -NoNewline ;write-host $object.FullName} } } "`n" } #Fermeture de la connexion Get-SCOMManagementGroupConnection | Remove-SCOMManagementGroupConnection