/// <summary>
        /// Converts a SearchResult returned from a query to the active directory store into
        /// an ActiveDirectoryContact including the setting of the Manager & Manages properties
        /// when the withManagerAndManages parameter is set to true.
        /// </summary>
        /// <param name="result">Object returned from query to active directory store.</param>
        /// <param name="withManagerAndManages">Flag indicating whether to set Manager & Manages property.</param>
        /// <returns>Contact with properties populated.</returns>
        private ActiveDirectoryContact ConvertSearchResultToContact(SearchResult result, bool withManagerAndManages)
        {
            if (result == null)
            {
                return(null);
            }

            var contact = new ActiveDirectoryContact();

            contact.DistinguishedName = GetProperty(result, "distinguishedName");
            contact.FirstName         = GetProperty(result, "givenName");
            contact.LastName          = GetProperty(result, "sn");
            contact.Username          = GetProperty(result, "cn");
            contact.Telephone         = GetProperty(result, "telephoneNumber");
            contact.Email             = GetProperty(result, "mail");
            contact.Company           = GetProperty(result, "company");
            contact.DisplayName       = GetProperty(result, "displayName");
            contact.Office            = GetProperty(result, "physicalDeliveryOfficeName");
            contact.Mobile            = GetProperty(result, "mobile");
            contact.JobRole           = GetProperty(result, "title");
            contact.Fax             = GetProperty(result, "facsimileTelephoneNumber");
            contact.HomePhoneNumber = GetProperty(result, "ipPhone");
            contact.IpPhoneNumber   = GetProperty(result, "facsimileTelephoneNumber");
            contact.Pager           = GetProperty(result, "pager");

            if (withManagerAndManages)
            {
                return(AddManagerHeirachies(contact, result));
            }

            return(contact);
        }
        /// <summary>
        /// Adds the ActiveDirectoryContact that represents the Manager and a list of
        /// ActiveDirectoryContacts that represent the contacts that the contact
        /// inputted manages.
        /// </summary>
        /// <param name="contact">Contact that should have its Manages and Manager properties
        /// fulfilled.</param>
        /// <param name="result">Object returned from a query to the active directory store.</param>
        /// <returns>Contact with values set of Manages and Manager.</returns>
        private ActiveDirectoryContact AddManagerHeirachies(ActiveDirectoryContact contact, SearchResult result)
        {
            if (contact == null)
            {
                return(null);
            }

            var managerDn  = GetProperty(result, "manager");
            var managesDns = GetListProperty(result, "directReports");

            if (!string.IsNullOrWhiteSpace(managerDn))
            {
                contact.Manager = GetContactByDistinguishedName(managerDn, false);
            }

            if (managesDns != null && managesDns.Count > 0)
            {
                contact.Manages = new List <ActiveDirectoryContact>();

                foreach (var dn in managesDns)
                {
                    contact.Manages.Add(GetContactByDistinguishedName(dn, false));
                }
            }

            return(contact);
        }