public static Principal FromDirectoryEntry(DirectoryEntry directoryEntry, ICollection<string> additionalPropertyNames = null)
{
if (directoryEntry == null)
{
throw new ArgumentNullException("directoryEntry");
}
if (directoryEntry.Properties[ActiveDirectoryProperties.AccountName].Value == null)
{
throw new ActiveDirectoryException("Account name property not found in active directory entry.");
}
bool isGroup = directoryEntry.SchemaClassName == ActiveDirectoryProperties.AccountGroup;
var principal = new Principal
{
AccountName = directoryEntry.Properties[ActiveDirectoryProperties.AccountName].Value.ToString(),
NativeGuid = new Guid(directoryEntry.NativeGuid),
DomainPath = directoryEntry.Path,
IsGroup = isGroup,
IsActive = isGroup || IsActiveUser(directoryEntry)
};
principal.DisplayName = GetDisplayName(directoryEntry) ?? principal.AccountName;
principal.AdditionalProperties = GetAdditionalProperties(directoryEntry, additionalPropertyNames);
principal.ChildDomainPaths = GetChildDomainPaths(directoryEntry);
return principal;
}