How to get Active Directory Attributes not represented by the UserPrincipal class
In this case, you need to go one level deeper - back into the bowels of DirectoryEntry
- by grabbing it from the user principal:
using (DirectoryEntry de = myUser.GetUnderlyingObject() as DirectoryEntry)
{
if (de != null)
{
// Go for those attributes and do what you need to do...
var mobile = de.Properties["mobile"].Value as string;
var info = de.Properties["info"].Value as string;
}
}
The proper way of doing it is by using PrincipalExtensions
where you extend the Principal
you are after and use the methods ExtensionSet
and ExtensionGet
as explained here.
up.Mobile
would be perfect, but unfortunately, there's no such method in the UserPrincipal class, so you have to switch to DirectoryEntry by calling .GetUnderlyingObject()
.
static void GetUserMobile(PrincipalContext ctx, string userGuid)
{
try
{
UserPrincipal up = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, userGuid);
DirectoryEntry up_de = (DirectoryEntry)up.GetUnderlyingObject();
DirectorySearcher deSearch = new DirectorySearcher(up_de);
deSearch.PropertiesToLoad.Add("mobile");
SearchResultCollection results = deSearch.FindAll();
if (results != null && results.Count > 0)
{
ResultPropertyCollection rpc = results[0].Properties;
foreach (string rp in rpc.PropertyNames)
{
if (rp == "mobile")
Console.WriteLine(rpc["mobile"][0].ToString());
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}