you will always have simple requirement whenever you are working with workflow is to find the currently logged-in user.
It is really frustrating that it is easy to find who is the originator of the workflowproperties but you cannot find who is currently logged in user from workflowproperties even you have properties available.
Let me give you the scenario.
I assume that you have WorkflowProperties object.
So if you write ,
workflowProperties.OriginatorUser.ID
workflowProperties.OriginatorUser.Name
workflowProperties.OriginatorUser.ID.LoginName
you will get everything,
but if you write,
workflowProperties.Web.CurrentUser.Name
All you get is only system account, even the properties from the name looks like it will return you current logged in user. but it actually doesn't.
so why is it not returning it? what can be the reason.
Reason is Workflow actually does not run in the same session or same context, because workflow is to be hosted and to be called from the application by setting up the connection.
So it can be called up by any other application,office applications or any other source, it cannot be always the MOSS that triggers the workflow, and even if you triggers the Workflow from MOSS environment, it will still return you System Account.
so, how to get the Currently Logged-in User?
Here is a trick that i found.
string ModifiedbyUserName = Convert.ToString(workflowProperties.
Item.GetFormattedValue("Modified By"));
This will give you the person who has modified the item, this helps only at between the worklfow not at the time of start up because at the time of start up, originatorname is the currently logged in name of the user.
Let's say, when you modify the task, then you get the Task Item and check for this property, so you will get the current User.
Here when i have used Item, then Item referce to the Item of the list which is being changed. List can be any list, then above is the way you can get the Current Logged in user.
Again the problem is it returns the entire string representing Id, Name and connected properties.
If you fetch this string and display in the Label, then it will get converted to hyperlink which will take you to the UserDisp.aspx.
so you need to tweak the string. Here is a way to tweak the string.
string[] strChar = { "ID=" };
string[] strChars = ModifiedbyUserName.Split(strChar, StringSplitOptions.None);
Int32 iUserID = Convert.ToInt32(strChars[1].Substring(0, strChars[1].IndexOf("\"")));
string strAssignedTo = string.Empty;
for (int iCnt = 0; iCnt <= workflowProperties.Web.SiteUsers.Count - 1;iCnt++)
{
if (workflowProperties.Web.SiteUsers[iCnt].ID == iUserID)
{
strAssignedTo = workflowProperties.Web.SiteUsers[iCnt].Name;
break;
}
}
Now you will get the Name of the currently logged in user. you can also get all properties of any user because now you have SiteUser in hand.
5 comments:
Hi Malay Vasavada
thanks alot for this post,
i was looking for this only.
god bless u and keep the good work going
Why wouldn't you just use the workflowProperties.OriginatorUser value as this is stamped with the credentials of the logged on user that executes the workflow
HI Jimmy,
Thanks for taking your time and we appreciate your feedback.
I have specially mentioned this trick to solve the problem for those applications that calls the workflow.
If it is a MOSS Hosted solution, calling simple properties will work, however if it is office applications or any other web service that invokes the workflow, we don't get user directly.
Just small modification. I Add one new field of person/group type. then, I copy the content of "Modified By" field to this new field. The result, I get much cleaner user name. Hope this help.
Just small modification. I add new field of person/group, then copy "modified by" field to this new field. The result, I can see much cleaner user name. Hope this help.
Post a Comment