0
votes

Goal

I have a WCF Service using Windows Authentication. I want to determine the Full name of the user that connected. The user can either be a domain or a local user. For local users, you can view the Full name in [Computer Management (local) > Local Users and Groups > Users > [user] > Full Name].

Almost successful with FindByIdentity

I can use UserPrincipal.FindByIdentity() to retrieve a UserPrincipal object, and then get it from UserPrincipal.DisplayName. The first parameter of FindByIdentity requires specifying ContextType, such as Domain or Machine.

  • Calling FindByIdentity with ContextType.Domain and a local user, produces a "Specified Domain Does Not Exist or Could Not Be Contacted" exception
  • Calling FindByIdentity with ContextType.Machine and a domain user, produces a UserPrincipal without a filled DisplayName property

So i would like to avoid guessing.

Question

  • How can i get the Full name of the connected user?
  • Or how can i distinguish whether the connected user is a domain user or a local user?

Code so far

string GetFullName()
{
    using (var ctx = new PrincipalContext(ContextType.Domain))
    {
        string userName = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
        UserPrincipal u = UserPrincipal.FindByIdentity(ctx, userName);
        return u.DisplayName;
    }
}
2

2 Answers

0
votes

You can use the Environment.UserDomainName property to get the domain name of the current user. If the domain is not joined, the host name of the current user will be returned.

0
votes

I'm using the following for now. If anyone has any better ideas, then please post your answer

bool LocalUserConnected()
{
    string userName = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
    return userName.StartsWith(Environment.MachineName + @"\");
}