Читать ActiveDirectorySchema с помощью C # - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь прочитать данные схемы Active Directory, используя DirectorySearcher, например:

DirectoryEntry entry = new DirectoryEntry("LDAP://********/CN=Schema,*****");

var filter = "(&(objectCategory=attributeSchema))";
var directorySearcher = new DirectorySearcher(entry, filter);

var searchResult = directorySearcher.FindAll();
DirectoryEntry schemaTest2 = entry.SchemaEntry;

// error on this line: 
// "The directory cannot report the number of properties."
foreach (var prop in schemaTest2.Properties.PropertyNames) 
{
    string propName = prop.ToString();                    
}

У кого-нибудь есть идея, почему происходит эта ошибка? Или у вас есть какие-либо предложения, как читать схему AD, используя DirectorySerarcher?

Примечание: я не могу использовать

ActiveDirectorySchema schema = ActiveDirectorySchema.GetCurrentSchema();

поскольку я столкнулся с другой проблемой, связанной с этим.

Любое предложение будет высоко оценено!

Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Я получил ту же ошибку здесь: от Microsoft ты получаешь шему таким образом:

DirectoryEntry myDirectoryEntry = new DirectoryEntry ();

// Display the 'SchemaClassName'.
Console.WriteLine("Schema class name:" + myDirectoryEntry.SchemaClassName);

// Gets the SchemaEntry of the ADS object.
DirectoryEntry mySchemaEntry = myDirectoryEntry.SchemaEntry;

if (string.Compare(mySchemaEntry.Name, "container") == 0)
{
   foreach(DirectoryEntry myChildDirectoryEntry in myDirectoryEntry.Children)
      Console.WriteLine(myChildDirectoryEntry.Path);
}

в моем случае контейнер не работает myDirectoryEntry.SchemaClassName = domainDNS, поэтому для получения результата мне нужно изменить код в

DirectoryEntry myDirectoryEntry = new DirectoryEntry ();

    // Display the 'SchemaClassName'.
    Console.WriteLine("Schema class name:" + myDirectoryEntry.SchemaClassName);

    // Gets the SchemaEntry of the ADS object.
    DirectoryEntry mySchemaEntry = myDirectoryEntry.SchemaEntry;

    if (string.Compare(mySchemaEntry.Name, "domainDNS") == 0)
    {
        foreach (DirectoryEntry myChildDirectoryEntry in myDirectoryEntry.Children)
            Console.WriteLine(myChildDirectoryEntry.Path);
    }
    Console.ReadLine();

надеюсь, это поможет вам.

...