2

I am accessing the Author name from the list item. Even if the user has been deleted from AD, even then he still appears in list item history.

I have used the following method for development:

var author = new SPFieldUserValue(listItem.Web, listItem[SPBuiltInFieldId.Author].ToString());

And then using it to set different permissions, and here I'm using:

author.User

The code works fine for existing users but when it encounters a user who has been delete from AD (but still visible in SharePoint) it throws an error.

What is the best way to check if the user exists/is still active? Please suggest.

if (author.User != null)
{
     //do something..
}
else {
     //do something else..
}

3 Answers 3

1

Use web.EnsureUser method inside try/catch block to check user by login

EnsureUser creates SharePoint user if it does not exist, BUT...

1) Users from Author field already exists as SharePoint users and don't be created again.

2) If Author user does not exists in AD, EU generates exception.

0
0

You would check if the user exists in AD or not. A code sample here: http://kancharla-sharepoint.blogspot.in/2012/06/c-code-to-check-user-exists-in-active.html

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "DomainName"))
{
using (UserPrincipal user = UserPrincipal.FindByIdentity(context, "LoginName"))
{
 bool userExists = (user != null);
 if (userExists)
 {
   Console.WriteLine("User exists");
   Console.WriteLine(user.EmailAddress);
 }
 else
 {
  Console.WriteLine("User doesn't exist");
 }
}
}
6
  • Why is this better than my if-else?
    – RangeRover
    Commented Sep 28, 2015 at 6:17
  • And does this find users who are inactivated/disabled in AD?
    – RangeRover
    Commented Sep 28, 2015 at 6:18
  • Your if/else won't check in AD. That'll just check in the current site collection / web if the user exists. This checks for the user in AD. Alexey's answer is also valid. EnsureUser would throw an exception if the user is not found in AD. This one wouldn't throw an exception since you are finding the user in AD. And, no this wouldn't find inactive / disabled users in AD.
    – Akhoy
    Commented Sep 28, 2015 at 6:42
  • I might be wrong here. Check this: sharepoint.stackexchange.com/questions/86145/…. According to this, Alexey's answer might be right.This would check for the user but if you want to get the user, you would need to look at ensureuser.
    – Akhoy
    Commented Sep 28, 2015 at 6:55
  • Right, and I don't want to throw an error/add user again. I just want to check if the user exist and if not I want to add permissions to other user/group.
    – RangeRover
    Commented Sep 28, 2015 at 7:15
0
var SPuser = web.AllUsers.Cast<SPUser>().FirstOrDefault(user => user.LoginName == author.LoginName);
if (SPuser != null) 
{
//Do Something here
}
2
  • Thanks, but if I just go with: if (author.User != null) like above I get the same result? How is it with performance when web.Allusers is called (this will be used often) and our intranet contains almost a thousand users?
    – RangeRover
    Commented Sep 28, 2015 at 8:27
  • Ya, this has performance impact when compared to web.AllUsers[userName]. But, you'll get into the loop only if the SPUser variable has some user value in it. Unlike web.AllUsers[userName] which would throw an exception Commented Sep 28, 2015 at 10:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.