Get a User's Full Name
Use .NET 3.5's DirectoryServices namespace to quickly and easily get at a user's full name.
Introduction
The System.DirectoryServices.AccountManagement
namespace in .NET 3.5 gives you access to the UserPrincipal
class which "Encapsulates principles that are user accounts." There is a .Current
property which "Gets a user principal object that represents the current user under which the thread is running." Once you have this UserPrincipal
object for the current user, you can get at all kinds of cool properties and methods.
Background
I wanted to display the current user's full name to see who is using my application and then log that to a table in SQL, how hard could it be!? I was using VB.NET for this particular project so I tried
My.User.Name
... whew that was pretty easy. Once run, it returned "MyDomain\UsersInitials" since the username standard we have here are the initials. Getting
the initials was not very helpful in figuring out who was using my program (I'm too lazy to manually cross reference usernames, with full names in ADUC).
So I had to search around for quite a while and I couldn't find any articles or postings that quickly point to this class for user information. There were other people that had this question and they were turned to everything from using "WinNT://" queries, to using the Win32_UserAccount
and the WMI Code Creator, to older articles saying you just can't do it!
Eventually I stumbled upon this article on MSDN.
I figured I'd post an article to maybe make it easier for people to find information on getting at current user properties.
Using the Code
Using the code couldn't be easier. Just add a reference and using or imports statement to System.DirectoryServices.AccountManagement
and enjoy.
Imports System.DirectoryServices.AccountManagement
Dim userFullName As String = UserPrincipal.Current.DisplayName
One caveat, as pointed out in a comment below, is that this should be wrapped with a Try
...Catch
block. If the current user is on a domain and can't reach the domain controller (network failure), he will receive a PrincipalServerDown
exception. However if he is not on a domain, he will not receive this error on a network failure.
Also, if you change the username and don't log off, you will receive a NoMatchingPrincipleException
since the .Current UserPrincipal
name can't be found. This would probably never happen but you might as well Catch
it.
If an exception occurs, I'd suggest just using the username from System.Environment.UserName
or My.User.Name
in VB.
Once you get at the .Current
property, which returns a UserPrincipal
class, you can access all kinds of properties on the current user. A table of properties is listed below (from here):
Name | Description | |
---|---|---|
![]() |
AccountExpirationDate |
Gets or sets a Nullable
DateTime that specifies the date and time that the account expires. (Inherited from
AuthenticablePrincipal .) |
![]() |
AccountLockoutTime |
Gets the Nullable
DateTime that specifies the date and time that the account was locked out. (Inherited from
AuthenticablePrincipal .) |
![]() |
AdvancedSearchFilter |
Returns an AdvancedSearchFilter object, for use with
Query by Example to set read-only properties before passing the object to the
PrincipalSearcher . (Overrides
AuthenticablePrincipal..::.AdvancedSearchFilter .) |
![]() |
AllowReversiblePasswordEncryption |
Gets or sets a Boolean value that specifies whether reversible password encryption is enabled for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
BadLogonCount |
Gets the number of logon attempts using incorrect credentials for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
Certificates |
Gets a X509Certificate2Collection that contains the X509 certificates for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
Context |
Gets a principal context that is associated with the principal. (Inherited from
Principal .) |
![]() |
ContextRaw |
Gets a principal context that is associated with this principal. (Inherited from
Principal .) |
![]() |
ContextType |
Gets the context type enumeration value that specifies the type of principal context associated with this principal. (Inherited from
Principal .) |
![]() ![]() |
Current |
Gets a user principal object that represents the current user under which the thread is running. |
![]() |
DelegationPermitted |
Gets or sets a Nullable Boolean value that specifies whether the account may be delegated. (Inherited from
AuthenticablePrincipal .) |
![]() |
Description |
Gets or sets the description of the principal. (Inherited from
Principal .) |
![]() |
DisplayName |
Gets or sets the display name for this principal. (Inherited from
Principal .) |
![]() |
DistinguishedName |
Gets the distinguished name (DN) for this principal. (Inherited from
Principal .) |
![]() |
EmailAddress |
Gets or sets the e-mail address for this account. |
![]() |
EmployeeId |
Gets or sets the employee ID for this user principal. |
![]() |
Enabled |
Gets or sets a Nullable Boolean value that specifies whether this account is enabled for authentication. (Inherited from
AuthenticablePrincipal .) |
![]() |
GivenName |
Gets or sets the given name for the user principal. |
![]() |
Guid |
Gets the GUID associated with this principal. (Inherited from
Principal .) |
![]() |
HomeDirectory |
Gets or sets the home directory for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
HomeDrive |
Gets or sets the home drive for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
LastBadPasswordAttempt |
Gets the Nullable
DateTime that specifies the date and time of the last incorrect password attempt on this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
LastLogon |
Gets the Nullable
DateTime that specifies the date and time of the last logon for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
LastPasswordSet |
Gets the Nullable
DateTime that specifies the last date and time that the password was set for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
MiddleName |
Gets or sets the middle name for the user principal. |
![]() |
Name |
Gets or sets the name of this principal. (Inherited from
Principal .) |
![]() |
PasswordNeverExpires |
Gets or sets a Boolean value that specifies whether the password expires for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
PasswordNotRequired |
Gets or sets a Boolean value that specifies whether a password is required for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
PermittedLogonTimes |
Gets or sets the times when the principal can logon. (Inherited from
AuthenticablePrincipal .) |
![]() |
PermittedWorkstations |
Gets the list of workstations that this principal is permitted to log into. (Inherited from
AuthenticablePrincipal .) |
![]() |
SamAccountName |
Gets or sets the SAM account name for this principal. (Inherited from
Principal .) |
![]() |
ScriptPath |
Gets or sets the script path for this account. (Inherited from
AuthenticablePrincipal .) |
![]() |
Sid |
Gets the Security ID (SID) of the principal. (Inherited from
Principal .) |
![]() |
SmartcardLogonRequired |
Gets or sets a Boolean value that specifies whether a smartcard is required to log on to the account. (Inherited from
AuthenticablePrincipal .) |
![]() |
StructuralObjectClass |
Gets the structural object class directory attribute. (Inherited from
Principal .) |
![]() |
Surname |
Gets or sets the surname for the user principal. |
![]() |
UserCannotChangePassword |
Gets or sets a Boolean value that specifies whether the user can change the password for this account. Do not use this with a ComputerPrincipal. (Inherited from
AuthenticablePrincipal .) |
![]() |
UserPrincipalName |
Gets or sets the user principal name (UPN) associated with this principal. (Inherited from
Principal .) |
![]() |
VoiceTelephoneNumber |
Gets or sets the voice telephone number for the user principal. |
Points of Interest
Some other interesting methods I found in there were ChangePassword
, ExpirePasswordNow
, GetGroups
, UnlockAccount
, SetPassword
, and Save
. I just haven't had the chance to check them out. Thanks .NET 3.5!
History
- Updated 9/23/09
- Added spiff on exception handling
- Updated code to use
.DisplayName
instead of.Name
- Updated 12/07/12
- Fixed typo to UserPrincipal instead of UserPrinciple.