Расширенные принципы пользователя C # - PullRequest
0 голосов
/ 10 мая 2018

Моя организация использует комбинацию AD и LDS.AD синхронизируется с LDS и сохраняет некоторую информацию в полях extensionAttribute [в основном, 10, 11 и 12].

Я могу получить стандартную информацию из LDS в порядке, то есть Название, Фамилия, Инициалы, но не могу получитьexntensionAttributes.I использовал этот пример для расширения UserPrincipal, но все еще не могу увидеть значения атрибута.

[DirectoryRdnPrefix("CN")]
    [DirectoryObjectClass("user")]
    public class UserPrincipalEx : UserPrincipal
    {
        public UserPrincipalEx(PrincipalContext context)
            : base(context)
        { }

        public UserPrincipalEx(PrincipalContext context, string samAccountName, string password, bool enabled)
            :base(context, samAccountName,password,enabled)
        { }

        public static new UserPrincipalEx FindByIdentity(PrincipalContext context, string identityValue)
        {
            return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityValue);
        }

        public static new UserPrincipalEx FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue)
        {
            return (UserPrincipalEx)FindByIdentityWithType(context, typeof(UserPrincipalEx), identityType, identityValue);
        }

        [DirectoryProperty("extensionAttribute10")]
        public string Ext10
        {
            get
            {
                if (ExtensionGet("extensionAttribute10").Length != 1)
                    return null;
                return (string)ExtensionGet("extensionAttribute10")[0];
            }
        }
    }

У меня тогда есть:

PrincipalContext ctx = new PrincipalContext(ContextType.ApplicationDirectory, "LDSServerHere:389", "OU HERE", "Acccount Name Here", "Password HEre");

        UserPrincipalEx u = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, login);
        string prop = string.Empty;
        try
        {
            prop = u.Ext10;
        }
        catch (Exception ex)
        {
            prop = ex.ToString();
        }

        return prop;

Продолжаю получать NULLReferenceException: Ссылка на объектне установлен экземпляр объекта

Я что-то делаю здесь глупо?

1 Ответ

0 голосов
/ 10 мая 2018

Вызов FindByIdentityWithType не сработает. Глядя на документацию , она унаследована от Principal (не UserPrincipal) и говорит, что она "не предназначена для вызова непосредственно из вашего кода". Скорее всего, он просто не понимает ваш производный класс, поэтому ничего не возвращает, потому что ничего не находит в вашем классе.

Но есть и другой способ сделать это: использовать DirectoryEntry.

PrincipalContext ctx = new PrincipalContext(ContextType.ApplicationDirectory, "LDSServerHere:389", "OU HERE", "Acccount Name Here", "Password HEre");

UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, login);
string prop = string.Empty;

try
{
    var de = (DirectoryEntry) u.GetUnderlyingObject();
    if (de.Properties.Contains("extensionAttribute10")) {
        prop = de.Properties["extensionAttribute10"].Value;
    }
}
catch (Exception ex)
{
    prop = ex.ToString();
}

return prop;

Обратите внимание на нулевую проверку свойства. Если атрибут пустой, он вообще не будет существовать в коллекции Properties. Возможно, вы могли бы добавить некоторые дополнительные нулевые проверки, чтобы быть в безопасности.

UserPrincipal и другие классы в пространстве имен AccountManagement просто используют DirectoryEntry в качестве фона в любом случае. Они просто не выставляют все доступных атрибутов. Поэтому иногда вам приходится использовать DirectoryEntry напрямую.

На самом деле я обнаружил, что гораздо быстрее и эффективнее использовать только DirectoryEntry и вообще не использовать пространство имен AccountManagement, хотя иногда это может быть немного сложнее.

...