Как найти тип данных атрибута AD, не имеющего значения - PullRequest
0 голосов
/ 14 сентября 2018

Я изо всех сил пытаюсь найти тип данных атрибутов AD, которые уже не имеют значения. Пока что результирующий DirecoryEntry содержит свойство только для атрибутов, которые уже имеют значение. Я не могу найти метод для получения информации обо всех других атрибутах.

Добавление значения в «PropertiesToLoad», похоже, ничего не дает. Возвращенный объект DirectoryEntry содержит все атрибуты (со значениями) независимо от того, что здесь добавлено.

Используемый код:

public void Test(string ldapPath)
{
   Type orgType;
   try
   {
     using (DirectoryEntry searchRoot = GetSearchRoot(ldapPath))
     {
        using (DirectorySearcher search = new DirectorySearcher(searchRoot))
        {
            search.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=coen))";

            search.PropertiesToLoad.Add("msExchHomeServerName");

            SearchResult searchResult = search.FindOne();
            {
                using (DirectoryEntry entry = searchResult.GetDirectoryEntry())
                {
                    if (entry != null)
                    {
                        if (entry.Properties.Contains("msExchHomeServerName"))
                        {
                            orgType = entry.Properties["msExchHomeServerName"].GetType();
                        }
                        else // The value is empty and NOT present in the current 'entry.Properties' object.
                        {
                            throw new Exception("Unknown type");
                        }
                    }
                }
            }
        }
    }
   }
   catch (Exception e)
   {
     <handle exception>
   }
}

Есть ли способ найти тип данных атрибута 'msExchHomeServerName' (или любого из атрибутов 'empty')?

Любая помощь будет принята с благодарностью!

Coen

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Благодаря Damien_The_Unbeliever, который указал мне правильное направление, мне удалось создать следующий метод:

public Dictionary<string, ActiveDirectorySyntax> GetAttributeSyntaxes(List<string> lstAttributeNames)
{
    Dictionary<string, ActiveDirectorySyntax> dictRes = new Dictionary<string, ActiveDirectorySyntax>();

    if (lstAttributeNames.Count > 0)
    {
        DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer,
                                                             m_Server, m_UserName, m_Password);

        using (ActiveDirectorySchema currentSchema = ActiveDirectorySchema.GetSchema(directoryContext))
        {
            using (ActiveDirectorySchemaClass objClass = currentSchema.FindClass("user"))
            {
                if (objClass != null)
                {
                    ReadOnlyActiveDirectorySchemaPropertyCollection propcol = objClass.GetAllProperties();

                    foreach (ActiveDirectorySchemaProperty schemaProperty in propcol)
                    {
                        foreach (string attrName in lstAttributeNames)
                        {
                            if (schemaProperty.Name.Equals(attrName))
                            {                                    
                                dictRes.Add(attrName, schemaProperty.Syntax);

                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    return dictRes;
}

Возвращенный schemaProperty.Syntax содержит достаточно информации для определения фактического типа данных.

Спасибо, Дэмиен!

0 голосов
/ 14 сентября 2018

Active Directory имеет схему.Очевидно, об этом не следует думать, поскольку по умолчанию вы не можете исследовать его.

Однако вы можете зарегистрировать оснастку MMC схемы Active Directory 1 и затем, в новом экземпляре MMC, добавьте эту оснастку.

Это позволит вам изучить классы и атрибуты, составляющие вашу текущую схему AD (и добавить новые классы / атрибуты, есливы знаете, что делаете, и решили сделать это).

msExchHomeServerName может быть обнаружен как «строка Unicode», что означает, что должен быть приемлемым простой string из C #.Также обратите внимание, что некоторые типы (особенно числовые) могут также указывать минимумы и максимумы, которые должны соблюдаться.

Схему можно также исследовать программно с помощью ActiveDirectorySchema класса , например, путем вызоваActiveDirectorySchema.GetCurrentSchema();, а затем исследовать оттуда.


1 Я не могу вспомнить, нужно ли для этого устанавливать общие инструменты администрирования домена (например, пользователи и компьютеры).DLL в вашей системе.

...