Проблема при обработке пользовательского атрибута даты Active Directory - PullRequest
0 голосов
/ 12 октября 2018

Я расширил нашу схему новым атрибутом типа большое целое число / интервал, который будет использоваться в качестве даты.Здесь есть проблемы.Во-первых, в ADUC атрибут отображается в виде числа, а другие даты в системе (с таким же базовым типом) отображаются в виде даты.На самом деле, это нормально, так как оно целое.Может быть, ADUC имеет предустановленные некоторые атрибуты, которые он вынуждает показывать в виде дат?

Другое дело, что я не могу правильно обработать это с помощью System.DirectoryServices.Accountmanagment.У меня есть класс, который расширяет UserPrincipal, который работает нормально, но добавление этого нового атрибута не будет работать.Не удается, когда я пытаюсь передать дату, а также если я передаю длинную.

Я чувствую, что сделал что-то не так в процессе схемы AD, хотя я не уверен, что это может быть.Я пробовал поискать в Интернете, но до сих пор я не нашел подобных проблем ни в одной статье.

Я очень боюсь сделать что-то, что испортит мой AD, поэтому я прошу здесь несколько советов по этому поводу, особенно с датами.

РЕДАКТИРОВАТЬ:

Я провел еще несколько тестирований, и у меня есть решение для расширения AccountManagment.UserPrincipal.Хотя это «кажется» странным:

    public DateTime? MyCustomDate
    {
        get
        {

            object[] result = this.ExtensionGet("my-custom-date");
            if (result != null && result.Length > 0)
            {
                if (result[0].GetType() == typeof(string))
                {
                    long l = 0;
                    return (long.TryParse(result[0].ToString(), out l) ? DateTime.FromFileTimeUtc(l) : (DateTime?)null);
                }
                else
                {
                    ActiveDs.IADsLargeInteger li = (ActiveDs.IADsLargeInteger)result[0];
                    return DateTime.FromFileTimeUtc(((long)li.HighPart << 32) + li.LowPart).ToLocalTime();
                }
            }
            else
                return null;
        }
        set
        {
            if (value != null)
                ExtensionSet("my-custom-date", ((DateTime)value).ToFileTimeUtc().ToString());
            else
                ExtensionSet("my-custom-date", null);
        }
    }

Я пробовал разные подходы, но, похоже, работает только метод ToString ().

Так что я в основном все заработал.Кроме того, я попробовал это с расширением уже встроенного свойства для accountExires.Я получаю точно такое же поведение, поэтому я считаю, что мое свойство в AD создано правильно.

РЕДАКТИРОВАТЬ # 2: Проверка типа в разделе получателя свойства существует, когда значение свойства находится в памяти, если онобыло изменено самим свойством установщиком.Значение больше не типа com, но строка (очевидно)

1 Ответ

0 голосов
/ 13 октября 2018

Поскольку я работал с этим еще немного сегодня, кажется, мое решение в редактировании делает работу.

public DateTime?MyCustomDate {get {

        object[] result = this.ExtensionGet("my-custom-date");
        if (result != null && result.Length > 0)
        {
            if (result[0].GetType() == typeof(string))
            {
                long l = 0;
                return (long.TryParse(result[0].ToString(), out l) ? DateTime.FromFileTimeUtc(l) : (DateTime?)null);
            }
            else
            {
                ActiveDs.IADsLargeInteger li = (ActiveDs.IADsLargeInteger)result[0];
                return DateTime.FromFileTimeUtc(((long)li.HighPart << 32) + li.LowPart).ToLocalTime();
            }
        }
        else
            return null;
    }
    set
    {
        if (value != null)
            ExtensionSet("my-custom-date", ((DateTime)value).ToFileTimeUtc().ToString());
        else
            ExtensionSet("my-custom-date", null);
    }
}
...