PI Services

Le blog des collaborateurs de PI Services

Active Directory: Windows Server 2008 DCPROMO en erreur

Problème:

Sur Windows Server 2008 quand vous réalisez la rétrogradation d'un contrôleur de domaine à simple serveur membre, vous pouvez rencontrer une erreur de type :

"Operations which require contacting a FSMO operation master will fail until this condition is corrected"

Ce problème se produit quand la commande essaie de contacter le maître d'infrastructure et qu'elle echoue pour une des raisons suivantes:

  • La ou les partitions mentionnées dans le message d'erreur ne sont plus existantes.
  • Le maître d'infrastructure pour la ou les partitions mentionnées, a été rétrogradé de force ou est hors ligne (hors réseau ou éteint).

Solution:

Dans le premier cas de figure Microsoft préconise un nettoyage des métadonnées de la partition orpheline en utilisant l'outils Dsmgmt (cf: http://technet.microsoft.com/en-us/library/cc730970(ws.10).aspx ).

Dans le deuxième cas de figure il suffit de spécifier un propriétaire du rôle maître d'infrastructure qui est "En ligne", pour cela vous pouvez exécuter le script suivant à l'aide de la commande :

cscript fixfsmo.vbs DC=DomainDnsZones,DC=VotreNomDeDomaine,DC=XXX (Remplacez XXX par votre extension: fr, com, lan, biz...)

Le script:

Le script ci-dessous permet de modifier l'attribut "fSMORoleOwner" dans le domaine spécifié dans la ligne de commande.

'-------fixfsmo.vbs------------------
const ADS_NAME_INITTYPE_GC = 3
const ADS_NAME_TYPE_1779 = 1
const ADS_NAME_TYPE_CANONICAL = 2

set inArgs = WScript.Arguments

if (inArgs.Count = 1) then
    ' Assume the command line argument is the NDNC (in DN form) to use.
    NdncDN = inArgs(0)
	Else
    Wscript.StdOut.Write "usage: cscript fixfsmo.vbs NdncDN"
	End if
	
if (NdncDN <> "") then

' Convert the DN form of the NDNC into DNS dotted form.
    Set objTranslator = CreateObject("NameTranslate")
    objTranslator.Init ADS_NAME_INITTYPE_GC, ""
    objTranslator.Set ADS_NAME_TYPE_1779, NdncDN
    strDomainDNS = objTranslator.Get(ADS_NAME_TYPE_CANONICAL)
    strDomainDNS = Left(strDomainDNS, len(strDomainDNS)-1)
	
	Wscript.Echo "DNS name: " & strDomainDNS
    
	' Find a domain controller that hosts this NDNC and that is online.
    set objRootDSE = GetObject("LDAP://" & strDomainDNS & "/RootDSE")
    strDnsHostName = objRootDSE.Get("dnsHostName")
    strDsServiceName = objRootDSE.Get("dsServiceName")
    Wscript.Echo "Using DC " & strDnsHostName

    ' Get the current infrastructure fsmo.
    strInfraDN = "CN=Infrastructure," & NdncDN
    set objInfra = GetObject("LDAP://" & strInfraDN)
    Wscript.Echo "infra fsmo is " & objInfra.fsmoroleowner
	
	' If the current fsmo holder is deleted, set the fsmo holder to this domain controller.
    if (InStr(objInfra.fsmoroleowner, "\0ADEL:") > 0) then
	' Set the fsmo holder to this domain controller.
	objInfra.Put "fSMORoleOwner",  strDsServiceName
	objInfra.SetInfo
	
	' Read the fsmo holder back.
	set objInfra = GetObject("LDAP://" & strInfraDN)
	Wscript.Echo "infra fsmo changed to:" & objInfra.fsmoroleowner
	
    End if
	
End if	

 

Une fois le script exécuté vous devriez pouvoir rétrograder votre contrôleur de domaine, si toutefois le problème persistait il faudra passer par la console ADSI Edit.

Erreur lors du gpprep lors d'une migration AD 2003 vers AD 2016

 

Dans le cadre d'une migration depuis des contrôleurs de domaines Windows Server 2003 vers des contrôleurs de domaine en Windows Server 2016 après avoir effectué l'extension du schéma ainsi que le forestprep et le domainprep avec succès, le gpprep échoue avec l'erreur suivante:

Gpprep operation 3 failed.

Upgrade of domain Group Policy Objects failed.

Adprep encountered a Win32 error.
Error code: 0x41 Error message: Network access is denied.

Le cas initial dans lequel cette erreur a été rencontrée est le suivant:

  • Extension du schéma, forestprep, domainprep, gpprep exécutés depuis un serveur Windows Server 2016, qui n'est pas contrôleur de domaine et qui est en WORKGROUP et un compte ayant les droits suffisants. En effet l'upgrade de schéma depuis un serveur en workgroup est possible en spécifiant les crédentials et les foret/domaine en paramètres sur les différentes commandes.

L'upgrade a ensuite été de nouveau tentée dans le cadre suivant:

  • Extension du schéma, forestprep, domainprep, gpprep exécutés depuis un serveur Windows Server 2016, qui n'est pas contrôleur de domaine et qui est membre du domaine.

Résultat: Même erreur que dans le cas initial.

Enfin, l'upgrade a été lancée dans l'environnement suivant:

  • Extension du schéma, forestprep, domainprep, gpprep exécutés depuis un serveur Windows Server 2016, qui a été promu contrôleur de domaine au préalable et donc membre du domaine.

Résultat: Gpprep réussi.

Le fait que le GPPREP échoue, n'est pas un point bloquant pour le passage vers AD 2016, cependant il pourrait y avoir des répercussions sur les différentes GPO existantes si les modifications réalisées par le GPPREP ne sont pas appliquées correctement.

Il est également possible de faire l'ensemble des opérations depuis un serveur 2016 qui n'est pas encore contrôleur de domaine, et si le gpprep échoue, le relancer plus tard, une fois le serveur promu en tant que contrôleur de domaine.

 

Clients disparaissant aléatoirement dans la console WSUS

Contexte

Lors du déploiement d'un nouveau serveur WSUS, des serveurs ou postes de travail apparaissent et disparaissent de la console sans raison logique au premier abord.

Explication

Si les clients apparaissent et disparaissent de la console par intermittence, le soucis vient probablement du SUSClientID.

Cette situation peut arriver quand un serveur est cloné et que les clés de registre liées au SUSclientID ne sont pas modifiées, ou dans le cas des postes de travail, le problème peut se poser si les postes sont déployés via une image système mal configurée (pas de sysprep). 

Résolution

La solution a ce problème est relativement simple une fois que les différents clients concernés ont été identifiés.

Sur chaque client concerné, supprimez clés de registre suivantes:

  • SusClientId
  • SusClientIDValidation

Ces clés sont situées à la racine de la ruche: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate

Ouvrez ensuite une invite de commande en mode administrateur et exécutez les commandes suivantes:

  • wuauclt.exe /resetauthorization / detectnow
  • wuauclt.exe /detectnow

Il faut refaire ces actions sur chaque poste client/serveur concerné.

Les clients devraient ensuite remonter sans soucis dans la console WSUS.

 

Centraliser les ADMX dans le Group Policy Central Store

 

Dans le cadre de la gestion des GPO, il arrive de temps en temps d'avoir des temps de chargement très long lorsque que l'on tente d'accéder à certains paramètres dans la console Group Policy Management, ce problème est peut être lié à des ADMX qui ont été chargés dans la console depuis un poste client et qui ne sont pas accessibles lorsque vous ouvrez la console.

 

Afin de régler ce problème qui peut être récurrent et gênant lors de l'administration des GPOs, il est conseillé de créer une banque centrale contenant les différents fichiers ADMX.

Afin de créer le magasin Central pour les fichiers .admx et .adml (les .adml sont les fichiers de langue correspondant aux .admx), créez un dossier nommé PolicyDefinitions à l’emplacement suivant sur un contrôleur de domaine :

\\contoso.com\SYSVOL\contoso.com\policies

Après avoir copié tous les fichiers .admx et .adml, le dossier PolicyDefinitions sur le contrôleur de domaine doit contenir les fichiers .admx et un ou plusieurs dossiers contenant les fichiers spécifiques à une langue .adml.

Les fichiers étant contenu dans le SYSVOL qui est répliqué, il ne devrait plus y avoir de lenteurs liées aux .admx lors de l'ouverture de la console GPMC. 

Identifier le certificat correspondant à l’attribut AD UserCertificate ou cACertificate

Dans le cadre de la gestion des certificats dans Active Directory, il arrive que l’on retrouve des valeurs de ce type pour les attributs UserCertificate ou CaCertificate:

 image

Ce type de champ est difficilement lisible et cela peut donc complexifier la tâche lorsque l’on veut supprimer un certificat déployé en doublon, ou tout simplement un certificat avec des informations erronées.

Pour rapidement différencier les certificats il suffit de suivre les étapes suivantes:

Copier le contenu Hexadécimal dans un fichier texte :

image

image

image

Exécuter la commande suivante :

Certutil –decodehex C:\Temp\HexValue.txt C:\Temp\OutputCert.cer

image

Le résultat de la commande est un fichier .cer que l’on peut ouvrir et qui contiendra les attributs du certificat de manière lisible, ces opérations doivent être répétées sur les différentes entrées pour chaque certificat à identifier.

image

image

FIM Synchronization Service Partie 5 : Administration de FIM / Gestion de la metaverse

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 :

Lors de cette cinquième partie, je vais évoquer l'administration du service de synchronisation de FIM avec d'une part l'administration des Managements Agents et d'autre part la gestion de la métaverse. Pour cette dernière, nous verrons notamment comment ajouter des attributs ou même créer des objets afin de ne pas se limiter à ceux par défaut. Enfin, nous aborderons la gestion du cycle de vie des objets dans la métaverse et les différentes configurations possibles.  

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.

Administration

Vérification du résultat d'une synchronisation

Dans l'article précèdent, nous avons vu comment créer des profils de synchronisation. Lorsque ces derniers sont exécutés, nous pouvons accéder au détail des actions effectués dans l'onglet Operations de la console de gestion de FIM Synchronization Service. Ainsi, dans l'exécution ci-dessous, on remarque que quatre objets n'ont pas été modifiés lors de l'import dans le connector space Active Directory tandis que trois ont été projetés dans la métaverse pendant la phase de synchronisation (un objet a été filtré). Il est aussi possible d'avoir le listing de ses objets en cliquant sur le chiffre indiquant le nombre de changement. Ainsi, il est possible à chaque étape d'avoir un véritable contrôle des modification.

Image

Recherche dans la metaverse

Il est possible de vérifier l'état d'un objet dans la métaverse. Pour ce faire, il suffit de se rendre dans l'onglet Metaverse Search. Ensuite, il faut indiquer un filtre. Ce dernier est composé :

  • Du type d'objet à rechercher.

  • D'une ou plusieurs conditions contenant des valeurs attendus pour les attributs de l'objet.

Un clic sur le bouton Search permet de lancer la recherche.

Image

Lorsque l'on ouvre les propriétés d'un objet retourné lors de la recherche, tous ses attributs sont affichés. On remarque également la date de dernière modification de ceux-ci ainsi que le Management Agent ayant écrit cette valeur (utile dans le cas de plusieurs Management Agent contribuant à un même objet dans la métaverse).

Image

Enfin, dans l'onglet Connectors d'un objet, on accède à tous les connecteurs de l'objet. Ci-dessous on remarque le connecteur avec le référentiel SQL. Ce dernier a été créé avec une règle de projection. Lorsqu'un import et une synchronisation auront lieu avec le Management Agent Active Directory, un deuxième connecteur avec une règle de jointure sera présent.

Image

Recherche dans un connector space

Il est aussi possible de rechercher des objets dans un connector space via le bouton Search Connector Space présent dans le menu des actions de chaque Management Agent.

Image

La recherche est cette fois-ci moins simple puisqu'il n'est possible de faire une recherche qu'au travers du DN (pour rappel, dans le Management Agent SQL que nous avons configuré précédemment, il s'agit de l'id) ou d’une partie de celui-ci (l’unité d’organisation pour un objet Active Directory par exemple).

Image

Comme pour les objets présents dans la métaverse, il est possible de voir leurs propriétés via l'onglet Import. L'onglet Lineage permet d'accéder à son status (si l'objet est connecté ou non à la métaverse). Ici, j'ai ouvert la fiche de l'objet dmills qui est un travailleur détaché. Pour rappel, dans note exemple, ces derniers ne doivent pas être synchronisés, c'est pourquoi il apparaît en tant que filtered disconnector.

Image

Enfin sur chacun des onglets d'un objet,  un bouton Preview est présent. Ce dernier fourni un outil pour pré visualiser les changements lors d'une synchronisation complète (Full) ou incrémentielle (Delta). Cet outil est utile pour effectuer des tests. Si les résultats sont ceux attendus, il est même possible de les enregistrer avec le bouton Commit Preview. Ainsi, il n'est pas nécessaire de relancer un profil d'exécution de synchronisation.

Image

Grâce aux outils que nous venons de voir (onglet Operations, recherche dans la metaverse et dans un connector space, outil de prévisualisation), il est possible de connaitre à chaque instant l'état d'un objet et d'identifier rapidement les erreurs de configuration.

Export / import d'un Management Agent

Dans l'onglet Management Agent, il est possible d'exporter ou d'importer un Management Agent. Ces opérations offrent plusieurs possibilités :

  • Sauvegarde / Restauration : Cela permet de conserver les paramètres de configuration d'un Management Agent et de les réinjecter en cas d'une erreur de configuration.
  • Migration / Passage en production : La configuration d'un Management Agent peut être transférer d'un serveur à un autre lorsque ce dernier est changé ou lorsque l'on possède plusieurs environnement et que l'on souhaite transférer la configuration à l'identique d'un environnement à un autre (exemple : du développement à la production).  Il reste alors simplement à insérer les paramètres de production (comme le domaine, le compte de service ou encore les unités d'organisation d'un Management Agent Active Directory). Attention : lorsqu'un Management Agent est importer d'un serveur à un autre, il est nécessaire de copier les DLL déclarées. Ces dernières ne sont pas inclues dans l'export.

NB : Lorsqu'un Management Agent est modifié, il est nécessaire de déclencher une opération de Full Import afin de prendre en compte les nouvelles règles pour tous les objets du connector space. 

Gestion de la metaverse

La métaverse est le point central des données de l'environnement FIM Synchronization Service. Chaque objet d'un connector space qui possède un connector est lié à un objet de la métaverse. Pour rappel, un objet de la métaverse peut avoir plusieurs connectors. En effet, ces différentes propriétés peuvent être alimentés par plusieurs systèmes connectés comme c'est le cas pour la société "MyCompany". Chaque objet de type person est connecté à un collaborateur du référentiel SQL et un utilisateur Active Directory. Aussi, un certain nombre de propriétés sont paramétrable sur la métaverse, son fonctionnement et les objets qui la compose. Toutes ces actions se déroulent dans l'onglet Metaverse Designer de la console de gestion de FIM Synchronization Service.

Modification d'objets

Pour chaque objet, il est possible de les modifier en ajoutant ou supprimant des attributs. Cela permet de synchroniser des informations complémentaires. Pour ce faire, il suffit de sélectionner le type d'objet puis de cliquer sur le bouton Add Attribute dans le panel Actions (en bas à droite). Une fenêtre listant tous les attributs disponibles s'ouvre. Elle contient tous les attributs déjà déclarés dans la métaverse. Pour en ajouter un à un objet, il suffit de cocher la case de l'attribut concerné.

01

Aussi, si ce dernier n'existe pas dans la liste, il peut être créé via le bouton New Attribute. Grâce à cette option, pour la société "MyCompany", on peut ajouter la propriété Status permettant de synchroniser cette valeur contenue dans le référentiel SQL vers la métaverse (il faut aussi ajouter une règle de flux d'attribut dans le Management Agent SQL et éventuellement dans le Management Agent Active Directory si l'on souhaite exporter cette valeur vers cet annuaire).

02

Lorsque l'on ajoute un nouvel attribut, il existe plusieurs possibilités. Tout d'abord un objet être de plusieurs types :

  • Chaîne de caractère (String)
  • Valeur binaire (Binary)
  • Nombre (Number)
  • Bouléen (Boolean)
  • Référence (Reference)

Les types chaîne de caractère, binaire et nombre peuvent être indexés ou non en cochant la case Indexed. Cela permet d'optimiser les recherches d'objets sur ces attributs. A noter qu'une bonne pratique est d'indexer tous les champs sur lesquels une jointure peut être effectuée afin d'optimiser l'opération de recherche d'un objet correspondant dans la métaverse. Aussi, en dehors du champ Boolean, tous les attributs peuvent être multi-évalué et donc contenir une liste de valeurs (exemple : le champs userCertificate d'Active Directory qui contient tous les certificats d'un utilisateur). Enfin, le type Reference permet d'indiquer une référence vers un autre objet de la métaverse. Cela peut notamment être utilisé dans le cadre de la synchronisation du manager d'une personne ou encore de la liste des membres d'un groupe.

Création d'objets

En complément de la modification d'objet, il est aussi possible d'en ajouter de nouveaux au travers de l'onglet Metaverse Designer. Cela permet de gérer d'autres types d'objets que vous aurez conçu vous-même comme les contacts. Pour créer un objet, il suffit de cliquer sur Create Object Type dans le menu Actions

03

NB : L'action Copy Object Type, permet de dupliquer un type d'objet ainsi que ses propriétés (le type sélectionné sert alors de modèle).

Ensuite, il faut entrer le type d'objet à créer et éventuellement ajouter les attributs qui le caractérise (comme nous l'avons vu dans le paragraphe précédent, cela peut être modifié ultérieurement).

05

Flux d'attributs

Lorsque plusieurs systèmes connectés interagissent avec le même attribut, il est possible de choisir celui qui aura la priorité pour en définir la valeur. Cette opération s'effectue en sélectionnant un attribut sur l'un des types d'objet déclarés dans l'onglet Metaverse Designer puis en cliquant sur le bouton Configure Attribute Flow Precedence (on remarque dans l'exemple ci-dessous que l'attribut accountName possède deux règles d'import, il faut donc déterminer l'ordre d'application).

06

L'assistant qui s'ouvre montre les Management Agents qui ont une règle de flux avec l'attribut sélectionné. La configuration par défaut indique que le premier Management Agent synchronisant une valeur (par ordre croissant) est autoritaire. Ainsi dans l'exemple ci-dessous le Management Agent Active Directory MA est prioritaire. RefIdentité MA ne sera utilisé pour cet attribut que si aucune valeur n'est fournie par l'autre Management Agent. Ainsi, même si une nouvelle valeur est transmises par le Management Agent RefIdentité MA, elle ne sera pas prise en compte. Il est possible de changer cet ordre avec les flèches présentes dans l'assistant.

NB : Dans cet exemple, un changement de nom de compte impliquerai de déconnecté un objet puisque l'attribut samAccountName est utilisé pour la jointure de l'objet auprès de la Métaverse.

07

Aussi deux options sont disponibles pour ce paramétrage :

  • Use manual precedence : Il est possible de définir la priorité d'un Management Agent manuellement. Cela n'est possible que pour les règles de flux personnalisées (type Rules Extension) qui ont été développés en C# ou VB.Net.
  • Use equal precedence : Chaque Management bénéficie d'une priorité identique. Ainsi, s'il s'agit d'un attribut possédant une valeur unique, le dernier Management Agent qui s'est exécuté contribue à la valeur dans la métaverse (cela peut donc provoquer des effets de bord avec des changements à chaque exécution de Management Agent). Dans le cas où l'attribut est une liste de valeur, FIM réalise une fusion des différentes valeurs.

Déprovisioning

Par défaut, un objet présent dans la métaverse est supprimé lorsqu'il n'a plus aucun connecteur avec un Management Agent. Cependant, ce comportement peut être modifié. Cela s'effectue via le bouton Object Deletion Rule présent dans la configuration de chaque type d'objet de la métaverse.

03 Bis

Pour l'option par défaut, on remarque qu'il existe une liste de tous les Management Agent. En effet, il est possible d'ignorer certains Management Agent en les cochant. Ainsi lorsque la règle sera évaluée, elle ne prendra pas en compte les connector space des Management Agent sélectionnés pour savoir si l'objet doit être supprimé.

04

La seconde option (Delete the metaverse object when the last connector space object from a specified management agent is disconnected), consiste à supprimer l'objet dès qu'il n'y a plus de lien avec l'un des connector space. Contrairement à la première option, la liste de Management Agent permet ici de définir les connector space associés qui seront utilisés pour évaluer la suppression.

Enfin, la dernière option offre la possibilité de gérer la suppression d'un objet de la métaverse au travers d'une règle développée en C# ou VB.Net. Cela permet de gérer des cas plus spécifiques.

Joiner

L'outil Joiner est un outil intégré dans la console de gestion de FIM 2010 Synchronization Service consacré à la manipulation des disconnectors d'un Management Agent. Ainsi, il est possible de traiter ces objets afin de les connecter à la métaverse via une projection ou une jointure ou de les écarter définitivement via un disconnector explicite. Toutes ces opérations sont manuelles. 

Pour effectuer une opération sur un objet dans l'onglet Joiner, il suffit d'effectuer une recherche par Management Agent en le sélectionnant dans le champ adéquat puis en cliquant sur le bouton Search (avant cela il est possible de réaliser un filtre plus spécifique en choisissant un type de disconnector).  

08

Le type de Disconnector peut être changé lorsqu'on sélectionne un objet puis que l'on clique sur le bouton Set Disconnector Type. Par exemple, on peut souhaitez qu'un objet ne soit plus traiter par le Management Agent et qu'il soit définitivement écarté de tout traitement. Il faut alors définir un Explicit Disconnector. Aussi, même si l'objet satisfait toutes les règles de filtrages ultérieurement, il ne sera pas synchronisé tant que le Disconnector sera de type explicite. Il faudra tout d'abord rechanger ce dernier via une nouvelle opération dans l'onglet Joiner.

09

Lorsqu'un objet est sélectionné, il est possible de le joindre à un objet de la métaverse. Pour ce faire, il est nécessaire de réaliser une recherche sur celle-ci afin de trouver l'objet correspondant. Cette opération est réalisée en créant un filtre avec le bouton Configure Search Filter. Un assistant s'ouvre alors et il est nécessaire de cliquer sur le bouton Add pour ajouter un filtre.

10

Ce dernier peut rechercher des objets en fonction du type ainsi qu'en fonction d'une valeur sur un attribut. 

11

Le bouton Apply Filter déclenche la recherche. La jointure s'effectue en cliquant sur le bouton Join après avoir sélectionné un objet de la métaverse (un avertissement permet de confirmer l'opération). Toutefois, il reste aussi possible d'effectuer une projection (bouton Project) sans passer par le filtrage si l'objet n'existe pas dans la métaverse. Les opérations effectuées dans l'onglet Joiner n'ont pas besoin de respecter les filtres configurés dans le Management Agent gérant l'objet traité.

12

Active Directory : Réinitialiser les mots de passe en masse avec Powershell

Bonjour,

Suite à une demande client voici un script qui permet de réinitialiser les mots de passe d'utilisateurs via un fichier CSV.

Présentation du fichier CSV :

 Dans le fichier csv, nous avons renseigné la liste des comptes utilisateurs dont le mot de passe doit être réinitialisé; afin de limiter les erreurs, nous nous appuyons sur le "SamAccountName".

Présentation du Script :

 

# Réinitialisation des mots de passe utilisateurs à  partir d'un fichier Csv

# Définition des variables de bases

$Server ="DC01.lab.info"  # Déclarez ici le serveur d'exécution
$Input ="C:\Mon_Dossier\Mon_Fichier.csv" # Entrez Ici le chemin d'accès à son fichier csv
$LogFolder = "C:\LogMathieu" # Déclarez ici l'emplacement du répertoire de Log
$Folder = "LogMathieu" # Déclarez ici le nom du répertoire de Log
$LogFile = "C:\LogMathieu\LogScript.txt" # Déclarez ici l'emplacement du fichiers de Log du script
$File = "LogScript.txt" # Déclarez ici le nom du fichier de Log du script
$LogError = "C:\LogMathieu\LogError.txt" # Déclarez ici l'emplacement du fichier d'erreur global
$LogCatch = "C:\LogMathieu\LogCatch.txt" # Déclarez ici l'emplacement du fichier de gestion de l'erreur
$FileCatch = "LogCatch.txt" # Déclarez ici le nom du fichier de gestion de l'erreur 

# Avant de commencer nous allons créer un répertoire et un fichier pour les logs 
 
if (!(Test-Path $logfolder)) {
 
    New-Item -Name $Folder -Path C:\ -type directory
    New-Item -Name $File -Path $LogFolder -type file
    New-Item -Name $FileCatch -Path $LogFolder -type file
    Write-Output "Le dossier $Folder n'existait pas, création du Dossier $Folder, du fichier $File et $FileCatch" | Add-Content $LogFile
                                }
Else {
    Write-Output "Le dossier $Folder existe déjà!" | Add-Content $LogFile
        }
 
# Import du module Active Directory et import du fichier csv
 
Import-Module ActiveDirectory

Import-Csv -Path $Input | Foreach-Object{
    $SAN=$_."User"

    Try {
        Set-ADAccountPassword -Identity "$SAN" -NewPassword:(ConvertTo-SecureString -AsPlainText "P@ssw0rd" -Force) -Reset:$True -Server:$Server | Set-ADUser -ChangePasswordAtLogon:$true -ErrorAction Stop -ErrorVariable PB
            }
    Catch {
        "Une erreur $PB a eu lieu à  $((Get-Date).DateTime)" | Add-Content $LogCatch
            }
    Finally{
        "Fin de l'opération"
            }
                                            }

$Error > $LogError

 

Active Directory : Importation d'utilisateurs en masse avec Powershell

Bonjour,

Je vous présente un petit script powershell que j'utilise pour réaliser des maquettes ou en production selon le besoin.

Le but de ce script est de pouvoir créer et renseigner des comptes utilisateurs a partir d'un fichier CSV contenant les informations relatives aux comptes.

Ce dernier permet dans un active directory :

  • De tester la présence des Unités d'Organisations et les créer si elles n'existent pas.
  • De tester si les utilisateurs existent (le test est basé sur le SamAccountName).
  • De créer les comptes utilisateurs avec les informations renseignées.
  • De définir un de mot passe.
  • D'activer les comptes.
  • De placer les utilisateurs dans les bonnes Unités d'Organisations.

Présentation du CSV

Dans ce cas de figure je remplis un certain nombre de champs, mais en fonction de ce que l'on souhaite renseigner dans le compte utilisateur il suffit d'incrémenter le fichier CSV et bien sur d'ajouter les paramètres associés dans la ligne de code permettant la création de l'utilisateur.  

Le fichier csv a été réalisé avec l'application excel et contient les informations suivantes :

  • GivenName : Le Prénom
  • Surname : Le Nom
  • Name : Prénom Nom
  • SammAccountName : L'identifiant
  • DisplayName : Le nom d'affichage
  • Description : Une description du compte
  • Company : Le nom de la société
  • Department : Le nom du Service
  • EmailAddress : L'adresse mail
  • OfficePhone : Le numéro de téléphone
  • Title : L'intitulé du poste
  • OrganizationalUnit : L'unité d'organisation dans laquelle sera placé le compte

 

Une fois le fichier créé, enregistrez le au format "CSV", notez le chemin d'accès au fichier dans un coin il vous servira ultérieurement.

Présentation du Script

  

 Ci dessous le script Powershell, j'attire votre attention sur le fait qu'il fonctionne pour des Unités d'Organisation de premier niveau si vous possédez ou souhaitez utiliser des sous OU il faudra faire des modifications dans le script (voir la partie Bonus plus bas).

# Script de création d'Utilisateur

#Déclaration des variables
$Domain = "Lab"  # Déclarez ici votre Domaine
$Ext = "info"  # Déclarez ici l'extension (com, info, lan, local....)
$Server ="DC01.lab.info"  # Déclarez ici le serveur d'exécution
$FQDN ="@lab.info"  # Déclarez ici le nom du Domaine précédé de "@" cela servira pour la création du UserPrincipalName
$LogFolder = "C:\LogMathieu" # Déclarez ici l'emplacement du répertoire de Log
$Folder = "LogMathieu" # Déclarez ici le nom du répertoire de Log
$LogFile = "C:\LogMathieu\LogScript.txt" # Déclarez ici l'emplacement du fichiers de Log du script
$File = "LogScript.txt" # Déclarez ici le nom du fichier de Log du script
$LogError = "C:\LogMathieu\LogError.txt" # Déclarez ici l'emplacement du fichier d'erreur global 
$LogCatch = "C:\LogMathieu\LogCatch.txt" # Déclarez ici l'emplacement du fichier de gestion de l'erreur
$FileCatch = "LogCatch.txt" # Déclarez ici le nom du fichier de gestion de l'erreur
$CSV = "C:\Users\Mathieu\Desktop\Import\Utilisateurs_Maquette.csv" # Déclarez ici le chemin d'accès à votre fichier csv


# Avant de commencer nous allons créer un répertoire et un fichier pour les logs


if (!(Test-Path $logfolder)) {

    New-Item -Name $Folder -Path C:\ -type directory
    New-Item -Name $File -Path $LogFolder -type file
    New-Item -Name $FileCatch -Path $LogFolder -type file
    Write-Output "Le dossier $Folder n'existait pas, création du Dossier $Folder, du fichier $File et $FileCatch" | Add-Content $LogFile
                                }
Else {
    Write-Output "Le dossier $Folder existe déjà!" | Add-Content $LogFile
        }

# Import du module Active Directory et import du fichier csv

Import-Module ActiveDirectory

Import-Csv -Delimiter ";" -Path $CSV | ForEach-Object {
    $OU =$_."OrganizationalUnit"

    # Test de la présence de l'unité d'organisation et création si elle n'existe pas

    if ((Get-ADOrganizationalUnit -Filter {Name -eq $OU}) -eq $null) {
        Write-Output "l'unité d'organisation $OU n'existe pas, création de la nouvelle Unité d'organisation" | Add-Content $LogFile
        Try {
            New-ADOrganizationalUnit -Name $OU -Path "DC=$Domain,DC=$Ext" -ErrorAction Stop -ErrorVariable eOU
                }
        Catch{
            "Une erreur $eOU a eu lieu à $((Get-Date).DateTime)"  | Add-Content $LogCatch
                }
        Finally{
            "Fin de l'opération Ajout d'une OU"
                }
                                                                        }
    Else {
        Write-Output "l'unité d'organisation $OU existe déjà" | Add-Content $LogFile
            }
    $User =$_."SamAccountName"
    $DisplayName =$_."DisplayName"
    $GivenName =$_."GivenName"
    $Name =$_."Name"
    $SamAccountName =$_."SamAccountName"
    $Surname =$_."Surname"
    $Description =$_."Description"
    $Company = $_."Company"
    $Department = $_."Department"
    $EmailAddress =$_."EmailAdress"
    $OfficePhone  =$_."OfficePhone"
    $Title =$_."Title"

    # Test de la présence de l'utilisateur et création si il n'existe pas

    if ((Get-ADUser -Filter {SamAccountName -eq $User}) -eq $null) {
        Write-Output "l'utilisateur $User n'existe pas, création du nouvel utilisateur" | Add-Content $LogFile
        Try {
            New-ADUser -Company:$Company -Department:$Department -DisplayName:$DisplayName -GivenName:$GivenName -Name:$Name -Description:$Description -EmailAddress:$EmailAddress -OfficePhone:$OfficePhone -Title:$Title -Path:"OU=$OU,DC=$Domain,DC=$Ext" -SamAccountName:$SamAccountName -Server:"$Server" -Surname:$Surname -Type:"user" -UserPrincipalName:"$SamAccountName$FQDN"  -AccountPassword:(ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled:$true -AccountNotDelegated:$false -AllowReversiblePasswordEncryption:$false -CannotChangePassword:$false -PasswordNeverExpires:$false -ChangePasswordAtLogon:$true -ErrorAction Stop -ErrorVariable eUser
                }
    Catch{
        "L'erreur $eUser s'est produite à $((Get-Date).DateTime)" | Add-Content $LogCatch
            }
    Finally{
        "Fin de l'opération Ajout d'un Utilisateur"
            }
                                                                        }
    Else {
        Write-Output "l'utilisateur existe déjà" | Add-Content $LogFile
            }
                                                                                                                    }

# Récupérations des erreurs

$Error > $LogError

 

Bonus :

 Si vous souhaitez utiliser des "sous OU" il vous faudra modifier des éléments dans le fichier csv et le script.

Dans le fichier csv: 

Créez de nouvelles colonnes "OrganizationalUnit" et incrémentez les avec un numéro soit par exemple : OrganizationalUnit1,OrganizationalUnit2,OrganizationalUnit3.

Ensuite placez y les noms des untiés d'organistation de la plus basse à la plus haute, par exemple : 

  1.  LAB.INFO\IT\Réseau\Prestataires\PI Services
  2. LAB.INFO\IT\Systèmes\Windows\Stagiaire

Dans le fichier Script:

Il ne vous restera plus qu'à faire les modifications suivantes :

  1. Déclarez les nouvelles variables "OrganizationalUnit1,OrganizationalUnit2,OrganizationalUnit3" (Ligne 38 dans le script avant modification).
  2. Modifier le "path" en ajoutant "OU=$OU1,OU=$OU2,OU=$OU3" devant "DC=$Domain,DC=$Ext" (ligne 44 dans le script avant modification).
  3. Modifier le "path" en ajoutant "OU=$OU,OU=$OU1,OU=$OU2,OU=$OU3" devant "DC=$Domain,DC=$Ext" (ligne 74 dans le script avant modification) attention ici ce n'est pas tout à fait pareil que l'étape 3.

Ceci n'est qu'un exemple bien sur, il vous est tout à fait possible de créer directement une variable $Path et renseigner le chemin complet dans votre csv.

FIM Synchronization Service Partie 4 : Management Agent : Fonctionnalités avancées

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 de Forefront Identity Manager qui répond à un grand nombre de ces problématiques. 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 :

Dans ce quatrième article, j'aborderai la configuration du second Management Agent de notre étude de cas. Ce dernier nous permettra de synchroniser les objets Active Directory. Aussi, nous verrons également la notion de profil d'exécution. Ces derniers vont nous permettre de lancer nos tâches de synchronisation et même de les planifier.

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.

Configuration du management Agent Active Directory

Dans l'article précédent nous avons vu la configuration d'un Management Agent. Pour la plupart d'entre eux, les onglets suivants sont identiques :

  • Configure Connector Filter
  • Configure Join and Projection Rules
  • Configure Attribute Flow
  • Configure Deprovisioning
  • Configure Extensions

En effet, pour chaque Management Agent, la partie qui change est celle consacrée à l'accès aux données. Les autres sections permettent d'interagir avec les données présentes dans le connector space ou dans la metaverse.

Prérequis

Afin de synchroniser des informations avec un annuaire Active Directory, il est nécessaire d'avoir un compte de service permettant de le lire. Pour que ce dernier support les opérations de type delta (afin de ne traiter que les changements depuis la dernière synchronisation), il est nécessaire d'ajouter la permission Replicate directory changes au compte de service. Cette dernière s'ajoute au niveau du domaine.

image

Ce compte sera également utilisé pour répliquer les éventuels changements sur un objet depuis la métaverse. Ce dernier devra donc avoir des droits d'écriture sur les objets et même éventuellement de création / suppression si l'on souhaite mettre en place du provisioning. Il est d'ailleurs recommandé d'ajouter les permissions au fur et à mesure des besoins en donnant les droits au compte de service sur les unités d'organisation à traiter. Il faut aussi éviter d'insérer un compte avec des droits importants comme un compte membre du groupe Administrateurs du domaine.

Création du management Agent

Lors de la création du Management Agent (pour rappel, elle s'effectue via le bouton Create), on choisit le type Active Directory Domain Services, puis on le nomme et on ajoute éventuellement une description.

clip_image001

La section suivante permet d'indiquer le nom de la forêt Active Directory ainsi que le compte de service qui sera utilisé pour lire les informations dans l'annuaire.

clip_image002

Il est ensuite possible de spécifier les différentes partitions de domaine qui seront accédées par FIM. Dans le cas d'une forêt mono domaine vous n'aurez ici qu'un seul choix possible (il est néanmoins possible d'accéder aux autres partitions de l'annuaire via le bouton Show All mais cela n'est pas utile). Il est ainsi possible de réaliser un filtrage sur le domaine à synchroniser.

La section Domain Controller connection settings permet de définir, si besoin, une liste de contrôleur de domaine à utiliser. Cette opération s'effectue avec le bouton Configure tout en prenant soin de cocher la case Only use preferred domain controllers si on ne souhaite utiliser que cette liste. Il est également possible de définir des identifiants d'accès différents. Aussi, la section Password Synchronization peut être utilisé dans le cas d'une synchronisation du mot de passe Active Directory vers la métaverse afin de le répliquer sur d'autres applications. Cela nécessite une implémentation spécifique qui ne sera pas abordée dans cette série d'articles.

Le bouton Containers permet de sélectionner les unités d'organisation ou container que vous souhaitez synchroniser. Il s'agit ici d'un autre niveau de filtrage.

clip_image003

L'onglet Configure Provisioning Hierarchy offre la possibilité de créer automatiquement les objets d'arborescence nécessaires à la création de la hiérarchie (comme les unités d'organisation) si ces derniers n'existent pas lors du déplacement ou de la création d'un objet. Dans notre exemple, ce dernier n'est pas configuré. Néanmoins si vous souhaitez l'activer, il suffit d'établir un lien entre un objet composant le distinguished name dans la métaverse et son équivalent dans l'annuaire (voir screenshot ci-dessous).

clip_image004

L'onglet Select Object Types permet de définir les objets que l'on souhaite synchroniser. Par défaut, il est nécessaire de laisser les cases container, domainDNS et OrganizationalUnit cochées. En effet, ces objets permettent de construire le distinguishedName des objets Active Directory, ce qui est obligatoire si l'on souhaite les synchroniser. Aussi, on peut ajouter d'autres types d'objets via le bouton Show All. Conformément à notre étude de cas, nous ajoutons les utilisateurs.

clip_image005

Au travers de la section Select Attributes, il est possible de sélectionner les attributs qui vont être utilisés par le service de synchronisation de FIM. Ces derniers ne sont pas tous affichés par défaut. Il faut cocher la case Show All afin d'obtenir un listing complet.

clip_image006

J'ai choisi les attributs department, givenName (prénom), sn (nom) et samAccountName.

NB : Le compte de service doit avoir les droits d'écriture sur tous les attributs cochées si ces derniers doivent être modifiés par le Management Agent (ce qui est le cas avec l'entreprise MyCompany).

Comme lors de l'article précédent l'assistant nommé Connector Filter configure le filtrage des objets à traiter via des conditions (valeur d'un attribut par exemple). Pour rappel, ces filtres sont exclusifs. Contrairement au Management Agent SQL, nous avons plus de choix puisque nous synchronisons plusieurs types d'objets. Il est donc possible d'établir un filtrage pour chacun d'entre eux. En dehors des types utilisateurs, groupes et contacts, il n'existe pas de besoin pour créer des filtres sur les autres objets qui ne sont utilisés que pour la synchronisation complète de l'architecture.

clip_image007

Durant le panel Configure Join and Projection Rules que nous avons aussi rencontré lors de la configuration Management SQL, nous ajoutons une règle de jointure sur les objets de type person au travers de l'attribut samAccountName. Cette dernière crée le lien entre les objets de la metaverse et ceux de l'annuaire Active Directory. Cela crée aussi indirectement le lien avec les objets issus du référentiel SQL puisque nous les avons précédemment créé dans la métaverse via la règle de projection du Management Agent SQL.

Optionnellement, il est possible d'ajouter une règle de projection si l'on souhaite créer les objets utilisateurs qui n'auraient pas d'équivalent dans la métaverse.

clip_image008

clip_image009

Comme pour le Management Agent SQL, nous définissons des règles de flux pour les attributs suivants : nom, prénom, et service d'appartenance de chaque collaborateur en export vers l'annuaire Active Directory et samaccountname en import. Cependant, le sens du flux est différent puisqu'il s'agit d'exporter les changements vers l'annuaire Active Directory.

clip_image010

NB : Cette configuration force les attributs du référentiel SQL dans l'annuaire LDAP. Si un attribut est modifié dans l'annuaire Active Directory, il sera écrasé lors de la prochaine synchronisation (en dehors su samAccountname puisqu'il permet la jointure avec l'objet dans la métaverse). Pour garder une valeur de l'annuaire LDAP, il convient de réimporter les changements dans la metaverse en ajoutant des règles de flux d'attributs d'imports. Il est aussi nécessaire de définir le Management Agent qui à la priorité sur l'attribut puisque plusieurs Management Agent sont susceptibles d'écrire une valeur. Nous verrons ce second aspect dans le chapitre concernant l'administration de la métaverse dans le prochain article.

Le panel traitant du Deprovisioning conserve sa configuration par défaut car notre étude de cas ne traite que la synchronisation pour le moment.

clip_image011

Enfin, nous n'avons pas créé de règles d'extension (nécessitant un développement en C# ou VB) donc la case adéquate reste grisée. Aussi, le Management Agent AD inclus la possibilité de provisionner des boîtes aux lettres Exchange via la liste déroulante associée au label Provision For. Si l'on choisit une version d'Exchange, il faut aussi configurer l'url d'un serveur d'accès client pour exécuter des commandes Powershell Exchange. Néanmoins, cette configuration doit être associé à une dll développée en C# ou VB.

clip_image012

Profil d'exécution

Maintenant que les Managements Agents sont configurés, il convient de les exécuter. Pour ce faire, il est nécessaire de créer des profils d'exécution. Cette opération s'effectue en sélectionnant le Management Agent puis en cliquant sur Configure Run Profiles.

image

Un profil d'exécution contient une ou plusieurs étapes permettant d'effectuer des opérations d'import, d'export, de synchronisation. Pour rappel, je vous invite à consulter la partie 1 de cette série d'articles qui définit toutes ces notions.

Pour créer un nouveau profil d'exécution, il suffit de cliquer sur New Profile et de définir un nom pour celui-ci.

Run Profile 01

La section suivante offre la possibilité de définir la première étape du profil d'exécution. Celle-ci peut avoir les types suivants :

  • Import Full
  • Import Delta
  • Export
  • Synchronization Full
  • Synchronization Delta
  • Delta Import and Delta Synchronization
  • Full Import and Delta Synchronization
  • Full Import and Full Synchronization

Run Profile 02

Il est donc possible de sélectionner des traitements incrémentiels ou complets. Aussi, on remarque que certains actions possèdes deux étapes (import et synchronisation). Cependant, tous les types ne sont pas représentés. Comment peut-on réaliser un import suivi d'une synchronisation puis d'un export ? Il suffira d'ajouter une étape au profil d'exécution ! La première étape peut être du type Full Import and Full Synchronization et le seconde de type Export. Il aurait été aussi possible de réaliser cette action en trois étapes :

  1. Full Import
  2. Full Synchronization
  3. Export

Chaque profil d'exécution peut ne posséder qu'une seule étape. Cette façon offre la possibilité d'avoir un plus grand contrôle sur l'exécution (notamment en phase de test), pour vérifier à chaque instant que les changements sont correctement répliqués. Ainsi, si nous avons une étape import, un changement sur un objet ne sera visible que sur le Connector Space du Mangement Agent et non pas dans la métaverse. Il est ainsi possible de mettre en place des actions correctrices avant de modifier la métaverse de façon irréversible.

Pour chaque étape il est possible de définir un fichier de log. Ce dernier peut également servir de fichier de test qui est écrit sans qu'aucun changement n'ait lieu sur le Connector Space.

Run Profile 05

La section Threshold définit les valeurs maximum d'objets pouvant être importés (Specify number of objects to process) ou supprimés (Specify number of deletions to process) pendant une exécution. Il s'agit de garde-fous évitant par exemple une suppression de masse suite à une mauvaise manipulation.

Enfin, la dernière étape de l'assistant configure des limites d'écriture au niveau du Connector Space, de lecture sur le système connecté ainsi qu'un timeout de connexion sur celui-ci. Ces valeurs ne doivent en général pas être personnalisées.

Run Profile 03

Dans notre exemple, j'ai créé un profil d'exécution avec les étapes Full Import / Full Synchronisation pour le Management Agent SQL et un second avec les étapes Full Import / Full Synchronisation / Export pour le Management Agent AD. Pour ce dernier, nous exécutons toutes les étapes au travers d'un profil d'exécution.

Run Profile 04

Aussi, l'une des fonctionnalités utile offertes par le panneau de gestion des profils d'exécution est le bouton Script. En effet, celui-ci génère des scripts VBS qui exécute le profil sélectionné. Il n'y a plus qu'à les utiliser dans des tâches planifiées pour lancer à intervalle régulier un cycle de synchronisation. Malheureusement, pour des scripts en Powershell, il faudra les écrire vous-même.

Il est dorénavant possible d'exécuter chaque Management Agent avec le bouton Run puis en sélectionnant le profil d'exécution qui nous convient.

Lors de la prochaine partie, nous verrons comment analyser les résultats d'une exécution puis nous nous intéresserons à l’administration du service de synchronisation de FIM.