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.
