Les articles publiés sur ce blog, ont pour but de partager des connaissances/concepts techniques et sont tous réalisés dans un environnement de test. Par conséquent, les auteurs dégagent toute responsabilité, de quelque ordre que ce soit, quant aux dommages directs, indirects ou consécutifs résultant de l’utilisation des informations contenus dans ceux-ci.
Introduction
La gestion manuelle du cycle de vie des membres du Set Administrators du portail MIM, peut être laborieuse et peut donc constituer une faille de sécurité. Par conséquent, l’automatisation est l’idée qui nous vient en tête pour nous décharger de ce fardeau.
Dans les sections suivantes, nous présenterons une solution qui permet de gérer l’ajout/suppression des membres du set Administrators, en synchronisant uniquement le groupe qui contient les comptes d’administration, en provenance d’un AD, sans pour autant synchroniser ses membres en utilisant le MA PSMA de Soren Granfeldt.
Pourquoi ne pas synchroniser directement les comptes d’administration
La solution présentée dans cet article en est une parmi tant d’autres.
Bien que celle-ci soit réalisée dans un environnement de test, nous avons voulu y intégrer des contraintes qu’il est possible de rencontrer dans un environnement de production, telles que :
- Une multitude de comptes d’administration dans le domaine
- Aucun attribut AD permettant d’identifier les comptes qui doivent être membres du set Administrators
- Aucun attribut AD permettant de filtrer les comptes d’administration
- Le groupe contenant les comptes d’administration contient également des comptes de service que je ne souhaite pas synchroniser
- L’ajout/Suppression des membres du groupe contenant les comptes d’administration est hors de mon périmètre
Ça fait quand-même quelques contraintes n’est-ce pas ? Sans plus tarder voyons comment mettre cela en place.
Outils nécessaires :
- ADDS: Groupe AD, contenant les comptes d’administration, synchronisé dans le portail
- FIMSync/MIMService
- Installation et configuration du MA PowerShell Granfelt
- Création Set, Workflow (Powershell) et une MPR (request)
Les membres du groupe AD n’ont pas besoin d’être synchronisés
Avant toute chose, il faut vous assurer que les groupes contenant les comptes d’administration soit synchronisé et présent sur le portail MIM
Configuration Portail et MetaVerse
Configuration Synchronization Service & Portail
Portail MIM
L’attribut créé dans le portail contiendra la date de modification de l’attribut member du groupe synchronisé depuis l’AD.
Se loguer sur le portail avec un compte admin (ex : le compte d’installation du portail)
Cliquez sur Administration
Cliquez sur Schema Management
Cliquez sur All Attributes
Cliquez sur New
Complétez les champs suivants :
- System name : Spec-AdmGrpMbrShipChangedDate
- Display Name : Spec-AdmGrpMbrShipChangedDate
- Data Type : Indexed string

Pour différencier les attributs natifs du portail des customs, nous préfixons ces derniers par “Spec-“
Finish
Submit
Cliquez sur All Bindings
Cliquez sur New
Complétez les champs suivants :
- Resource Type : Group
- Attribute Type : Spec-AdmGrpMbrShipChangedDate

Finish
Submit
Synchronization Service
Ajout attribut custom dans le MetaVerse
Il est également nécessaire de créer un attribut custom dans le MetaVerse et celui contient la date de modification de l’attribut member du groupe synchronisé.
Lancez la console Synchonization Service
Cliquez sur MetaVerse Designer
sélectionnez l’objectType Group
Cliquer sur Add Attribute
Cliquez sur New attribute…
Remplissez les champs suivants :
- Attribute Name : Spec-MV-whenChanged
- Attribute type : String (indexable)
- Cochez la case Indexed
Cliquez sur OK
Cliquez sur OK

Pour différencier les attributs natifs du MetaVerse des customs, nous préfixons ces derniers par “Spec-MV”
Modification du MA FIM Service Portal
Il est nécessaire de rafraichir le schéma du MA FIMService Portal pour configurer l’attribute flow entre l’attribut Spec-AdmGrpMbrShipChangedDate (Portail MIM) et l’attribut Spec-MV-whenChanged (MetaVerse).
Dans la console Synchronization Service
Cliquez sur Management Agent
Faites un clic droit sur le MA MA FIMService Portal
Sélectionnez
Cliquez sur OK dans la boîte de dialogue Refresh Schema
Renseignez les credentials du compte de service exécutant le MA MA FIMService Portal

OK

Close
Allez dans les Propiétés du MA :
- Dans la rubrique Select Attributes :
- cochez la case Show All,
- cochez la case Spec-AdmGrpMbrShipChangedDate
- Dans la rubrique Configure Attributes flow :
- Sélectionnez object Type : Group :
- data source Attribute: Spec-AdmGrpMbrShipChangedDate
- MetaVerse Attribute : Spec-MV-whenChanged
- Maping Type : Direct
- Flow Direction : Export
- Cliquez sur New
- Sélectionnez object Type : Group :
- Cliquez sur OK

OK
La modification d’un MA nécessite l’exécution d’un Full Import et d’une Full Synchronization pour que les modifications soient prises en compte
Installation/Configuration du PSMA
Installation
Comme indiqué en introduction nous allons utiliser le PSMA, MA PowerShell développé par Soren Granfeldt disponible sur github. Celui-ci va nous permettre de récupérer et de synchroniser la date de modification de l’attribut AD member du groupe contenant les comptes d’administration (MIMPortal-Admins).
Téléchargez la dernière version du psma

Avant d’aller plus loin, quelques prérequis sont nécessaires :
- Microsoft Forefront Identity Manager 2010 R2 Service Pack 1 ou plus (build 4.1.3508 ou plus)
- Windows Server 2008 R2 ou plus
- PowerShell 3.0
- NET Framework 4.5.2
Une fois les prérequis validés,
Décompressez l’archive psma.5.6.4.2022
Arrêtez le service FIMSync
Ouvrez un prompt PowerShell runas Administrator
Vérifier que l’exécution Policy PowerShell est en mode unrestricted :
Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
Exécutez le script Install-PowerShellManagementAgent.ps1
Tapez la cmdlet suivante :
New-EventLog -Source “PowerShell Management Agent” -LogName Application
Démarrez le service FIMSync
Lancez la console Synchronization Service Manager pour vérifier la présence du MA de type PowerShell

Configuration
Les détails de la configuration du psma ne sont pas abordés dans cet article. Cependant, les plus curieux peuvent les avoir sur github.
Créez l’arborescence (de préférence à la racine du c:\) c:\psma\csv. Le répertoire csv contiendra des fichiers qui seront générés lors de la création du MA psma et utilisé par celui-ci.
Assurez-vous que le fichier Granfeldt.PowerShell.ManagementAgent.dll est bien présent dans le répertoire suivant : C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions et que celui-ci n’est pas bloqué par Blocked File Protection Control. Pour le débloquer, il faut cocher la case Unblock dans les propriétés du fichier :

Dans le répertoire indiqué ci-dessus (C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions), créez le répertoire PSMAAdminGroupSync et créez les fichiers suivants :
- ADminGroupDeltaCookie.txt (fichier cookie utilisé pour le run profile delta Import/Sync)
- DebugAdminGroup.txt (fichier debug)
- Schema.ps1 (fichier correspondant au schema du MA avec la liste des attributs à synchroniser ainsi que leur type)
- export.ps1 (fichier d’export vers une source de donnée)
- import.ps1 (fichier d’import vers le MetaVerse)
- password.ps1 (fichier utilisé pour le Password Change Notification Service)
Seul les fichiers schema.ps1 et import.ps1 sont modifiés. Bien que les autres, à l’exception de DebugAdminGroup.txt, sont vides, ils sont malgré tout utilisés et nécessaires pour le fonctionnement du MA psma.
Schema
Comme son nom l’indique, le fichier schema.ps1 correspond au schéma du MA et celui-ci contiendra la liste des attributs et leur type.
Pour plus de détails, n’hésitez pas à consulter le schema.
Ouvrez le fichier schema.ps1 dans un éditeur de script PowerShell, tapez les lignes ci-dessous et sauvegardez le fichier :
$obj = New-Object -Type PSCustomObject
$obj | Add-Member -Type NoteProperty -Name “Anchor-Id|String” -Value “”
$obj | Add-Member -Type NoteProperty -Name “objectClass|String” -Value “Group”
$obj | Add-Member -Type NoteProperty -Name “GroupDN|String” -Value “”
$obj | Add-Member -Type NoteProperty -Name “SamAccountName|String” -Value “”
$obj | Add-Member -Type NoteProperty -Name “GroupMemberAttrChangedDate|String” -Value “”
$obj
Import
Tout comme le schéma, le fichier import.ps1 va permettre d’injecter les valeurs récupérées par le script dans les attributs définis dans le schéma. Celui indiqué ci-dessous permet de récupérer la date de modification de l’attribut member sur le contrôleur de domaine exécutant le rôle FSMO PDCEmulator.
Pour plus de détails, n’hésitez pas à consulter l’import.
La section modifiable à volonter dans le fichier d’import est celle comprise entre les « balises » **** import**** et ****
Ouvrez le fichier import.ps1 dans un éditeur de script PowerShell, tapez les lignes ci-dessous et sauvegardez le fichier :
param (
$Username,
$Password,
$Credentials,
$OperationType,
[bool] $usepagedimport,
$pagesize
)
$DebugFilePath = “C:\PROGRA~1\MICROS~4\2010\SYNCHR~1\EXTENS~2\PSMAAdminGroupSync\DebugAdminGroup.txt”
if(!(Test-Path $DebugFilePath))
{
$DebugFile = New-Item -Path $DebugFilePath -ItemType File
}
else
{
$DebugFile = Get-Item -Path $DebugFilePath
}
“Starting Import as : ” + $OperationType + (Get-Date) | Out-File $DebugFile -Append
# Object Type (eg. users, groups, contacts, directoryObjects)
$object = “Group”
# Output Directory and file for Differential Cookie
$downloadDirectory = “C:\PROGRA~1\MICROS~4\2010\SYNCHR~1\EXTENS~2\PSMAAdminGroupSync”
$cookieFile = “\ADminGroupDeltaCookie.txt”
$cookiefilepath = $downloadDirectory +$cookieFile
# Reset results variable
$query = $null
# Read in Delta Cookie if it exists, if not create the file for storing the cookie
if(!(Test-Path $cookiefilepath))
{
$cookie = New-Item -Path $cookiefilepath -ItemType File
“Creating new Cookie File” | Out-File $DebugFile -Append
}
else
{
$cookie = Get-Item -Path $cookiefilepath
“Cookie File present” | Out-File $DebugFile -Append
}
# ******************************************************************
# Delta or Full Sync based on Run Type and Cookie File ?
if((Get-Item $cookie).length -gt 0kb -and $OperationType -eq “Delta”){
# Delta cookie value exists. Get it
$file = Get-Content $cookie.FullName
$file += “Delta : $(get-date)”
“Delta Import” | Out-File $DebugFile -Append
}
else
{
# no Delta Cookie, so first run OR Full Sync so return everything
“Full Import” | Out-File $DebugFile -Append
}
# *********************** IMPORT **********************************
$grpInfo = Get-ADGroup -Filter{SamAccountName -eq “MIMPortal-Admins”} -Properties DistinguishedName,SAMAccountName,ObjectGUID,uSNChanged -Server (Get-ADDomain).PDCEmulator | `
select DistinguishedName,SAMAccountName,ObjectGUID,uSNChanged,@{l=”whenChanged”;e={(Get-ADReplicationAttributeMetadata $_.DistinguishedName -Server (Get-ADDomain).PDCEmulator | ? AttributeName -eq “member”).LastOriginatingChangeTime}}
$grpInfo | %{
$obj = @{}
$obj.Add(“Id”,$(($grpInfo.objectguid).ToString()))
$obj.Add(“objectClass”,”Group”)
$obj.Add(“SamAccountName”,$($grpInfo.SamAccountName))
$obj.Add(“GroupMemberAttrChangedDate
“,($grpInfo.whenChanged).ToString())
$obj.Add(“GroupDN”,$($grpInfo.DistinguishedName))
$obj
}
# ***********************************************************
“Finished Import as : ” + $OperationType + (Get-Date) | Out-File $DebugFile -Append
#endregion
Quelques petites précisions s’imposent :
Le chemin des fichiers de scripts ne doit pas contenir d’espaces et doit être au format ms-dos 8.3 (ex : C:\PROGRA~1\MICROS~4\2010\SYNCHR~1\EXTENS~2\PSMAAdminGroupSync), par conséquent, il va falloir modifier/adapter les valeurs des variables suivantes dans le script:


N’oubliez pas de remplacer le nom du groupe MIMPortal-Admins par le votre
Le schema FIM étant sensible à la casse, nous préconisons d’utiliser la nomenclature de nommage pour les attributs retournés par le script d’import identique à celle spécifiée pour les attributs du schéma
Création du MA psma
Lancez la console Synchronization Service Manager
Cliquez sur Management Agents
Cliquez sur Create
Create Management Agent
- Management agent for : PowerShell
- Name : PSMA-MIMPortal Admins
- Architecture : Process

Next
Connectivity
- Schema Script : C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions\PSMAAdminGroupSync\schema.ps1

Dans la mesure où le MA ne fait que de la lecture, celui-ci utilisera les credentials du compte de service FIMSync
Next
Global Parameters
- Import Script : C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions\PSMAAdminGroupSync\import.ps1
- Export Script : C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions\PSMAAdminGroupSync\export.ps1
- Password Management Script : C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Extensions\PSMAAdminGroupSync\password.ps1

Next
Configure Partitions and Hiérarchies

Next
Select Object Types

Next
Select Attributes

Next
Configure Anchors

Next
Configure Connector Filter

Next
Configure Join and Projection Rules
Cliquez sur New Join Rule… :
- Data source attribute : SamAccountName
- Metaverse object type : group
- Metaverse attribute : accountName
- Mapping type : Direct
Cliquez sur Add Condition

OK

Next
Configure Attribute Flow

Next
Configure Deprovisioning

Next
Configure Extensions
Décochez Enable password management

Finish
Configuration des run profiles PSMA
Afin de synchroniser les attributs indiqués dans l’attribute flow du MA, nous devons créer les run profiles suivants :
- FI (Full Import)
- FS (Full Synchronization)
- DI (Delta Import)
- DS (Delta Synchronization)
Etant donné que les étapes de création des run profiles sont similaires, nous ne détaillerons que celles de la création du run profile FI.
Faites un clic droit sur le MA PSM-MIMPortal Admins
Sélectionnez Configure Run Profiles…

Cliquez sur
Profile Name
- Name : FI

Next
Configure Step
- Type : Full Import (Stage Only)

Next
Management Agent Configuration
- Partition : default
- Timeout (seconds) : 0
- Page size (objects) : 100

Finish
OK
Répétez les étapes ci-dessus pour la création des autres run profiles (FS, DI, DS)

Exécution des run profiles
Après toutes ces configurations/modifications, nous devons exécuter les run profiles dans l’ordre suivant :
- La prise en compte des modifications réalisées dans la section Modification MA FIM Service Portal, exécuter les run profiles du MA FIMService Portal :
- FI
- FS
- S’agissant de la 1ère exécution du MA PSMA-MIMPortal Admins les run profiles suivants doivent être exécutés:
- FI
- FS
Comme prévu/attendu, la jointure s’est faite et le groupe possède désormais la date de modification de l’attribut member

- Il ne reste plus qu’à faire remonter celle-ci dans le portail en exécutant le run profile EX sur le MA MA FIMService Portal
Afin de valider la bonne exécution de l’export vers le portail, suivez les étapes ci-dessous :
- Loguez-vous sur le portail MIM
- Cliquez sur Security Groups
- Dans Search for, tapez mim
- Cliquez sur le groupe MIMPortal-Admins
- Cliquez sur Advanced View
- Cliquez sur Extended Attributes
- Recherchez le champ Spec-AdmGrpMbrShipChangedDate

Création du Set, Workflow & MPR
Les étapes ci-dessous vont nous permettre d’automatiser l’ajout/suppression des membres du set administrators.
En effet la création d’un set custom va nous permettre, en cas de besoin, d’ajouter un ou plusieurs groupe(s) provenant du même domaine AD ou d’un autre.
Dans le cas de l’ajout d’un groupe d’un autre domaine, il faudra bien évidemment créer un MA et synchroniser le groupe correspondant. Le cas peut se présenter si le portail est géré par des administrateurs de différentes équipes/entités/départements.
Le workflow quant à lui est de type WAL: Run PowerShell Script pour gérer l’ajout/suppression des membres du set administrators. Aussi, pour éviter d’avoir à multiplier les sets/workflows/MPR, le script prend en paramètre le nom du groupe.
La MPR est de type request parce qu’elle se déclenchera lors de la modification de la valeur de l’attribut Spec-AdmGrpMbrShipChangedDate suite à l’export vers le portail.
Voyons maintenant la configuration de ces éléments en détail.
Set
Loguez-vous sur le portail MIM (mimportal.red.lab) avec un compte membre du set Administrators ou avec le compte utilisé lors de l’installation du portail MIM.
Dans la section Management Policy Rules,
Cliquez sur Sets
Cliquez sur New
General
- displayName : _SET-STA-ManageMIMPortalAdmins-MbrShip

Next
Criteria-based Members
Décochez la case

Next
Maually-managed Members
Ajoutez le groupe AD synchronisé

Finish
Submit
Workflow
Dans la section Management Policy Rules du portail,
Cliquez sur Workflows
Cliquez sur New
General
- Workflow Name : _WF-Action-PS-ManageMIMPortalAdmins-MbrShip
- Workflow Type : Action
- Décochez la case

Next
Activities,
sélectionnez WAL :Run PowerShell Script
Cliquez sur Select

Dans l’activité, remplissez les champs suivants :
- Activity Display Name : PS-ManageMIMPortalAdmins-MbrShip
- Script :
<#
.DESCRIPTION
This script manages MIM Portal Administrators Set membership lifecycle
.NOTES
Author: Guillaume GLANDOR
Date : October 2023
#>
param([String]$GroupName)
##################
# Import modules #
##################
Import-Module ActiveDirectory
Import-Module LithnetRMA
#################
# SET VARIABLES #
#################
$usrNameListFomAdmSet =@()
$res = @()
$isPresent = $null
$usrNameListFomAdmSet = $null
$logInfo = $null
$logErr = $null
$adUsrInfo = $null
$eventIDInfo = 777
$eventIDErr = 888
$runTime = Get-Date -Format ‘dd/MM/yyyy HH:mm:ss’
$logInfo += “[$runTime] Start Script…`n”
#Get group domain fqdn
$grpShortDomainName = (Get-Resource -ObjectType Group -AttributeName DisplayName -AttributeValue “$GroupName”).Domain
switch($grpShortDomainName)
{
“RED”
{
$domainFQDN = “red.lab”
}
“CORP”
{
$domainFQDN = “corp.lab”
}
}
#Check if group exists in ADDS
try
{
$grpInfo = Get-ADGroup $GroupName -Server $domainFQDN
$logInfo += “[Check if $GroupName exists in $domainFQDN]: OK`n”
}
catch
{
$logErr += “[$runTime] Start Error Script…”
$logErr += “[Check if $GroupName exists in $domainFQDN]: $($_.Exception.Message) `n”
break;
}
if($grpInfo)
{
$adGroupContainingEligibleMIMPortalAdmins = $GroupName
}
else
{
break;
}
#Get MIMPortal Administrators set members
$admSetMbrList = (Get-Resource -ID “10000005-1111-45b5-ad13-2764d866c000”).ExplicitMember.value
#Exclude ILMSync (Built-in Synchronization Account), (default MIMPortal admin), (FIMService), (Forefront Identity Manager Service Account)
$usrAccListFromAdmnSet = $admSetMbrList | Where-Object{$_ -ne “fb89aefa-5ea1-47f1-8890-abe7797d6497” -and $_ -ne “7fb2b853-24f0-4498-9534-4e10589723c4” -and $_ -ne “ae17ecc2-18ef-49fe-8c2f-818f6a3d6dc7” -and $_ -ne “e05d1f1b-3d5e-4014-baa6-94dee7d68c89”}
$usrNameListFomAdmSet += $usrAccListFromAdmnSet | %{Get-Resource -ID $($_)} | select DisplayName, @{l=”Domain”;e={$($_.Domain).ToUpper()}}
Write-Host $usrNameListFomAdmSet -for Cyan
$logInfo += “[Get MIMPortal Administrators set members]: OK`n”
#Get users from AD group
try
{
$adUsrInfo = Get-ADGroupMember $adGroupContainingEligibleMIMPortalAdmins -Recursive -Server (Get-ADDomain -Server $domainFQDN).PDCEmulator | `
Get-ADUser -pro employeeType -Server (Get-ADDomain -Server $domainFQDN).PDCEmulator| where{$_.Enabled -eq “True”} |`
select SAMAccountName, @{l=”DomainName”;e={(($_.DistinguishedName -split “,DC=”)[1]).ToUpper()}}
$logInfo += “[Get users from $grpShortDomainName\$GroupName]: OK`n”
}
catch
{
$logErr += “[Get users from $grpShortDomainName\$GroupName][Err]: $($_.Exception.Message)`n”
}
########################################################################
# Gather users to be added to/removed from MIMPortalAdministrators Set #
########################################################################
#List users to be added to MIMPortal Administrators Set
$adUsrInfo | %{
$ADaccountName = $null
$ADaccountName = $_.SAMAccountName
$obj = New-Object psobject -Property @{
ADUser = “”
FIMUser = “”
IsPresent = “”
DomainName = “”
ACTION = “”
}
#Check if ADUser is member of Administrators Set
$isPresent = $usrNameListFomAdmSet.DisplayName | ?{$_ -eq $ADaccountName}
if($isPresent)
{
<#
$obj.ADUser = $accountName
$obj.FIMUser = $accountName
$obj.IsPresent = “True”
$obj.DomainName = $($_.DomainName)
$obj.ACTION = “Nothing”
$res += $obj
#>
}
else
{
$obj.ADUser = $ADaccountName
$obj.FIMUser = “NotFound”
$obj.IsPresent = “False”
$obj.DomainName = $($_.DomainName)
$obj.ACTION = “AddToAdminPortalSet”
$res += $obj
}
}
#List users to be removed from MIMPortal Administrators Set
if($usrNameListFomAdmSet)
{
$usrNameListFomAdmSet | %{
$accountName = $null
$accountName = $_.DisplayName
$obj = New-Object psobject -Property @{
ADUser = “”
FIMUser = “”
IsPresent = “”
DomainName = “”
ACTION = “”
}
#Check if FIMUser is member of AD group
$isPresent = $adUsrInfo.SAMAccountName | ?{$_ -eq $accountName}
if($isPresent)
{
<#
$obj.ADUser = $accountName
$obj.FIMUser = $accountName
$obj.IsPresent = “True”
$obj.DomainName = $($_.Domain)
$obj.ACTION = “Nothing”
$res += $obj
#>
}
else
{
$obj.ADUser = “NotFound”
$obj.FIMUser = $accountName
$obj.IsPresent = “False”
$obj.DomainName = $($_.Domain)
$obj.ACTION = “RemoveFromAdminPortalSet”
$res += $obj
}
}
}
#########################################################
# Add or Remove users from MIMPortal Administrators Set #
#########################################################
$res | %{
$action = $null
$ADUserName = $null
$FIMUserName = $null
$DomainName = $null
$action = $_.Action
$ADUserName = $_.aduser
$FIMUserName = $_.FIMUser
$DomainName = $_.DomainName
switch($action)
{
“AddToAdminPortalSet”
{
#Create the resource
$objUser = New-Object System.Security.Principal.NTAccount($DomainName,$ADUserName)
$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
$bytes = New-Object byte[] $strSID.BinaryLength
$strSID.GetBinaryForm($bytes, 0)
$o = New-Resource -ObjectType Person
$o.AccountName = $ADUserName
$o.Domain = $DomainName
$o.DisplayName = $ADUserName
$o.ObjectSID = $bytes
Save-Resource $o
$set = Get-Resource Set DisplayName Administrators
try
{
#Add to administrators set
$set.ExplicitMember.Add($o)
Save-Resource $set
$logInfo += “[AddToAdminPortalSet][OK]: $DomainName\$ADUserName`n”
}
catch
{
$logErr += “[AddToAdminPortalSet][ErrMsg][$DomainName\$ADUserName]: $($_.exception.message)`n”
}
}
“RemoveFromAdminPortalSet”
{
#Get the resource
$o = Get-Resource -ObjectType Person -AttributeName DisplayName -AttributeValue $FIMUserName
$set = Get-Resource Set DisplayName Administrators
try
{
#Remove from administrators set
$set.ExplicitMember.Remove($o)
Save-Resource $set
$logInfo += “[RemoveFromAdminPortalSet][OK]: $DomainName\$FIMUserName`n”
}
catch
{
$logErr += “[RemoveFromAdminPortalSet][ErrMsg][$DomainName\$FIMUserName]: $($_.exception.message)`n”
}
#Remove from MIMPortal
try
{
$o | Remove-Resource
$logInfo += “[RemoveFromMIMPortal][OK]: $DomainName\$FIMUserName`n”
}
catch
{
$logErr += “[RemoveFromMIMPortal][ErrMsg][$DomainName\$FIMUserName]: $($_.exception.message)`n”
}
}
}
}
#Write to event log Application Source MIMPortalAdministratorsSet-MemberShip
if($logInfo)
{
$logInfo += “[$runTime] End of Script!!!”
Write-EventLog -LogName Application -Source “MIMPortalAdministratorsSet-MemberShip” -EntryType Information -EventId $eventIDInfo -Message “$logInfo”
}
if($logErr)
{
$logErr += “[$runTime] End of Script!!!”
Write-EventLog -LogName Application -Source “MIMPortalAdministratorsSet-MemberShip” -EntryType Error -EventId $eventIDErr -Message “$logErr”
}
Named Parameters :
- Parameter : GroupName
- Value Expression : [//Target/DisplayName]
Cliquez sur Save

Finish
Submit
Description du script
Avant d’aller plus loin, nous allons un peu nous attarder sur le script afin de vous indiquer les modifications à apporter pour que celui-ci puisse être exploitable dans votre contexte/environnement et vous décrire les actions qu’il réalise.
Prérequis pour l’exécution du script
- Installez le module PowerShell LithnetRMA qui permet de manipuler les objets présents dans le portail MIM
- Installez les derniers cumulatives Updates FIMSync et FIMService(reboot recommandé/nécessaire après l’installation de chaque .msp) qui permettront d’intégrer le corps du script directement dans le workflow
- Afin que le script s’exécute correctement les comptes suivants doivent être membres du set administrators :
- Built-in Synchronization Account (ID : fb89aefa-5ea1-47f1-8890-abe7797d6497)
- Compte utilisé lors de l’installation FIMService
- Compte de service exécutant le service FIMService
- Forefront Identity Manager Service Account (ID: e05d1f1b-3d5e-4014-baa6-94dee7d68c89)
Pour trouver le compte Forefront Identity Manager Service Account, dans la fenêtre Select Members
- Search for : for%
- Search within : All Resources

Pour trouver les ID des comptes, il faut aller dans les propriétés avancées du compte, onglet Common Attributes, cherchez la valeur Resource ID.
- Modifiez les lignes suivantes pour exclure les comptes, déjà membres du set administrators, ne devant pas être gérés par le script (ceux indiqués à l’étape 3):
$admSetMbrList | Where-Object{$_ -ne “fb89aefa-5ea1-47f1-8890-abe7797d6497” -and $_ -ne “7fb2b853-24f0-4498-9534-4e10589723c4” -and $_ -ne “ae17ecc2-18ef-49fe-8c2f-818f6a3d6dc7” -and $_ -ne “e05d1f1b-3d5e-4014-baa6-94dee7d68c89”}
Actions du script
- Le script prend en entrée la variable correspondant au nom du groupe d’administration provenant de l’AD (MIMPortal-Admins)
- Détermination manuelle du domaine AD auquel appartient le groupe
- Récupération des membres actuels du set administrators (à l’exception des comptes exclus)
- Récupération des utilisateurs actifs membres du groupe MIMPortal-Admins dans l’AD
- Ajout des comptes d’administration si absents du set administrators
- Retrait des comptes d’administration du set administrators si absent du groupe MIMPortal-Admins dans l’AD
- Suppression des comptes d’administration retirés à l’étape 6 du portail
- Ecriture dans l’event log Application à chaque exécution du script (moyennant permissions octroyées au compte FIMService):
- Type : Info/Error
- Event ID : 777/888
Management Policy Rules
Cliquez sur Management Policy Rules
Cliquez sur New
General
- Display Name : _MPR-Req-ManageMIMPortalAdmins-MbrShip
- Type : Request

Next
Requestors and Operations
- Specific Set of Requestors : Administrators
- Operation: Modify a single-valued attribute
- Permissions: Cochez

Next
Target Resources
- Target Resource Definition Before Request : _SET-STA-ManageMIMPortalAdmins-MbrShip
- Target Resource Definition After Request : _SET-STA-ManageMIMPortalAdmins-MbrShip
- Resource Attributes: Select specific attributes: Spec-AdmGrpMbrShipChangedDate

Next
Policy Workflows
Section Action Workflows
Sélectionnez _WF-Action-PS-ManageMIMPortalAdmins-MbrShip

Finish
Submit
Test d’ajout/suppression des membres dans le Set Administrators
Pour rappel, il n’est pas nécessaire que les membres du groupe AD soient synchronisés, car ceux-ci vont être rajoutés/supprimés par le script dans le portail MIM.
Dans notre contexte, pour ne pas synchroniser les membres du groupe MIMPortal-Admins, nous avons filtré les comptes dont le sAMAccountName se termine par _adm dans le MA ADDS RED.LAB (évidemment d’autres méthodes sont possibles/applicables).

Pour notre test, nous avons ajouté 2 comptes actifs et 1 inactif dans le groupe MIMPortal-Admins. Pour rappel, le script rajoute uniquement les comptes actifs dans le set administrators.

Validation/Vérification que le set Administrators ne contient pas les comptes indiqués ci-dessus :

Ajout des comptes dans le set Administrators
Dans la console Synchronization Service Manager, exécutez les run profiles suivants sur les MA:
- PSMA-MIMPortal Admin DI, DS (synchronisation de la modification de l’attribut member)

- FIMService Portal EXDI (synchronisation de la modification de l’attribut member et exécution de la MPR _MPR-Req-ManageMIMPortalAdmins-MbrShip)
Rendez-vous dans le portail et ouvrez le set Administrators pour constater que les comptes Horemheb_adm et Sethi_adm sont bien membres du set.

Suppression des comptes dans le set Administrators et du portail MIM
Retirer les comptes Horemheb_adm et Sethi_adm du groupe MIMPortal-Admins et dans la console Synchronization Service Manager, exécutez les run profiles suivants sur les MA:
- PSMA-MIMPortal Admin DI, DS (synchronisation de la modification de l’attribut member)
- FIMService Portal EXDI (synchronisation de la modification de l’attribut member et exécution de la MPR _MPR-Req-ManageMIMPortalAdmins-MbrShip)
Rendez-vous dans le portail et ouvrez le set Administrators pour constater que les comptes Horemheb_adm et Sethi_adm ne sont plus membres du set et ont été supprimés du portail.

La liste des actions réalisées est également accessible via les Search Requests, n’hésitez à vous y rendre.

Remarques
Comme nous l’avons vu dans cet article, il es possible de gérer automatiquement le cycle de vie des membres du set Administrators. L’avantage de cette méthode est que la gestion des membres du set Administrators se fait avec des comptes qui ne sont pas intégrés à la synchronisation. Cela peut être utile en cas d’indisponibilité du portail et nous prémuni contre d’éventuelles erreurs liées à la synchronisation (décocher l’OU des comptes d’administration, etc…)
A ciao & have fun !!!
Peut-être n’ai-je pas compris votre question, mais l’article indique comment mettre en place un compte bris de glace au cas où les comptes membres du set Administrators sont corrompus/inutilisables.
Par expérience, il nécessaire d’avoir un compte bris de glace, dédié uniquement, à la récupération en cas d’indisponibilité des comptes admins usuels.
Celui-ci est généralement en dehors du scope de la synchro.