Get MySite QuickLinks From SharePoint 2013 OnPrem Using PowerShell CSOM

I had a requirement to retrieve quick links for a specific user from a user profile service. Though this can be achieved using "Server Side Object Model" it is restricted for some of the companies to run their "SSOM" code on the production environment. Thus, we came up with an idea of creating PowerShell script using CSOM to retrieve quick links using "User Profile Web Service".

Here you will be seeing how to get mysite quicklinks from user profile in SharePoint 2013 using the PowerShell and CSOM for a specific user account using "User Profile WebService" (UserProfileService.asmx)

You can navigate to my site quick links path in SharePoint office 365 site as shown below.
  1. "https://<tenant>-my.sharepoint.com/_layouts/15/MyQuickLinks.aspx"  
Below is the OnPrem Path. 
  1. https://<tenant>.sharepoint.com/_layouts/15/MyQuickLinks.aspx  
The below code retrieves quicklinks from user profile for the specified user account and exports the resulting data to a CSV File.
 
Code Usage
  1. ##Create an empty System.Array object  
  2. $QuickLinksArray = @()  
  3.  
  4. ## Web Service Reference - http://Site/_vti_bin/UserProfileService.asmx  
  5. $uri="http://<site>/_vti_bin/UserProfileService.asmx?wsdl"  
  6.  
  7. ## if you are executing this code in a Virtual Machine it's default credentials will be used to connect to proxy.  
  8. $userProfileDataServiceWebServiceReference = New-WebServiceProxy -Uri $uri -UseDefaultCredential  
  9.  
  10. ##Get quick links for the specified user account.  
  11. $userLinks = $userProfileDataServiceWebServiceReference.GetUserLinks("domain\accountid")  
  12.  
  13. ##Iterate on the comments collection and store the value in PageNoteBoardComments array collection.   
  14. foreach($item in $userLinks)  
  15. {  
  16.   
  17.  $QuickLinksArray += New-Object   
  18.  PsObject -property @{  
  19.   
  20.    'URL' = [string]$item.Url  
  21.   
  22.    'Name' = [string]$item.Name  
  23.   
  24.    'Privacy' = [string]$item.Privacy  
  25.   
  26.    'Group' = [string]$item.Group  
  27.   
  28.    'ID' = $item.ID  
  29.    }  
  30. }  
  31.  
  32. ##Finally, use Export-Csv to export the data to a csv file  
  33. $QuickLinksArray | Export-Csv -NoTypeInformation -Path "D:\Madhu\Powershell\QuickLinks.csv"  
Scenario 2
 
To retrieve all the user links from user profile based on account name.

Note
All the account name's are under "Title" column in Excel sheet. 
  1. #Path to the CSV output path file.  
  2. $CSVOutputfilepath = "D:\XXXX\GetMyLinks.csv"  
  3.  
  4. #Path to the log file.  
  5. $outputfilepath = "D:\XXXX\GetMyLinksLogs.txt"  
  6.  
  7. #Excel File path.  
  8. $FilePath = "D:\XXXX\userlist.xls"  
  9.  
  10. #Create an empty System.Array object  
  11. $QuickLinksArray = @()  
  12.  
  13. # Create an Object Excel.Application using Com interface  
  14. $objExcel = New-Object -ComObject Excel.Application  
  15.  
  16. # Disable the 'visible' property so the document won't open in excel  
  17. $objExcel.Visible = $False  
  18.  
  19.      
  20. # Open the Excel file and save it in $WorkBook  
  21. $WorkBook = $objExcel.Workbooks.Open($FilePath)  
  22.      
  23.  
  24. # Load First sheet  
  25. $sheet = $WorkBook.Worksheets.Item(1)  
  26.      
  27.  
  28. #Find PageUrl and get the column position  
  29. $pageurlcolumns = $sheet.UsedRange.Columns.Find('Title').Column  
  30.  
  31. #Get all the Rows within Excel  
  32. $rows = $sheet.UsedRange.Rows.Count  
  33.  
  34. ## Get Page Number Count          
  35. $count = 1;  
  36.  
  37. ## Get number of user in excel  
  38. $rowCount  = $rows - 1  
  39.   
  40.  "-"*80 | Write-Host  
  41.  Write-Host -ForegroundColor Green "Total number of account's initiated : " $rowCount  
  42.  Write-Host -ForegroundColor Green "Started at : $((Get-Date).ToString())"  
  43.  "-"*80 | Write-Host  
  44.   
  45. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  46. "Total number of account's initiated : " + $rowCount | Out-File -Encoding Ascii -append $outputfilepath  
  47.  "Started at :" + $((Get-Date).ToString()) | Out-File -Encoding Ascii -append $outputfilepath  
  48.  "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  49.   
  50. for ($i=2; $i -le $rows; $i++)  
  51. {  
  52.     try{  
  53.          
  54.         #Get PageUrl column values -  Eg: Domain\accountID  
  55.         $accountID = $sheet.Cells.Item($i, $pageurlcolumns).text   
  56.  
  57.         #Log Account ID  
  58.         Write-Host -ForegroundColor Green "$count : " $accountID   
  59.         "$count : " + $accountID | Out-File -Encoding Ascii -append $outputfilepath  
  60.           
  61.         ## Get path of user profile webservice file  
  62.         $uri = "http://<site>/_vti_bin/UserProfileService.asmx?wsdl"  
  63.               
  64.         ## Web Service Reference - http://Site/_vti_bin/UserProfileService.asmx  
  65.         $userProfileServiceWebServiceReference = New-WebServiceProxy -Uri $uri -UseDefaultCredential   
  66.            
  67.         ## Retrieve user links by account name                  
  68.         $quickLinksOnAccountID = $userProfileServiceWebServiceReference.GetUserLinks($accountID)    
  69.                   
  70.         foreach($item in $quickLinksOnAccountID)  
  71.         {  
  72.                 $QuickLinksArray += New-Object PsObject -property @{  
  73.                     'ID'= $item.ID  
  74.                     'Name' = [string]$item.Name  
  75.                     'URL' = [string]$item.Url  
  76.                     'Group' = [string]$item.Group  
  77.                     'Privacy' = [string]$item.Privacy  
  78.                     'UserLoginID' = [string]$accountID  
  79.                       
  80.                  }     
  81.               
  82.                   ##Add comments for a specific page.  
  83.                   #$WriteCommentsOnUrl = $socialDataServiceWebServiceReference.AddComment($url,$item.Comment,0,"TestMultiline")  
  84.                 
  85.         }   
  86.         $count++  
  87.     }  
  88.     catch{  
  89.         Write-Host -ForegroundColor Green "$count : $accountID : " $_.Exception.Message  
  90.         "$accountID : " + $_.Exception.Message | Out-File -Encoding Ascii -append $outputfilepath  
  91.     }  
  92.               
  93. }  
  94.  
  95. #Finally, use Export-Csv to export the data to a csv file  
  96. $QuickLinksArray | Export-Csv -NoTypeInformation -Path $CSVOutputfilepath  
  97.   
  98.   
  99. "-"*80 | Write-Host  
  100. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  101. Write-Host -ForegroundColor Green "Completed at : $((Get-Date).ToString())"  
  102. "Completed at : " +  $((Get-Date).ToString()) | Out-File -Encoding Ascii -append $outputfilepath  
  103. Write-Host -ForegroundColor Green "Total QuickLinks Found : " $QuickLinksArray.Count  
  104. "Total QuickLinks Found : " + $QuickLinksArray.Count | Out-File -Encoding Ascii -append $outputfilepath  
  105. "-"*80 | Write-Host  
  106. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  107.   
  108.  #Close the workbook object    
  109.  $WorkBook.close()  
  110.  
  111.  #close the excel object  
  112.  $objexcel.quit()  
Please feel free to share your comments.
 
Hope this helps !!!!