Use .NET 3.5's DirectoryServices namespace to quickly and easily get at a user's full name.
IntroductionThe System.DirectoryServices.AccountManagement namespace in .NET 3.5 gives you access to the UserPrinciple class which "Encapsulates principles that are user accounts." There is a .Current property which "Gets a user principle object that represents the current user under which the thread is running." Once you have this UserPrinciple object for the current user, you can get at all kinds of cool properties and methods. BackgroundI 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. On run, it returned "MyDomain\UsersInitials" since the username standard we have here are the initials. Getting 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.
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 UserPrinciple 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 UserPrinciple class, you can access all kinds of properties on the current user.
Once you get at the .Current property, which returns a UserPrinciple class, you can access all kinds of properties on the current user. A table of properties is listed below (from here):
Gets or sets a Boolean value that specifies whether reversible password encryption is enabled for this account. (Inherited from AuthenticablePrincipal.)
Gets the Nullable DateTime that specifies the date and time of the last incorrect password attempt on this account. (Inherited from AuthenticablePrincipal.)
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.)
Gets or sets the voice telephone number for the user principal.
Points of InterestSome 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!