Как определить, существует ли подразделение, используя System.DirectoryServices.AccountManagement в C #? - PullRequest
0 голосов
/ 23 октября 2018

В то время как C # и Active Directory: проверка существования OU является полезным примером, C #, похоже, отходит от функциональности System.DirectoryServices к System.DirectoryServices.AccountManagement, поскольку обеспечивает более приятный и чистый синтаксис.

В настоящее время у меня есть некоторый код, где единственное использование DirectoryEntry состоит в том, чтобы определить, существует ли OU.Можно ли определить, существует ли подразделение, не используя DirectoryEntry, а просто используя функциональность на основе Principal?

Ответы [ 2 ]

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

Вы не можете.

Документация для AccountManagement пространства имен начинается с:

Пространство имен System.DirectoryServices.AccountManagement обеспечивает униформудоступ и манипулирование принципалами безопасности пользователя, компьютера и группы

Обратите внимание, что в нем ничего не говорится о подразделениях.Они не спроектировали его для этого.

В LDAP в общем, самый быстрый способ проверить, существует ли объект, - это привязать его непосредственно к объекту.Это именно то, что делает DirectoryEntry.Exists().Вы можете увидеть исходный код здесь :

/// <devdoc>
/// Searches the directory store at the given path to see whether an entry exists.
/// </devdoc>        
public static bool Exists(string path)
{
    DirectoryEntry entry = new DirectoryEntry(path);
    try
    {
        entry.Bind(true);       // throws exceptions (possibly can break applications) 
        return entry.Bound;
    }
    catch (System.Runtime.InteropServices.COMException e)
    {
        if (e.ErrorCode == unchecked((int)0x80072030) ||
             e.ErrorCode == unchecked((int)0x80070003) ||   // ERROR_DS_NO_SUCH_OBJECT and path not found (not found in strict sense)
             e.ErrorCode == unchecked((int)0x800708AC))     // Group name could not be found
            return false;
        throw;
    }
    finally
    {
        entry.Dispose();
    }
}

Любой другой способ сделать это будет работать хуже.

Вид примечания: в то время как AccountManagementПространство имен делает некоторые вещи проще для разработчика, это платно.Это всегда работает хуже, чем использование DirectoryEntry напрямую.Иногда это не заметно, но если вы делаете много поисков, это может быстро сложиться.

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

Следующее будет проверять, существует ли OU с использованием объекта PrincipalContext.

try
{ 
    var ou = new PrincipalContext(ContextType.Domain, targetedDcUrl, container);            
    var searchPrincipal = new UserPrincipal(ou);
    var searcher = new PrincipalSearcher(searchPrincipal);

    var users = searcher.FindAll();
}
catch (PrincipalOperationException ex)
{
    Console.WriteLine("Container does not exist");
}

Доступ к OU при поиске (или любое другое действие, требующее чтения / записи в домен) вызовет исключение.

...