HomeMicrosoft 365Comprendre et exploiter les propriétés de profil utilisateur dans...

Comprendre et exploiter les propriétés de profil utilisateur dans Microsoft 365

Dans Microsoft 365, on parle souvent des utilisateurs… mais beaucoup moins de leurs propriétés de profil. Pourtant, ces informations (fonction, département, manager, téléphone, localisation ou champs personnalisés) jouent un rôle central dans de nombreux scénarios : automatisation, gouvernance, annuaires internes ou encore intégrations applicatives.

Le script que je vous présente aujourd’hui apporte une réponse simple et efficace à un besoin fréquent : récupérer proprement les propriétés de profil utilisateur dans SharePoint et Microsoft 365.

À première vue, récupérer des informations utilisateur semble trivial. Mais en pratique, les données sont réparties entre plusieurs couches :

  • Azure AD / Entra ID
  • SharePoint User Profile Service
  • Champs enrichis ou historiques issus de SharePoint
  • Valeurs parfois invisibles dans Microsoft Graph

Résultat : il n’est pas rare qu’un champ visible dans l’interface utilisateur soit difficile à récupérer par API ou inversement. C’est précisément pour ce genre de situation que les scripts PnP restent extrêmement précieux. Le script permet d’interroger directement le User Profile Service de SharePoint afin de récupérer :

  • les propriétés standards (nom, email, département, titre, manager, etc.)
  • les propriétés étendues ou personnalisées
  • l’ensemble des champs disponibles pour un utilisateur donné

Il ne s’agit donc pas simplement de “lister des utilisateurs”, mais bien d’explorer leur profil tel que SharePoint le connaît réellement. Ce type de script répond à de vrais besoins projets, par exemple :

  • vérifier quelles propriétés sont réellement alimentées
  • auditer la qualité des données utilisateurs
  • préparer une synchronisation vers une autre application
  • déboguer un affichage incorrect dans un intranet
  • alimenter des automatisations Power Automate ou PowerShell

C’est souvent dans ce genre de phase que l’on découvre que :

“Le champ existe… mais pas là où on pensait.”


$basePath = #base path where you want to save CSV file("D:\Chandani\...\")
$dateTime = "{0:MM_dd_yy}_{0:HH_mm_ss}" -f (Get-Date)
$csvPath = $basePath + "\userdetails" + $dateTime + ".csv"
$adminSiteURL = "https://****-admin.sharepoint.com/" #O365 admin site URL
$username = #user email id
$password = "********"
$secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force 
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd
$global:userDetails = @()
$index = 1;
$userInfo;
  
Function Login() {
    [cmdletbinding()]
    param([parameter(Mandatory = $true, ValueFromPipeline = $true)] $Creds)
 
    #connect to O365 admin site
    Write-Host "Connecting to Tenant Admin Site '$($adminSiteURL)'" -f Yellow | Out-File $LogFile -Append -Force
  
    Connect-PnPOnline -Url $adminSiteURL -Credentials $Creds
    Write-Host "Connection Successful" -f Yellow | Out-File $LogFile -Append -Force
   
}
Function StartProcessing {
    Login($Creds);
    ConnectionToSite($Creds)
}

Function ConnectionToSite() {
    $siteURL = Read-Host "Please enter site collection URL" 
  
    try {            
        Write-Host "Connecting to Site '$($siteURL)'" -f Yellow          
                              
        $SCWeb = Get-PnPWeb -Identity ""              
                                                     
        $getusers = Get-PnPUser -Web $SCWeb

        ForEach ($user in $getusers) { 
            $email = $user.Email
            If ($email) {
                $userInfo = GetUserProfileProperties $email        
                #creating object fro CSV
                $global:userDetails += New-Object PSObject -Property ([ordered]@{                   
                        Id            = $index
                        GUID          = $userInfo.'UserProfile_GUID'
                        FirstName     = $userInfo.FirstName
                        LastName      = $userInfo.LastName
                        WorkEmail     = $userInfo.WorkEmail 
                        PictureURL    = $userInfo.PictureURL    
                        Department    = $userInfo.Department
                        PreferredName = $userInfo.PreferredName                        
                    })
                $index++ 
            } 
        }                                                                
    }
    catch {
        Write-Host -f Red "Error in connecting to Site '$($TenantSite)'"                        
    }                                     
    BindingtoCSV($global:userDetails) 
}

Function BindingtoCSV {
    [cmdletbinding()]
    param([parameter(Mandatory = $true, ValueFromPipeline = $true)] $Global)   
    Write-Host -f Yellow "Exporting to CSV..."
    $userDetails | Export-Csv $csvPath -NoTypeInformation -Append
    Write-Host -f Yellow "Exported Successfully..."
}

Function GetUserProfileProperties($username) {
    $Properties = Get-PnPUserProfileProperty -Account $username
    $Properties = $Properties.UserProfileProperties
   
    If ($Properties) {
        $Properties = $Properties
    }
    else {
        $Properties = $null
    }
    return $Properties
}

StartProcessing

C’est une approche volontairement générique, qui permet de :

  • découvrir quelles propriétés existent
  • identifier leurs noms techniques
  • décider ensuite lesquelles exploiter

Microsoft Graph est aujourd’hui incontournable, mais il ne couvre pas tout, en particulier lorsqu’il s’agit de certaines propriétés SharePoint historiques ou personnalisées.

Le script rappelle que SharePoint reste une source de vérité pour une partie des profils utilisateurs, notamment dans les contextes intranet et collaboration. Dans de nombreux projets, la combinaison Graph + PnP reste la meilleure stratégie. Dans un écosystème Microsoft 365 de plus en plus complexe, comprendre où sont les données et comment les récupérer reste fondamental. Ce script n’automatise pas tout, mais il éclaire et c’est souvent la première étape essentielle.

Charles Jenkins
Charles Jenkinshttps://trivium365.com/
Fort de plus de 15 ans d’expérience, il accompagne les organisations dans l’adoption des outils Microsoft pour optimiser leur collaboration et leur productivité. Passionné par l’innovation et l’amélioration continue, il met son expertise au service des équipes pour les aider à tirer le meilleur parti de la transformation numérique.