A recent project I begin working on required me to pull data from SharePoint MySite User Profiles. Luckily Microsoft provided a great way to access the fields in user profiles. In this post I will croncical how to leverage VB.NET and the SharePoint web services to get the job done.

Step 1

First step is to fire up Visual Studio and create a new project.

Step 2

The next step is to add a simple aspx page to your solution.

Chose Web Form and give it the name Default.aspx and click Add

Step 3

The next step is to add web reference(s) to SharePoint’s web services. In my project it was required that I collect a profile field for each user in SharePoint.

Enter the URL to the web service:
http://mysite/_vti_bin/userprofileservice.asmx?wsdl

Enter a name for your web service… I called my “wsUP”

Step 4

Switch to the Code-Behind of the default.aspx file and add the following in the page_load event.


Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim wsUserProfiles As wsUP.UserProfileService = New wsUP.UserProfileService
        wsUserProfiles.Credentials = System.Net.CredentialCache.DefaultCredentials

        Dim numProfiles As Integer = CType(wsUserProfiles.GetUserProfileCount, Integer)

        For i As Integer = 0 To numProfiles

            Dim profileIndex As wsUP.GetUserProfileByIndexResult = wsUserProfiles.GetUserProfileByIndex(i)

            'Login Name
            Response.Write(profileIndex.UserProfile(1).Values(0).Value)

            'First Name
            Response.Write(profileIndex.UserProfile(2).Values(0).Value)

            'Last Name
            Response.Write(profileIndex.UserProfile(3).Values(0).Value)

        Next

    End Sub

End Class

This should get you an idea of what you can do. I reccommend setting a debug point on the “profileIndex” variable to figure out other indices of UserProfile like “work email, department, etc”.

One thing to look out for is users running this code that aren’t administrators. The GetUserProfileCount method needs administrator privileges for the user running the code in Sharepoint. If you need to use credentials different from the default machine credentials you can explicitly set them:


Dim credentials As NetworkCredential = New NetworkCredential("DOMAIN\accountLogin", "mypassword")
wsUserProfiles.Credentials = credentials

Note: you will need to Imports System.Net

I’d like to find a more efficient way to grab specific profile properties from all the users without looping through the whole user profile. If anybody has any ideas please chime in.

Related Links:
http://stackoverflow.com/questions/2992468/sharepoint-2010-get-the-distinct-values-of-a-user-profile-property
http://usingsystem.wordpress.com/2008/01/18/sharepoint-user-profiles-part-2/#comments
http://stackoverflow.com/questions/329535/sharepoint-get-a-list-of-current-users