Getting the Current User Name or ID in SharePoint using SharePoint Designer (no code)
A colleague sparked my interest in this today by asking me if getting the current user ID was possible without writing code. This would be a very trivial task by creating a custom web part but with that comes deployment, maintenance, support, etc. He had a simple requirement to pass the UserID in the query string and thought it would be overkill to do this using code, and I agreed. This put me on a mission to find out if this was possible using SharePoint designer. The usual Internet searches didn't return anything useful so once I figured it out I decided that this needed to be posted somewhere. So here is how you do it:
Using SharePoint designer open up the Data Source Library Pane
Hover over any library or list, using the drop down select "Show Data"
Next you will want to have SharePoint Designer insert a DataFormWebPart for you. These last two steps aren't really necessary, you could write all the markup by hand, but I find it is usually easier to have SPD do this for you, and then go back and clean it up, than it is to remember everything that you need and start from scratch. For this part I selected the Title field and used a Multiple Item View Form, you can select different fields/views as your situation calls for.
Now we can get to what this post was really about, getting the UserName and/or the User ID. To get the UserName all you need to do is add an XSL parameter. A little known fact here is that any parameter that is found in the parameter bindings section of the data source element can also be passed to the XSL using an XSL parameter. To be clear about what I added refer to the screen shot below, I have removed all the irrelevant XSL to make this easier to understand.
The above will show you the what SharePoint display's the user name as. This was a step in the right direction, but I still needed to actual user ID. To get this I decided to go the server variable route. Here is the documentation straight from MSDN on the three variables that are probably of interested for this situation.
AUTH_USER |
The name of the user as it is derived from the authorization header sent by the client, before the user name is mapped to a Windows account. This variable is no different from REMOTE_USER. If you have an authentication filter installed on your Web server that maps incoming users to accounts, use LOGON_USER to view the mapped user name. |
LOGON_USER |
The Windows account that the user is impersonating while connected to your Web server. Use REMOTE_USER, UNMAPPED_REMOTE_USER, or AUTH_USER to view the raw user name that is contained in the request header. The only time LOGON_USER holds a different value than these other variables is if you have an authentication filter installed. |
REMOTE_USER |
The name of the user as it is derived from the authorization header sent by the client, before the user name is mapped to a Windows account. If you have an authentication filter installed on your Web server that maps incoming users to accounts, use LOGON_USER to view the mapped user name. |
I decided to use the LOGON_USER variable, but note that you can use any server variable here, your not limited by SPD in any way. To do this I had to add the server variable to the ParameterBindings as well as the XSL. The end result of my DataFormWebPart is below.
<WebPartPages:DataFormWebPart runat="server"
IsIncluded="True"
FrameType="None"
NoDefaultStyle="TRUE"
ViewFlag="0"
Title="Shared Documents"
ListName="{EF49CFE7-C6C4-42D6-8FCB-B10D6CDC0A35}"
Default="FALSE"
DisplayName="Shared Documents"
__markuptype="vsattributemarkup" _
_WebPartId="{E39B973F-F567-4AE6-9913-36710D1ADA1A}"
id="g_e39b973f_f567_4ae6_9913_36710d1ada1a"
__AllowXSLTEditing="true"
WebPart="true"
Height=""
Width="" __WebPartId="{633D5B43-5675-4363-8F69-9BA87A3776ED}">
<DataSources>
<SharePoint:SPDataSource runat="server"
DataSourceMode="List"
UseInternalName="true"
selectcommand="<View></View>"
id="Shared_x0020_Documents1"><SelectParameters><WebPartPages:DataFormParameter
Name="ListID"
ParameterKey="ListID"
PropertyName="ParameterValues"
DefaultValue="EF49CFE7-C6C4-42D6-8FCB-B10D6CDC0A35"/>
</SelectParameters></SharePoint:SPDataSource>
</DataSources>
<ParameterBindings>
<ParameterBinding Name="ListID" Location="None" DefaultValue="EF49CFE7-C6C4-42D6-8FCB-B10D6CDC0A35"/>
<ParameterBinding Name="dvt_apos" Location="Postback;Connection"/>
<ParameterBinding Name="UserID" Location="CAMLVariable" DefaultValue="CurrentUserName"/>
<ParameterBinding Name="Today" Location="CAMLVariable" DefaultValue="CurrentDate"/>
<ParameterBinding Name="LogonUser" Location="ServerVariable(LOGON_USER)"/>
</ParameterBindings>
<datafields>@FileLeafRef,Name (for use in forms);@Title,Title;@Approval,Approval;
@CollectS,Collect Signatures;@CollectF,Collect Feedback;@ID,ID;@ContentType,Content Type;
@Created,Created;@Author,Created By;@Modified,Modified;@Editor,Modified By;
@_CopySource,Copy Source;@CheckoutUser,Checked Out To;@_CheckinComment,Check In Comment;
@CheckedOutTitle,Checked Out To;@CheckedOutUserId,ID of the User who has the item Checked Out;
@FileDirRef,Path;@FSObjType,Item Type;@HTML_x0020_File_x0020_Type,HTML File Type;
@File_x0020_Type,File Type;@IsCheckedoutToLocal,Is Checked out to local;@_SourceUrl,Source Url;
@_HasCopyDestinations,Has Copy Destinations;@ContentTypeId,Content Type ID;@_ModerationStatus,Approval Status;
@_UIVersion,UI Version;@Created_x0020_Date,Created;@FileRef,URL Path;@File_x0020_Size,File Size;
@_UIVersionString,Version;@ParentVersionString,Source Version (Converted Document);
@ParentLeafName,Source Name (Converted Document);@TemplateUrl,Template Link;</datafields>
<XSL>
<xsl:stylesheet xmlns:x="https://www.w3.org/2001/XMLSchema"
xmlns:d="https://schemas.microsoft.com/sharepoint/dsp"
version="1.0"
exclude-result-prefixes="xsl msxsl ddwrt"
xmlns:ddwrt="https://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:asp="https://schemas.microsoft.com/ASPNET/20"
xmlns:__designer="https://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:ddwrt2="urn:frontpage:internal">
<xsl:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="dvt_apos">'</xsl:param>
<xsl:param name="UserID"/>
<xsl:param name="LogonUser"/>
<xsl:variable name="dvt_1_automode">0</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$UserID"/><br/>
<xsl:value-of select="$LogonUser"/>
</xsl:template>
</xsl:stylesheet> </XSL>
</WebPartPages:DataFormWebPart>
And the screen shot...
And that does it, you can now show user name or user ID without using any code. An important side lesson of this is the fact that you can use anything in the parameter binding session in your XSL as well.
Hope this helps.
Comments
Anonymous
July 03, 2008
Thanks a lot! Great job! but I want to get all group permission of current user, Can use xslt do that?Anonymous
August 09, 2008
Thank you so much! I've been racking my brain on this problem for a while. Trying to do sharepoint development with the restriction of "No server-side code" allowed is tricky, and this technique is very valuable.Anonymous
October 15, 2008
Well - but you only solved part of your colleagues problem which also included "...to pass the UserID in the query string ..." !Anonymous
November 20, 2008
Is there a way to pull a list of the current user's site group memberships? I want to show or hide a specific column based on whether or not the current user is a member of a custom Approvers group I set up. The only way I know to do it now is by User ID, which means anytime I have to change the list, I have to also alter the code that "hides" the column for non-approvers. Any ideas on how to do this without writing C#? Thanks, TuesdayAnonymous
December 18, 2008
if you enter [Me] as the default value for a text field and set it to calculated, it returns the userIDAnonymous
April 21, 2009
Thanks, works great!! Anyone know how to pass this info on to an Oracle form or another app?Anonymous
May 10, 2009
Brilliant. Just brilliant. Thanks a bunch. Chill...Anonymous
June 09, 2009
Can i do this with out using sharepoint designer? My case is like this i have a custom list which consist of a coulmn called NAME.When i click New i want to get the current users name on that Name field.Anonymous
June 11, 2009
Is there a way to store the current user name in a list?Anonymous
June 24, 2009
Hi, I would like to get the current user name in a variable that I can use in the XSL of my search result webpart. I would like to format my result list depending on a comparison between the current user and the "exracted to" field. Is there a way to do this ? Many thanks !Anonymous
June 24, 2009
You are amazing ! Nice ApproachAnonymous
July 08, 2009
Can you have it show the logged in user in a specific field in a sharepoint form?Anonymous
July 22, 2009
I got the value of UserId returned using Javascript below. var abc = document.getElementById("WebPartg_641f8149_8c06_46c4_b2e6_91b55fd14776"); alert("Hello " + abc.innerText ); The value comes back inside a div tag. So need the id. Is there a better way?Anonymous
September 09, 2009
Nice method, allowed me to expose the UserID to javascript in order to prepopulate a people picker on a custom list form. Used Andy Bonner's method (http://cs.vbcity.com/blogs/skullcrusher/archive/2008/11/03/set-sharepoint-peoplepicker-field-mark-2.aspx) to populate the field, but needed an easy way to expose the UserID for Andy's javascript to grab it. This did the trick. Thanks again.Anonymous
September 21, 2009
This is really great. I would also want to know if there a CAMLVariable to retrieve an user's email ID?Anonymous
October 01, 2009
Nice !!!!!!!! get sharepoint user and group, it is simple. Try this too, <a href ="http://sarangasl.blogspot.com/2009/10/sharepoint-user-groups.html"><b>Get Current SharePoint user</b></a>Anonymous
October 01, 2009
Nice !!!!!!!! get sharepoint user and group, it is simple. Try this too, http://sarangasl.blogspot.com/2009/10/sharepoint-user-groups.htmlAnonymous
October 17, 2009
Hi, Thank you for this. I used your code and it works great. I had an additional need. I needed to filter my dataview based on a substring of LogonUser. In my case my LogonUser code are initials and numbers such as P16012. I had to filter based on just the numbers 6012. My LogonUser presents as COMSERVEP16012. So I added the following code to isolate just the numbers I need as a parameter <xsl:param name="LogonUser"/><xsl:param name="LoginNumbers"><xsl:value-of select="substring($LogonUser,12)"/></xsl:param> In the dataview I just filtered on the parameter added above [$LoginNumbers=@COM_x0020_ID] I hope others find this usefulAnonymous
October 22, 2009
So close. I am trying to take the a parameter like LoginNumbers above and set it as a parameter in a SqlDataSource UpdateQuery to update an operator field. How to I reference back to that? Thank you.Anonymous
November 04, 2009
The comment has been removedAnonymous
November 10, 2009
You can also do this for a SqlDataSource using a ControlParameter. This lets you pass the user's ID into a query before databinding. I haven't found a way to get the user's name from this, though. <asp:SqlDataSource ID="Data" runat="server" ConnectionString="..." SelectCommand="SELECT @user UserID"> <SelectParameters> <asp:ControlParameter Name="user" ControlID="Data" PropertyName="Page.Request.ServerVariables['AUTH_USER']" /> </SelectParameters> </asp:SqlDataSource> <asp:DetailsView runat="server" DataSourceID="Data" />Anonymous
February 03, 2010
Hi Tenorman, How did you get the domainuserID(P16012)? my LOGON_USER parameter gives me empty string.Anonymous
February 18, 2010
Thanks so much for this post. I wanted to display the current user name in a custom list form and was able to simply include the following portion in the cell where I wanted it to show: <xsl:value-of select="$UserID"/> The only other task was to pass the parameter to the stylesheet (it was referenced in the parameter bindings section for the custom list form, just hadn't been passed to be able to call from the xsl template): <xsl:param name="UserID"/> Thanks for the post! ChandaAnonymous
March 01, 2010
Excellent Thank you so much...Anonymous
August 01, 2010
thank you for the article and special thank you to Jeremy Green for the sql connection details, I have been trying to do this for a while now and the sql connection thing is so simple and completely solves my problem! it's made it a great monday for me! :-)Anonymous
November 08, 2010
Thanks a lot... It really helped me alot. I was looking for the same kind of solution.Anonymous
January 05, 2011
Good job. Another way to get the user id would be to simply hoover over the username and find the ID in the bottom left corner :)Anonymous
May 15, 2011
It's working like a charm...! Thanks youAnonymous
September 18, 2011
This works great, I just wanna ask, how will I pass the value to a textbox?Anonymous
January 09, 2013
Hi, I can't make it work. We need to show the current username in a page of the sharepoint intranet, and have a link that's sends the username embed, like this: </a href='test.php?id=username'/>click here</a> Or any why that sends the username to an external site. Please help me, thanksAnonymous
May 16, 2013
This helped me immensely, thank you! I used it to filter a list of messages by the name... been looking for this for a while. thanks again!Anonymous
November 26, 2013
Your post has helped me a lot. However just for information, when we upgraded to SP2013, i finally realised that the username is prefixed with i:0#.w| because of som changes in the claims authorization mechanism. Take care in the SQL query.Anonymous
February 17, 2014
thanks for sharing this..Anonymous
April 14, 2014
I am trying filter a external list by username. Unfortunately the list has loginname minus the 'domain ' . Ideally I would like to perform <ParameterBinding Name="LogonUser" Location="substring-after(ServerVariable(LOGON_USER),'')"/> to get the correct value to query. I am not sure how to achieve this. Please suggest a solution.Anonymous
September 22, 2015
I just found this as well: <asp:LoginName runat="server" id="loginName" FormatString="<script>var _user = {0}</script>"></asp:LoginName>