Получение родительской организационной единицы (если есть) организационной единицы в Active Directory - PullRequest
0 голосов
/ 23 марта 2011

Я создал небольшой класс сущностей:

public class OrganizationalUnit
{
    public string Name { get; set; }
    public string ParentUO { get; set; }
    public string Path { get; set; }    
}

Вот как я создаю объекты этого типа:

    /// <summary>
    /// Provides an object that allows you to get organizational units within an 
    /// active directory domain.
    /// </summary>
    /// <param name="connectionString">The LDAP connection string to a domain. 
    /// For example LDAP://DC=YourCompany,DC=com</param>
    public ActiveDirectoryOrganizationalUnitRepository(string connectionString, string username, string password)
    {
        organizationalUnits = new List<OrganizationalUnit>();

        if (DomainExists(connectionString))
        {
            var baseDirectory = new DirectoryEntry(connectionString);
            baseDirectory.Username = username;
            baseDirectory.Password = password;

            DirectorySearcher searcher = new DirectorySearcher();
            searcher.SearchRoot = baseDirectory;
            searcher.Filter = "(objectCategory=organizationalUnit)";
            searcher.SearchScope = SearchScope.Subtree;

            var ouResults = searcher.FindAll();

            foreach (SearchResult ou in ouResults)
            {
                organizationalUnits.Add(new OrganizationalUnit() { 
                                        Path = ou.Path, 
                                        Name = ou.Properties["name"][0].ToString(),
                                        ParentUO = ou.Properties["parent"][0].ToString()}
                );                    
            }
        }        
    }

Мне нужна помощь в заполнении свойства ParentOU.Я получаю индекс вне диапазона исключений при попытке получить его:

ParentUO = ou.Properties["parent"][0].ToString();

Так что это означает, что нет свойства с именем 'parent'.

Есть предложения?Я также хотел бы найти список существующих свойств, но я еще не нашел один в Интернете.

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Первый: С точки зрения чистого каталога vue в вашем организационном блоке (OU) есть атрибут с именем "distinguishedName", который выглядит следующим образом:

OU=currentOU,OU=parentOU,...,DC=domain,DC=..

так что вы можете легко вычислить строку родительского подразделения.

Секунда: С точки зрения программирования, у вас есть свойство класса DirectoryEntry, которое равно parent.Вот пример кода.

String myADSPath = "LDAP://onecity/CN=user,CN=Users,DC=onecity,DC=corp,DC=fabrikam,DC=com";
DirectoryEntry myDirectoryEntry=new DirectoryEntry(myADSPath, UserName, SecurelyStoredPassword);

Console.WriteLine("Parent is :"+myDirectoryEntry.Parent.Path);

JP

0 голосов
/ 24 марта 2011

Вы пробовали DirectoryEntry.Parent ?

Следующий код должен работать, но я его не пробовал.

organizationalUnits.Add(new OrganizationalUnit() { 
                                    Path = ou.Path, 
                                    Name = ou.Properties["name"][0].ToString(),
                                    ParentUO = ou.GetDirectoryEntry().Parent.Path}

Нет атрибута с именем "Родительский »в объекте класса organizationUnit.Пожалуйста, проверьте MSDN для всех атрибутов организационной единицы.

0 голосов
/ 23 марта 2011

Я нашел этот код, в котором перечислены все свойства, которые может иметь объект SearchResult. Кажется, в нем не указана родительская организационная единица.

DirectorySearcher searcher = new DirectorySearcher();

searcher.SearchRoot = baseDirectory;
searcher.Filter = "(objectCategory=organizationalUnit)";
searcher.SearchScope = SearchScope.Subtree;

var ouResults = searcher.FindAll();

foreach (SearchResult ou in ouResults)
{

    ResultPropertyCollection myResultPropColl;
    myResultPropColl = ou.Properties;
    Console.WriteLine("The properties of the " +
            "'mySearchResult' are :");

    foreach (string myKey in myResultPropColl.PropertyNames)
    {
        string tab = "    ";
        Console.WriteLine(myKey + " = ");
        foreach (Object myCollection in myResultPropColl[myKey])
        {
            Console.WriteLine(tab + myCollection);
        }
    }
}
...