Microsoft InfoPath 2010
The official blog of the Microsoft InfoPath team

Get the User Profile through MOSS Web Services

Get the User Profile through MOSS Web Services

Rate This
  • Comments 37

It is now easier than ever to pre-populate your InfoPath 2007 forms with the user profile information of the current user.

Background:

In Microsoft SharePoint Server 2003, the UserProfileService.GetUserProfileByName(string accountName) web service method required the caller to pass the account name (e.g., domain\alias) associated with the user profile to retrieve.  Though required, this argument was not needed when retrieving the profile of the current user.  After all, the form was running with the network credentials of the current user and those credentials were passed to the web service.

The typical work-around was to deploy a custom WhoAmI web service as a façade for the UserProfileService.  This façade would provide a method (e.g., WhoAmI() ) that would detect the user's identity and effectively forward a call to the UserProfileService, returning the eventual result to the caller.

New for Microsoft Office SharePoint Server 2007 and InfoPath 2007:

In InfoPath 2007, you can get the logon name of the current user by just using a new built-in function; but what if you need to get more data than just the username? Manager name, phone number, office location, and other data are all accessible through the UserProfileService: read on.

A form that uses the UserProfileService of MOSS to retrieve the User Profile of the current user no longer needs to explicitly pass the account information of the current user to the GetUserProfile method of the UserProfileService.  Simply passing a null value to this method will cause the web service to grab the user identity from the request.  The web service will then use that information as the account name and will subsequently return the User Profile of the current user.

Use this technique when you want to pre-populate the fields of an InfoPath 2007 form with user information obtained from the MOSS 2007 User Profile Database. 

The following instructions detail how to build a form to demonstrate this capability.

Assumptions:

  • The default MOSS web application is configured to use Windows Authentication.
  • The MOSS server has an SSP with a User Profile Database that has been loaded from Active Directory
  • The end-user has a profile in the User Profile Database of the MOSS server
  • The end-user is logged into the client machine using his/her domain account.

 

Step 1: Create the form

  1. Open InfoPath and design a new, blank form
  2. Save the form as UserProfileDemo.xsn

Step 2: Design the form

  1. From the Layout Task Pane, add a 2 column x 4 row table to the form
  2. Place labels into the column 1 as follows: Name, Account, Email, and Phone
  3. Using the Controls Task Pane, drag four text box controls to your form, placing one in each row of column 2
  4. Using the Data Source Task Pane, rename the four "fieldX" data elements as follows: userName, userAccount, userEmail, and userPhone

 

Step 3: Set the security level of the form

  1. From the Main Toolbar, select Tools | Form Options
  2. Select Security and Trust from the list box
  3. Clear the checkbox next to Automatically determine security level
  4. Select Full Trust
  5. Hit OK.

Step 4: Add code to the form

  1. From the Main Toolbar, select Tools | Programming | Loading Event
  2. Right-click on UserProfileDemo node of the Project Explorer and choose Add Web Reference
  3. Enter the following for the URL: /_vti_bin/UserProfileService.asmx">http://<yourServerName>/_vti_bin/UserProfileService.asmx
  4. Enter the following for Web reference name: ProfileService
  5. Click Add Reference
  6. Replace the FormEvents_Loading event handler with the following code snippet:
public void FormEvents_Loading(object sender, LoadingEventArgs e) {
    XPathNavigator myRoot = MainDataSource.CreateNavigator();
    ProfileService.UserProfileService profileService = new ProfileService.UserProfileService();
    ProfileService.UseDefaultCredentials = true;
    ProfileService.PropertyData[] userProps = null;
    try {
        // Passing null to this method causes the profile of the current user to be returned.
        userProps = profileService.GetUserProfileByName(null);
    }
    catch { }
    if (userProps == null || userProps.Length == 0) {
        return;
    }
    for (int i = 0; i < userProps.Length; i++) {
        XPathNavigator node = null;
        switch (userProps[i].Name.ToLower())  {
            // these property names can be obtained by reviewing the user profile properties in the MOSS SSP.
            case "preferredname":
                node = myRoot.SelectSingleNode("/my:myFields/my:userName", NamespaceManager);
                break;
            case "accountname":
                node = myRoot.SelectSingleNode("/my:myFields/my:userAccount", NamespaceManager);
                break;
            case "workemail":
                node = myRoot.SelectSingleNode("/my:myFields/my:userEmail", NamespaceManager);
                break;
            case "workphone":
                node = myRoot.SelectSingleNode("/my:myFields/my:userPhone", NamespaceManager);
                break;
            default:
                continue;
        }
        ProfileService.ValueData[] values = userProps[i].Values;
        if (values.Length > 0) {
            if (node != null && string.IsNullOrEmpty(node.Value)) {
                node.SetValue(values[0].Value.ToString());
            }
        }
    }
}

 

Step  5: Build and Preview

  1. Build the project and close VSTA.
  2. From the Main Toolbar, select File | Preview| Form
  3. When the form loads, the text boxes will be populated with your User Profile Information

This example opens the door to simplifying the form submission process for your users by reducing the time they take to complete forms, as well as ensuring the accuracy of the data that they enter.

Ronald Tielke
Microsoft Consulting Services
Desert Mountain District

Leave a Comment
  • Please add 6 and 5 and type the answer here:
  • Post
  • Hello All:

    I got this error after previewing the IP form:

    "The query cannot be run for the following DataObject: GetUserProfileByName

    InfoPath cannot run the specified query.

    The SOAP response indicates that an error occurred on the server:

    The User Profile Manager object could not be loaded. ---> Value cannot be null.

    Parameter name: serverContext"

    * Note : I have my form "full trust"

    Thanks in advance

  • www.ceapet.com InfoPath-Getthecurrentuserwithoutwritingcode

    I'vejust

  • Hace un tiempo os comentaba como podemos leer User Profiles de MOSS . Como sabéis, cuando hablamos de

  • Hi, This is my 2nd post on this subject. This post will get down and dirty with code samples. The first

  • Hi everyone. I know you are going to hate me for this one, but here we go:

    I designed a form in 2003 and though publishing it in WSS 2.0 I am using this service from MOSS (GetUserProfile). Though me and a colleague do not have a problem when opening and submiting a form, several colleagues have either:

    "The following DataObject either cannot be created or cannot be initialized: GetUserProfileByName

    The query cannot be run for the following DataObject: GetUserProfileByName

    InfoPath cannot run the specified query.

    Access is denied."

    or

    "The following DataObject either cannot be created or cannot be initialized: GetCommonManager

    The query cannot be run for the following DataObject: GetCommonManager

    InfoPath cannot run the specified query.

    The SOAP response indicates that an error occurred on the server:

    Server was unable to process request. ---> Object reference not set to an instance of an object."

    I already removed the one of the services and still I have the same problem. I know it is asking a bit too much, but if you guys can through me a light, I'll appreciate it.

    Best,

    Gonçalo Sardinha

  • Sin duda, una de las ventajas de realizar formaci&oacute;n tecnol&oacute;gica especializada es que aprenden

  • Is there a "no coding" method of getting the user profile for someone other than the current user?

    I want to provide a field where the user could type in someone's account name and other fields in the form are filled in.

  • Hi lvirden,

    You should be able to use a Rule. As you have probably seen, when you create the connection to the UserProfileService and select the GetUserProfileByName method, you have a "queryField" in your data connection: AccountName. What you can do is something like this:

    - Have a textbox on your View where the user would enter the name

    - Have a button that contains a Rule with the following actions:

        - Set a field's value (this would set the "AccountName" queryField to the field that contains the name the user entered)

        - Query using a data connection (this would execute the web service data connection...in this scenario, you would want to make sure when you setup the data connection it does *not* automatically get the data when the form loads)

    This should allow the user to enter someone else's name and still retrieve data for that user.

    Scott

  • hi,

    if  i want to find out a user  or users  with matching a specific criteria, using this userprofileweb service, how can i  find it ?

     like if i want to find out the users whose  names are starting with tim*  (like  timothy, tim john, tim hanss etc etc)

    is there  any kind of filtering kind of methods available or  is possible through this web service?

  • The Add Reference button is disabled when i try to Add Web Reference: http://myserver/_vti_bin/UserProfileService.asmx.

    Can someone tell me why?

    Since the sharepoint server setup by someone else who is no longer with the company, how do i verify if the the following assumptions  are correct?

    1. The default MOSS web application is configured to use Windows Authentication.

    2. The MOSS server has an SSP with a User Profile Database that has been loaded from Active Directory

    3. The end-user has a profile in the User Profile Database of the MOSS server

  • For lvirden and infopath, I have created an entire write-up that shows how to use the codeless method shown by Itay to get user information for people other than the current user: InfoPath – Get user information without writing code (extended): http://claytoncobb.wordpress.com/2009/06/21/userprofileservice-extended/.

  • Hi

    Great blog! Both the code and codeless version work graet, but what do I need to do to get the users COMPANY information? It doesnt seem to work in either version.

    Regards,

    Marko

  • For some reason the code on this page is cut off halfway through.  I've tried on two different PC's to get it.  Running windows 7.  It stops at continue;  and there is no more.....can someone post the code in the comments?

  • The code snippet should be visible now. Thanks.

  • while building the project i get the following error:

    the type or namespace name 'UseDefaultCredentials' does not exist in the namespace 'UserProfileDemo.ProfileService'

    please guide me!

Page 2 of 3 (37 items) 123