Windows Live Alerts web tracker BlogRankers.com Software
Computers blogs
Chat with me if I'm online!
Search Zimmergren.net
Goodies

SharePoint's hidden user-list - User Information List

Okay, this might not come as news to most SharePoint developers who've been around a while, but lately I've been messing with the User Information List in SharePoint and it doesn't seem that many people know that it exists.

Note: This list is only visible to and accessible by administrators.

User Information List - Background

The User Information List stores information about a user by having some metadata set up for the user. Some examples are Picture, Email, DisplayName, LoginName etc. ) For a complete list of fields, see further down this blogpost under "User Information List Fields".

Something to note is that when a user is granted access to a site, a new item will be created in the User Information List storing some information about the user.

When a user add/create or edit an item, SharePoint will display something like "Last modified at 1/1/2008 by Tobias Zimmergren" like the following pic:

image

In this example the DisplayName (used to display System Account) is gathered from the User Information List

Browsing the User Information List

The User Information List can be accessed (Only if you're admin) via the browser by navigating to /_catalogs/users/simple.aspx from your site. (Ex: http://zimmergren/_catalogs/users/simple.aspx)

This works for both Windows SharePoint Services 3.0 (WSS 3.0) and Microsoft Office SharePoint Server 2007 (MOSS 2007) and looks like this when you access it through the browser:

image

Write code to interact with the User Information List

If you want to interact with this list to set properties on a user (Probably only want to do this if you're running WSS) you could do it like this:

// Instantiates the User Information List
SPList userInformationList = SPContext.Current.Web.SiteUserInfoList;

// Get the current user
SPUser user = SPContext.Current.Web.EnsureUser(@"ZIMMER\TobiasZimmergren");

// The actual User Information is within this SPListItem
SPListItem userItem = userInformationList.Items.GetItemById(user.ID);

The above code will give you the SPListItem object which links to the currently logged in user (the one executing the request).

You can then work with the SPListItem object like normal to get or set the properties like this:

string pictureURL = userItem["Picture"].ToString();

User Information List Fields

Instead of writing out all the fields/columns availible, you can simply create a new Console Application and insert the following code in order to output all the fields names and internalnames:

image
Note: You will ofcourse have to change the URL and User LoginName
Note2: No comments needed about not disposing the objects as this was merely a sample, eh? ;)

You're welcome

Hope this will enlighten some of you people in your quest for the holy grail (SharePoint All-Mighty Knowledge?)

Work is calling me, so I'll have to end this small post right here and right now, catch you soon again.


Published: Jun-25-08 | 11 Comments | 0 Links to this post

Back on track

I've been getting tons and tons of mail from people regarding the blog, Forum Webpart and my vacation during the last 3 weeks.

There has been quite a few things happening the last couple of weeks. Not only the awesome vacation I had in Egypt, but also moving into my new apartement.

Egypt

Hats off to Egypt, and to the people who recommended me to go there. It's an interesting place to visit, and there's plenty of souvenirs to buy if you're that kind of person (Like me). Part from just purchasing souvenirs the Red Sea is probably one of the best places in the world to dive and snorkel in. We went snorkling in the Red Sea and holy cow, it's awesome. Incredible-looking fishes swimming right next to you, almost checking you out as you dive around. It was like swimming straight into the Discovery Channel or a giant aquarium if you like.

New apartement

The other thing that has obsorbed most of my sparetime (blogtime, sharepoint-coder-time etc) is my new apartement which I moved into this weekend. If you've got your ways through Malmö (Down south in Sweden), you're welcome to pay me a visit for some never-ending SharePoint nerd talk and a beer or two.

SharePoint Forum WebPart

People have been bugging me lately about the SharePoint Forum WebPart, and getting a working version out there. As mentioned before, other things did get my focus the last couple of weeks - but now I'm back and I need your suggestions, which I'll leave the next blogpost for!

Thanks for tuning in, and please re-send any emails I might have accidentally sorted out during the crazy hours of mail-sorting the last couple of days ;)


Published: Jun-10-08 | 3 Comments | 0 Links to this post

SharePoint Virtual Images from Microsoft

WSS 3.0 SP1 Virtual Disk

Tonight at 08:23 Microsoft released the Windows SharePoint Services 3.0 SP1 virtual disk with Visual Studio pre-installed.

You can find the Windows SharePoint Services 3.0 SP1 here

MOSS 2007 Virtual Disk

Most of you probably already know that there's an image out for Microsoft Office SharePoint Server 2007 to use with Virtual PC or Virtual Server 2005, but if you didn't know:

You can find the Office SharePoint Server 2007 VHD here.

 

Sidenote: Yes, I'm still going to Egypt - Just had to pitch in the update about WSS 3.0 SP1 virtual harddrive since a lot of people attending my SharePoint Development classes asks about just that! :)

Edit: URL's were interchanged, updated. Thanks Paresh.


Published: May-17-08 | 5 Comments | 0 Links to this post

Forum WebPart, Egypt and new litterature

Hi people. As many of you guys already know I'm off to Egypt for a well deserved vacation for 2 weeks now. I'll be back on track June 4th with lots of new material to blog about.

Here's a quick status of all things going on:

SharePoint Forum WebPart

The SharePoint Forum WebPart that I'm currently developing is shaping up, but there's still things that needs to be take care of before I can throw it into the wild. I was hoping to get it out as a beta already, but more prioritized things came up and I had to postpone it a few days.

I promise to get it up and running as soon as I'm back from the pyramids!

Inside the Index and Search Engines: Microsoft Office SharePoint Server 2007

I purchased MVP Patrick Tisseghem and Lars Fastrup's latest book, Inside the Index and Search Engines which will cover a lot of the ground when it comes to enterprise search. I've started to read it a bit now, and it's quite well written with many good samples. This will be the only litterature I'm bringing on my vacation to Egypt on monday ;)

Egypt - I'm off for a 2 week vacation by the pyramids

On monday I'm going to Egypt and I'll stay there for 2 weeks on a well deserved vacation. As aforementioned, I'll take on the "inside the index and search engines"-book while down in Egypt during some "lazy hours" and will probably have some nice feedback regarding this book when I'm back.

See you around

See you around when I'm back, with even more material on different topics regarding SharePoint.

Keep up the good work people, and I'll just sip some Mojitos, Egyptian Whiskey and eat some good food for the next two weeks.


Published: May-16-08 | 5 Comments | 0 Links to this post

How To: Easily construct your CAML queries with CAML Query Builder

This post is a mere followup to my previous minor posts on the subject of SPQuery and SharePoint queries located here.

Basically this post will provide step-by-step instructions to construct your CAML (Collaborative Application Markup Language) queries using the U2U CALM Query Builder which you can find on the U2U Community Tools page.

Prerequisites

In order to be able to follow along with this step-by-step instructions you'll need the following:

  • U2U CAML Query Builder 2007 or later
  • A site containing a Task List with some items
    • Some items with Status set to Completed
    • Some items with Status set to something else than Completed
Let's get going!
  1. First of all, make sure you've got some items in your Task list:
    image

  2. Launch U2U CAML Query Builder

  3. Fill in the URL to your SharePoint site and choose weather you'd like to go in the Object Model-way or using SharePoint Web Services. I chose Connect via Object Model:
     image

  4. Select "Tasks" in the list that you'll be presented with, and the right-hand side of the application will automatically be filled with the fields availible for that list, which will be the basis for our query:
    image

    As you can see here, there's the option to:
    • Choose the field - the CAML Query Builder will automatically choose the InternalName
    • "Order By" - order the results being returned in any choose order
    • "Where" - Specify which results should be part of the returning resultset, this is the most vital tag if you ask me!
    • "Test Your CAML!"
      • "Editor": Enter any CAML here and hit the "Test" button in order to test the entered query directly against your List
      • "Parameters": Retrieves any parameters
      • "Result": The returning result of the query you test
        (tip: Always test your query before applying it to your code, no matter how simple it may be)

 

  1. Select the "Status" field
  2. Check "Where" and choose "Equal"  and choose the value "Completed" like this:
    image

  3. Hit the little arrow pointing to the right, and the query will be automatically created for you and you'll get the CAML in the bottom-window like this:
    image
    IMPORTANT: When you construct your query in SharePoint later on, REMOVE the <Query> tags. See this post on the subject.

  4. Now that you've created the CAML you want, hit the "Test" button to the right and make sure you get the desired result!
    image
    Note: You can check the column called Status and make sure that all rows returned states "Completed"

  5. Now we've got our CAML Query ready to be implemented in our SharePoint code. Since we didn't make anything complex or advanced it'll be quite easy to implement this query, as I will show you now.
Prepare a Console Application for SharePoint Development

I will for simplicity create a Console Application to retrieve the desired SPListItem objects based on our SharePoint CAML query

  1. Create a new Console Application

  2. Add a reference to Microsoft.SharePoint.dll (Windows SharePoint Services) in order to be able to access the SharePoint object model
    image

  3. Add the following standard using-directive (Microsoft.SharePoint) in order to be able to use the classes in the SharePoint namespace:
    image

  4. Now we're ready to roll - hang on to your camel
Implementing a normal list loop, without queries (not a good approach)

The following example is what it basically looks like at many implementations. A straight through loop that'll basically loop EVERY item in the list and check EVERY object if it's matching what we want - this is not a valid approach if you've got a couple of thousand (or even just a couple of hundred) items in the list. It'll take way too long.

 

image 

The output is correct, but the time to walk through each item may even cause a timeout if you've got many thousand items in the list.
image

Implementing SharePoint (CAML) Queries using the SPQuery object (very good approach)

This will demonstrate how you achieve exactly the same result as previously demonstraded, but with less resource-hogging and much quicker.

Direct advantages:

  • Ordering, you can specify exactly in what order, sorted on any column that you want your resultset to be.
  • Filter out unwanted items (using the Where-tag you can simply choose ONLY the items you want returned)
  • SharePoint will dig right into the list and pick out the correct objects much faster than the previous example

Take a look at the following code, which will implement our previously created query:
image 
IMPORTANT: As you can see in the code above, I didn't use the <Query> and </Query> tags provided by the U2U CAML Query Builder. If you do, your query will not work ;)

Conclusion

You may not acknowledge any performanceboost if you've got up to 100 items in your list, but when the list grows you'll notice a huge difference immediately.

I did a test on my Forum Web Part where I had about 2500 posts (items in a list) and retrieved them using the first approach mentioned here (simply looping all items and using if-statements on each of them) - it resulted in timeouts all the time. When the page loaded, it took more than a minute per request, which isn't appreciated by anyone ;)

When I made the comparsion with my SPQuery implementation to directly pick out the items I wanted, it resulted in a 1 second loadtime instead of more than a minute. This speaks a lot about how good queries are.

Yeah okay.. So what should I do now?

You should most definately refactor all your code to use Queries if you havn't already!

Most people already do use this approach, but since I keep seeing implementations that doesn't, I just thought I'd write this little piece up.

Hope someone can find it useful.


Published: May-05-08 | 319 Comments | 0 Links to this post

Introduction to SharePoint Queries

Prephase

Recently I've been using SharePoint Queries more and more, not to say in my latest personal project: Zimmergren Forum WebPart. At times when I've been out at some clients to help them either refactor existing code or build new code, weather doing it myself of joining an existing SharePoint team - I always bump into things that could be solved using Queries instead of the way they've solved it using for- and foreach loops to go through entire lists with if-statements checking if that's what they're looking for.

Example: Code not using queries - Get all SPListItem objects that matches a value in a specified field

The following few lines of code is a sample of how you could fetch some SPListItems and check weather they're what you're looking for or not - without using SharePoint Queries (SPQuery). I've seen this kind of implementation one time too many and thought that it'd try to clarify the benefits with using SharePoint Queries.

Sample code without queries:

int counter = 0;
SPList myList = SPContext.Current.Web.Lists["ForumList"];
foreach (SPListItem forumItem in myList.Items)
{
    if (forumItem["ForumID"].ToString() == forumID.ToString())
        counter++;
}
return counter;

This code will work well if you don't have too many items in your list. But if you'd have a couple of hundred or even thousand items in the list, it'd take way too long to loop through each of these items to see if the ForumID matches the item's forumID.

Example: Code using queries - Get all SPListItem objects that matches a value in a specified field

To solve this issue, you should instead make use of the SPQuery (Microsoft.SharePoint.SPQuery) object in order to retreive only the items that actually contains the ForumID that you're looking for - without the need for checking each and every item in the list. This will increase performance drastically if you've got a couple of thousand items in a list and making a lot of calls to the method that gathers listitems.

Sample code that makes use of SharePoint Queries (SPQuery)

SPList myList = SPContext.Current.Web.Lists["ForumList"];

SPQuery query = new SPQuery();
query.Query = string.Format(
    "<Where>"+
      "<Eq>"+
         "<FieldRef Name='ForumID' />"+
         "<Value Type='Number'>{0}</Value>"+
      "</Eq>"+
   "</Where>", forumID); //forumID comes as a parameter to the method being called

SPListItemCollection listItems = myList.GetItems(query);

return listItems.Count;

The code above will significally increase performance of your code if there's plenty of items in the list.

Conclusion

This post was not meant to teach the technique of using SharePoint queries, but rather to enlighten you on the fact that there's a performance boost if you learn to use SPQuery instead of a bunch of if-statements to get specific ListItems.

I'll cover the basics and more all-around techniques of using Queries in my next blogpost!


Published: May-04-08 | 2 Comments | 0 Links to this post

SPQuery returning all items

If you've ever used the SPQuery objects to get SPListItems from a SPList, and you didn't get it to work because the query would return ALL items in the SPList, you might have used code similar to this:

SPQuery postsQuery = new SPQuery();
postsQuery.Query = string.Format(
    "<Query>"+
       "<OrderBy>"+
          "<FieldRef Name='Created' />" +
       "</OrderBy>"+
       "<Where>"+
          "<Eq>"+
             "<FieldRef Name='ThreadID' />"+
             "<Value Type='Number'>{0}</Value>"+
          "</Eq>"+
       "</Where>"+
    "</Query>", threadID);

SPList allPosts = SpecificForumData.GetPostList(); // Custom method to get the SPList object
SPListItemCollection posts = allPosts.GetItems(postsQuery);

I've always built my queries by hand (what better way to learn than trial and error, right?), but when I tried the U2U CAML Query Builder to construct my SPQuery it suddenly all failed, and all items in the SPList was returned.

To solve this issue, just remove the <Query> and </Query> tags from the generated query that U2U CAML Query Builder produces and it should all work again.

So, replace the above code with this:

SPQuery postsQuery = new SPQuery();
postsQuery.Query = string.Format(
       "<OrderBy>"+
          "<FieldRef Name='Created' />" +
       "</OrderBy>"+
       "<Where>"+
          "<Eq>"+
             "<FieldRef Name='ThreadID' />"+
             "<Value Type='Number'>{0}</Value>"+
          "</Eq>"+
       "</Where>", threadID);

SPList allPosts = SpecificForumData.GetPostList(); // Custom method to get the SPList object
SPListItemCollection posts = allPosts.GetItems(postsQuery);

If all is well, you should now be able to run this query to get better performance AND return only the selected SPListItem objects from the SPList

Edit: As a result of Peter's comment, I'd also like to mention that the RowLimit of an SPQuery object is set to 100 per default, so if you do not alter the .RowLimit property you'll end up with a result set of maximum 100 items. Thanks Peter

Hope it helps someone :)


Published: May-02-08 | 4 Comments | 0 Links to this post

"It's Silverlight, it's strong and tight, they got it right, try it tonight"

Over at Dan Wahlins blog you can listen to a new Silverlight song.

Go check it out and relax to some sweet Silverlight music.

- I know, I'm a geek.


Published: Apr-30-08 | 4 Comments | 0 Links to this post

SharePoint Forums WebPart : What's going on?

As a follow-up to my previous blogpost: "Forum Web Part for SharePoint" I thought I'd let you know the status of my personal pet-project.

I've been getting alot of feedback regarding the Forum WebPart which is soon to enter it's beta-testing stage. Thanks for the feedback in terms of the comments to my previous blogpost and all the emails I keep getting regarding the SharePoint Forum WebPart.

Status

The status of this project is as follows:

I'm currently trying to get as much done on the SharePoint Forum WebPart as I possibly can on my (few) free hours right now. I've got tons to tend to before I go to Egypt in May (which by the way will be awesome).

I plan to release it for alpha-/betatesting before I go on vacation to Egypt though, and I've been getting some response as to whom might be interested in testing it.
Unfortunately not everyone left their email, which makes it hard for me to contact those individuals.

So if you're not sure, or know that you didn't send over your email but you want to try the WebPart out, add a comment here and include your email. ;)

This is what the SharePoint Forum WebPart currently looks like:

Basic overview of all availible forums
scr009

Basic overview of threads in a forum
scr010

Basic features:

  • Forum Management
    • Manage what forums exists (Using the default SharePoint interface)
  • Thread Management
    • Manage threads (Using the default SharePoint interface)
    • Create new threads (Using a custom interface) - ugly as hell
  • Post Management
    • Manage posts (Using the default SharePoint interface)
    • Create new posts (replies) - also ugly as hell :)
  • Breadcrumbs
    • [Home] > [Forum] > [Thread]
  • Forum Statistics
    • Last post
    • Last poster
    • Total posts
    • Total threads
    • Total forums
  • Paging (WebPart Property, meaning you can set this property yourself to a desired amount of items per page)
  • Theming
    • Supports all built-in themes
    • Supports custom made themes
    • (All styles for the forum is using the built-in SharePoint CSS classes)
  • etc. etc.
Feedback, suggestions, comments and all of that

This is still a work in progress, and I'd like for YOU to leave a comment with suggestions about functionality, accessibility, usability, usage, features etc.

Thanks for tuning in, see you around!


Published: Apr-28-08 | 33 Comments | 0 Links to this post

Office Labs site launched - I urge you to check it out!

All I can say is, go check out "Office Labs" for yourself (click here).

And by the way, DO check out the "Community Clips" section. It's awesome.

That's all I had for now, back to coding some enhancements on the Forum WebPart which is coming along nicely... Just wish one had more time ;)


Published: Apr-28-08 | 0 Comments | 0 Links to this post
 Next >>