Get MySite Quick Links From SharePoint Online Using User Profile Web Service And Powershell

I had a requirement to retrieve quick links for a specific user from the user profile service in office 365 Sharepoint site (Sharepoint online). I have leveraged "User Profile Web Service"(UserProfileService.asmx) to achieve the same in PowerShell script using CSOM.

You can navigate to my site quick links path in SharePoint office 365 site as shown below

"https://<tenant>-my.sharepoint.com/_layouts/15/MyQuickLinks.aspx".
 
The below code reads the account name from an Excel file and retrieves Quicklinks from the user profile for the respective user account and exports the resulting data to a CSV File.
 
Note
All the account names are under "Title" column in the Excel sheet.

Code Usage
  1. #Path to the CSV output path file.  
  2. $CSVOutputfilepath = "D:\Madhu\GetMyLinks.csv"  
  3.  
  4. #Path to the log file.  
  5. $outputfilepath = "D:\Madhu\GetMyLinksLogs.txt"  
  6.  
  7. #Excel File path.  
  8. $FilePath = "D:\Madhu\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. # Open the Excel file and save it in $WorkBook  
  20. $WorkBook = $objExcel.Workbooks.Open($FilePath)  
  21.  
  22. # Load First sheet  
  23. $sheet = $WorkBook.Worksheets.Item(1)  
  24.  
  25. #Find PageUrl and get the column position  
  26. $pageurlcolumns = $sheet.UsedRange.Columns.Find('Title').Column  
  27.  
  28. #Get all the Rows within Excel  
  29. $rows = $sheet.UsedRange.Rows.Count  
  30.  
  31. ## Get number of user in excel  
  32. $rowCount  = $rows - 1  
  33. ## tenant admin url  
  34. $siteUrl = "https://<tenant>-admin.sharepoint.com"  
  35.  
  36. ## Read sharepoint online loginname  
  37. $loginname = "username@<tenant>.onmicrosoft.com"  
  38.  
  39.  
  40. ## Read password   
  41. $pwd = "XXXXXXX"  
  42.  
  43. ## Convert password to secure string.  
  44. $securePassword = ConvertTo-SecureString $pwd –AsPlainText -Force  
  45.  
  46. ## Connect to sharepoint online  
  47. $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($loginname, $securePassword)  
  48.  
  49. ## Web Service Reference - http://Site/_vti_bin/UserProfileService.asmx  
  50. $uri= $siteUrl + "/_vti_bin/UserProfileService.asmx"  
  51.  
  52. ## Disable default credentials  
  53. $userProfileServiceWebServiceReference = New-WebServiceProxy -Uri $uri -UseDefaultCredential False  
  54.  
  55. ## Load online credentials to user profile service.  
  56. $userProfileServiceWebServiceReference.Credentials = $credentials  
  57.  
  58. ## Load Uri object  
  59. $uriS = New-Object System.Uri($siteUrl)  
  60.  
  61. ## Initiate Cookie container object  
  62. $container = New-Object System.Net.CookieContainer  
  63.  
  64. ## Auntenticate and set cookie.  
  65. $container.SetCookies($uriS, $credentials.GetAuthenticationCookie($siteUrl))  
  66.  
  67. ## Load cookie container to user profile.  
  68. $userProfileServiceWebServiceReference.CookieContainer = $container  
  69.   
  70. "-"*80 | Write-Host  
  71. Write-Host -ForegroundColor Green "Total number of account's initiated : " $rowCount  
  72. Write-Host -ForegroundColor Green "Started at : $((Get-Date).ToString())"  
  73. "-"*80 | Write-Host  
  74.    
  75.   
  76. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  77. "Total number of account's initiated : " + $rowCount | Out-File -Encoding Ascii -append $outputfilepath  
  78. "Started at :" + $((Get-Date).ToString()) | Out-File -Encoding Ascii -append $outputfilepath  
  79. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  80.  
  81. ## Get Page Number Count         
  82. $count = 1;  
  83.   
  84. for ($i=2; $i -le $rows; $i++)  
  85. {  
  86.   
  87.     try{  
  88.      
  89.         #Get PageUrl column values. Eg : madhukumargk@<tenant>.onmicrosoft.com (online login account)  
  90.         $accountID = $sheet.Cells.Item($i, $pageurlcolumns).text  
  91.  
  92.         #Get membership id for account id.  
  93.         $accountName = "i:0#.f|membership|" + $accountID  
  94.  
  95.         #Log Account ID  
  96.         Write-Host -ForegroundColor Green "$count : " $accountID  
  97.         "$count : " + $accountID | Out-File -Encoding Ascii -append $outputfilepath  
  98.  
  99.         ##Get quick links for the specified user account.  
  100.         $userLinks = $userProfileServiceWebServiceReference.GetUserLinks($accountName)  
  101.  
  102.         ##Iterate on the comments collection and store the value in PageNoteBoardComments array collection.  
  103.         foreach($item in $userLinks)  
  104.         {  
  105.   
  106.                $QuickLinksArray += New-Object  PsObject -property @{  
  107.   
  108.                    'URL' = [string]$item.Url  
  109.   
  110.                    'Name' = [string]$item.Name  
  111.   
  112.                    'Privacy' = [string]$item.Privacy  
  113.   
  114.                    'Group' = [string]$item.Group  
  115.   
  116.                    'ID' = $item.ID  
  117.   
  118.                     }  
  119.   
  120.         }  
  121.   
  122.         $count++  
  123.     }  
  124.   
  125.     catch{  
  126.   
  127.          Write-Host -ForegroundColor Green "$accountID : " $_.Exception.Message  
  128.   
  129.         "$accountID : " + $_.Exception.Message | Out-File -Encoding Ascii -append $outputfilepath  
  130.   
  131.     }  
  132.   
  133. }  
  134.  
  135.   
  136. #Finally, use Export-Csv to export the data to a csv file  
  137. $QuickLinksArray | Export-Csv -NoTypeInformation -Path $CSVOutputfilepath  
  138.   
  139. "-"*80 | Write-Host  
  140. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  141. Write-Host -ForegroundColor Green "Completed at : $((Get-Date).ToString())"  
  142. "Completed at : " +  $((Get-Date).ToString()) | Out-File -Encoding Ascii -append $outputfilepath  
  143. Write-Host -ForegroundColor Green "Total QuickLinks Found : " $QuickLinksArray.Count  
  144. "Total QuickLinks Found : " + $QuickLinksArray.Count | Out-File -Encoding Ascii -append $outputfilepath  
  145. "-"*80 | Write-Host  
  146.   
  147. "-"*80 | Out-File -Encoding Ascii -append $outputfilepath  
  148.  
  149.  
  150. #Close the workbook object   
  151. $WorkBook.close()  
  152.  
  153. #close the excel object  
  154. $objexcel.quit()  
Please feel free to share your comments.
 
I hope this helps!!!!!