Fetch User Profile Properties From Site Collection And Export To CSV Using PNP PowerShell

Published 03-24-2021 06:13 AM 1,028 Views
Senior Member

Introduction

 

Many times we have a requirement like to get users or user profile properties from any SharePoint site collection and we need it in CSV or Excel format. so to achieve this solution we will use PnP Powershell. 

 

Let's see step-by-step implementation.

 

Prerequisites


If we are using Window 10 or we have PowerShellGet then we can run the below commands to install PnP PowerShell and AzuerAD Modules

Install PnP PowerShell Module,

 

 

Install-Module SharePointPnPPowerShellOnline -Scope CurrentUser  

 

 

Implementation

 

  • Open Windows Powershell ISE
  • Create a new file and write a script

 

Now we will see all the steps which we required to achieve the solution:

 

1.  We will read the site URL from the user

2.  then we will connect to the O365 admin site and then we will connect to the site which the user has entered

3. Create a function to bind a CSV

4. Create a function to get user profile properties by email d

5.  In the main function we will write a logic to get web and users of site collection URL and then get all the properties and bind it to CSV

 

So at the end, our script will be like this,

 

 

 


$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 Successfull" -f Yellow | Out-File $LogFile -Append -Force
   
}
Function StartProcessing {
    Login($Creds);
    ConnectionToSite($Creds)
}

Function ConnectionToSite() {
    $siteURL = Read-Host "Please enter site collcetion 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

 

 

 

In the above script do the following changes:

 

1. Change O365 Site Url, base path, username, and password

2. To check all the properties you can print $userInfo and then change $global:userDetails object as per your requirement at where I have used $userInfo.FirstName,LastName etc.

 

Then run the script with the F5 command.

 

Output

 

OP.png

 

 

After this check the CSV file at your base location.

 

Summary

 

So in this article, we have seen how to get user and user profile properties and as well as how to export them to CSV.

 

Hope this helps! If it is helpful to you then share it with others.

 

Sharing is caring!

 

%3CLINGO-SUB%20id%3D%22lingo-sub-2232136%22%20slang%3D%22en-US%22%3EFetch%20User%20Profile%20Properties%20From%20Site%20Collection%20And%20Export%20To%20CSV%20Using%20PNP%20PowerShell%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2232136%22%20slang%3D%22en-US%22%3E%3CH2%20id%3D%22toc-hId--497500245%22%20id%3D%22toc-hId--497502347%22%3EIntroduction%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EMany%20times%20we%20have%20a%20requirement%20like%20to%20get%20users%20or%20user%20profile%20properties%20from%20any%20SharePoint%20site%20collection%20and%20we%20need%20it%20in%20CSV%20or%20Excel%20format.%20so%20to%20achieve%20this%20solution%20we%20will%20use%20PnP%20Powershell.%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3ELet's%20see%20step-by-step%20implementation.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH2%20id%3D%22toc-hId-1990012588%22%20id%3D%22toc-hId-1990010486%22%3EPrerequisites%3C%2FH2%3E%0A%3CP%3E%3CBR%20%2F%3EIf%20we%20are%20using%20Window%2010%20or%20we%20have%20PowerShellGet%20then%20we%20can%20run%20the%20below%20commands%20to%20install%20PnP%20PowerShell%20and%20AzuerAD%20Modules%3CBR%20%2F%3E%3CBR%20%2F%3EInstall%20PnP%20PowerShell%20Module%2C%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3EInstall-Module%20SharePointPnPPowerShellOnline%20-Scope%20CurrentUser%20%20%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH2%20id%3D%22toc-hId-182558125%22%20id%3D%22toc-hId-182556023%22%3EImplementation%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EOpen%20Windows%20Powershell%20ISE%3C%2FLI%3E%0A%3CLI%3ECreate%20a%20new%20file%20and%20write%20a%20script%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-30px%22%3ENow%20we%20will%20see%20all%20the%20steps%20which%20we%20required%20to%20achieve%20the%20solution%3A%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-30px%22%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E1.%26nbsp%3B%20We%20will%20read%20the%20site%20URL%20from%20the%20user%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E2.%26nbsp%3B%20then%20we%20will%20connect%20to%20the%20O365%20admin%20site%20and%20then%20we%20will%20connect%20to%20the%20site%20which%20the%20user%20has%20entered%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E3.%20Create%20a%20function%20to%20bind%20a%20CSV%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E4.%20Create%20a%20function%20to%20get%20user%20profile%20properties%20by%20email%20d%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E5.%26nbsp%3B%20In%20the%20main%20function%20we%20will%20write%20a%20logic%20to%20get%20web%20and%20users%20of%20site%20collection%20URL%20and%20then%20get%20all%20the%20properties%20and%20bind%20it%20to%20CSV%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-60px%22%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-30px%22%3ESo%20at%20the%20end%2C%20our%20script%20will%20be%20like%20this%2C%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%0A%24basePath%20%3D%20%23base%20path%20where%20you%20want%20to%20save%20CSV%20file(%22D%3A%5CChandani%5C...%5C%22)%0A%24dateTime%20%3D%20%22%7B0%3AMM_dd_yy%7D_%7B0%3AHH_mm_ss%7D%22%20-f%20(Get-Date)%0A%24csvPath%20%3D%20%24basePath%20%2B%20%22%5Cuserdetails%22%20%2B%20%24dateTime%20%2B%20%22.csv%22%0A%24adminSiteURL%20%3D%20%22https%3A%2F%2F****-admin.sharepoint.com%2F%22%20%23O365%20admin%20site%20URL%0A%24username%20%3D%20%23user%20email%20id%0A%24password%20%3D%20%22********%22%0A%24secureStringPwd%20%3D%20%24password%20%7C%20ConvertTo-SecureString%20-AsPlainText%20-Force%20%0A%24Creds%20%3D%20New-Object%20System.Management.Automation.PSCredential%20-ArgumentList%20%24username%2C%20%24secureStringPwd%0A%24global%3AuserDetails%20%3D%20%40()%0A%24index%20%3D%201%3B%0A%24userInfo%3B%0A%20%20%0AFunction%20Login()%20%7B%0A%20%20%20%20%5Bcmdletbinding()%5D%0A%20%20%20%20param(%5Bparameter(Mandatory%20%3D%20%24true%2C%20ValueFromPipeline%20%3D%20%24true)%5D%20%24Creds)%0A%20%0A%20%20%20%20%23connect%20to%20O365%20admin%20site%0A%20%20%20%20Write-Host%20%22Connecting%20to%20Tenant%20Admin%20Site%20'%24(%24adminSiteURL)'%22%20-f%20Yellow%20%7C%20Out-File%20%24LogFile%20-Append%20-Force%0A%20%20%0A%20%20%20%20Connect-PnPOnline%20-Url%20%24adminSiteURL%20-Credentials%20%24Creds%0A%20%20%20%20Write-Host%20%22Connection%20Successfull%22%20-f%20Yellow%20%7C%20Out-File%20%24LogFile%20-Append%20-Force%0A%20%20%20%0A%7D%0AFunction%20StartProcessing%20%7B%0A%20%20%20%20Login(%24Creds)%3B%0A%20%20%20%20ConnectionToSite(%24Creds)%0A%7D%0A%0AFunction%20ConnectionToSite()%20%7B%0A%20%20%20%20%24siteURL%20%3D%20Read-Host%20%22Please%20enter%20site%20collcetion%20URL%22%20%0A%20%20%0A%20%20%20%20try%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20Write-Host%20%22Connecting%20to%20Site%20'%24(%24siteURL)'%22%20-f%20Yellow%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24SCWeb%20%3D%20Get-PnPWeb%20-Identity%20%22%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24getusers%20%3D%20Get-PnPUser%20-Web%20%24SCWeb%0A%0A%20%20%20%20%20%20%20%20ForEach%20(%24user%20in%20%24getusers)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%24email%20%3D%20%24user.Email%0A%20%20%20%20%20%20%20%20%20%20%20%20If%20(%24email)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24userInfo%20%3D%20GetUserProfileProperties%20%24email%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23creating%20object%20fro%20CSV%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24global%3AuserDetails%20%2B%3D%20New-Object%20PSObject%20-Property%20(%5Bordered%5D%40%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Id%20%20%20%20%20%20%20%20%20%20%20%20%3D%20%24index%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20GUID%20%20%20%20%20%20%20%20%20%20%3D%20%24userInfo.'UserProfile_GUID'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20FirstName%20%20%20%20%20%3D%20%24userInfo.FirstName%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20LastName%20%20%20%20%20%20%3D%20%24userInfo.LastName%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WorkEmail%20%20%20%20%20%3D%20%24userInfo.WorkEmail%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PictureURL%20%20%20%20%3D%20%24userInfo.PictureURL%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Department%20%20%20%20%3D%20%24userInfo.Department%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PreferredName%20%3D%20%24userInfo.PreferredName%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24index%2B%2B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%0A%20%20%20%20catch%20%7B%0A%20%20%20%20%20%20%20%20Write-Host%20-f%20Red%20%22Error%20in%20connecting%20to%20Site%20'%24(%24TenantSite)'%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20BindingtoCSV(%24global%3AuserDetails)%20%0A%7D%0A%0AFunction%20BindingtoCSV%20%7B%0A%20%20%20%20%5Bcmdletbinding()%5D%0A%20%20%20%20param(%5Bparameter(Mandatory%20%3D%20%24true%2C%20ValueFromPipeline%20%3D%20%24true)%5D%20%24Global)%20%20%20%0A%20%20%20%20Write-Host%20-f%20Yellow%20%22Exporting%20to%20CSV...%22%0A%20%20%20%20%24userDetails%20%7C%20Export-Csv%20%24csvPath%20-NoTypeInformation%20-Append%0A%20%20%20%20Write-Host%20-f%20Yellow%20%22Exported%20Successfully...%22%0A%7D%0A%0AFunction%20GetUserProfileProperties(%24username)%20%7B%0A%20%20%20%20%24Properties%20%3D%20Get-PnPUserProfileProperty%20-Account%20%24username%0A%20%20%20%20%24Properties%20%3D%20%24Properties.UserProfileProperties%0A%20%20%20%0A%20%20%20%20If%20(%24Properties)%20%7B%0A%20%20%20%20%20%20%20%20%24Properties%20%3D%20%24Properties%0A%20%20%20%20%7D%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%24Properties%20%3D%20%24null%0A%20%20%20%20%7D%0A%20%20%20%20return%20%24Properties%0A%7D%0A%0AStartProcessing%0A%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%20class%3D%22lia-indent-padding-left-30px%22%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EIn%20the%20above%20script%20do%20the%20following%20changes%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E1.%20Change%20O365%20Site%20Url%2C%20base%20path%2C%20username%2C%20and%20password%3C%2FP%3E%0A%3CP%3E2.%20To%20check%20all%20the%20properties%20you%20can%20print%20%3CSTRONG%3E%24userInfo%3C%2FSTRONG%3E%20and%20then%20change%26nbsp%3B%3CSTRONG%3E%24global%3AuserDetails%3C%2FSTRONG%3E%20object%20as%20per%20your%20requirement%20at%20where%20I%20have%20used%26nbsp%3B%3CSTRONG%3E%24userInfo.FirstName%2CLastName%3C%2FSTRONG%3E%20etc.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EThen%20run%20the%20script%20with%20the%20%3CSTRONG%3EF5%3C%2FSTRONG%3E%20command.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH2%20id%3D%22toc-hId--1624896338%22%20id%3D%22toc-hId--1624898440%22%3EOutput%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22OP.png%22%20style%3D%22width%3A%20907px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F266636iB92222C87793AD1B%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22OP.png%22%20alt%3D%22OP.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EAfter%20this%20check%20the%20CSV%20file%20at%20your%20base%20location.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH2%20id%3D%22toc-hId-862616495%22%20id%3D%22toc-hId-862614393%22%3ESummary%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3ESo%20in%20this%20article%2C%20we%20have%20seen%20how%20to%20get%20user%20and%20user%20profile%20properties%20and%20as%20well%20as%20how%20to%20export%20them%20to%20CSV.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EHope%20this%20helps!%20If%20it%20is%20helpful%20to%20you%20then%20share%20it%20with%20others.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3ESharing%20is%20caring!%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-2232136%22%20slang%3D%22en-US%22%3E%3CP%3EIn%20this%20article%2C%20we%20will%20read%20the%20site%20collection%20URL%20from%20the%20user%2C%20and%20based%20on%20that%20site%20collection%20URL%20we%20will%20get%20all%20the%20users%20and%20user%20profile%20properties.%20And%20then%20export%20it%20to%20CSV%20format.%3C%2FP%3E%3C%2FLINGO-TEASER%3E
Co-Authors
Version history
Last update:
‎Mar 24 2021 04:29 AM
Updated by: