Как можно найти пользователя в активном каталоге от C#?

Глядя на исходный код этого драгоценного камня, похоже, что есть Report#as_json , который возвращает то, что вы ищете.

Bugsnag.before_notify_callbacks << lambda { |report|
  puts report.as_json
}

18
задан hlovdal 8 September 2009 в 23:37
поделиться

6 ответов

Вы работаете в .NET 3.5? Если это так - AD имеет замечательные новые функции в .NET 3.5 - прочтите эту статью Управление принципами безопасности каталогов в .NET 3.5 Итана Вилански и Джо Каплана.

Одна из больших новых функций - это " PrincipalSearcher "класс, который должен значительно упростить поиск пользователей и / или групп в AD.

Если вы не можете использовать .NET 3.5, одна вещь, которая может облегчить вашу жизнь, называется" Неоднозначное разрешение имен ", и это"

20
ответ дан 30 November 2019 в 07:04
поделиться

System.DirectoryServices имеет два пространства имен ... DirectoryEntry и DirectorySearcher.

Более подробную информацию о DirectorySearcher можно найти здесь:

http://msdn.microsoft.com/en-us/ library / system.directoryservices.directorysearcher.aspx

Затем вы можете использовать свойство Filter для фильтрации по группам, пользователям и т. д ...

Поэтому, если вы хотите фильтровать по имени учетной записи, вы должны установить .Filter на:

"(&(sAMAccountName=bsmith))"

и запустите метод FilterAll. Это вернет коллекцию SearchResultCollection, которую вы можете просмотреть и получить информацию о пользователе.

10
ответ дан 30 November 2019 в 07:04
поделиться

Добавить к ответу Мияги ....

Вот фильтр / запрос для применения к DirectorySearcher

DirectorySearcher ds = new DirectorySearcher();

ds.Filter = "samaccountname=" + userName;

SearchResult result = ds.FindOne();
1
ответ дан 30 November 2019 в 07:04
поделиться

Вам необходимо построить строку поиска на основе того, как вы ищете пользователя.

using (var adFolderObject = new DirectoryEntry())
{
     using(var adSearcherObject = new DirectorySearcher(adFolderObject))
     {
          adSearcherObject.SearchScope = SearchScope.Subtree;
          adSearcherObject.Filter = "(&(objectClass=person)(" + userType + "=" + userName + "))";

          return adSearcherObject.FindOne();
     }
}

userType должен быть либо sAMAccountName, либо CN, в зависимости от того, как отформатировано имя пользователя.

ex :
firstname.lastname (или flastname) обычно будет sAMAccountName
FirstName LastName обычно будет CN

4
ответ дан 30 November 2019 в 07:04
поделиться

То, что вы сделали, довольно разумно. Несколько дополнительных пунктов:

  • Когда Maven получает артефакт от Nexus, артефакт называется artifactId-version. GroupId досадно опущен. Итак, когда артефакт перемещается (например, копируется в WEB-INF / lib в веб-приложении), ваш файл jar будет читать « gdata-analytics-1.0 ». Обычно это не проблема. Однако, если имя артефакта очень распространено, например «util», вы можете включить информацию о группе внутри artifactId, например, используя groupId из « com.google » и artifactId из « com.google.gdata-аналитика ». Да, повторение раздражает, но дает максимальную ясность в файловой системе и при поиске. Я' На самом деле у нас была проблема, когда два разных идентификатора группы имели jar « core-1.0 », и один перезаписывал другой при копировании в каталог lib во время сборки.

  • Я повторяю предложение MattK по выравниванию ваш Maven versionId с любой версией, под которой широко известен артефакт.

  • Если вы последуете совету Доминика о добавлении к groupId префикса groupId с названием вашей компании (например, acme), это может облегчить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

-121) --- 4350900-
public DirectoryEntry Search(string searchTerm, string propertyName)
{
   DirectoryEntry directoryObject = new DirectoryEntry(<pathToAD>);

   foreach (DirectoryEntry user in directoryObject.Children)
   {
      if (user.Properties[propertyName].Value != null)    
         if (user.Properties[propertyName].Value.ToString() == searchTerm)
             return user;                       
   }

   return null;
}
и один перезаписывал другой при копировании в каталог lib во время сборки.

  • Я повторяю предложение MattK по согласованию вашего Maven versionId с той версией, по которой артефакт широко известен.

  • Если вы последуете совету Доминика о добавлении префикса groupId с названием вашей компании (например, acme), это может упростить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

  • -121) --- 4350900-
    public DirectoryEntry Search(string searchTerm, string propertyName)
    {
       DirectoryEntry directoryObject = new DirectoryEntry(<pathToAD>);
    
       foreach (DirectoryEntry user in directoryObject.Children)
       {
          if (user.Properties[propertyName].Value != null)    
             if (user.Properties[propertyName].Value.ToString() == searchTerm)
                 return user;                       
       }
    
       return null;
    }
    
    и один перезаписывал другой при копировании в каталог lib во время сборки.

  • Я повторяю предложение MattK по согласованию вашего Maven versionId с той версией, по которой артефакт широко известен.

  • Если вы последуете совету Доминика о добавлении префикса groupId с названием вашей компании (например, acme), это может упростить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

  • -121) --- 4350900-
    public DirectoryEntry Search(string searchTerm, string propertyName)
    {
       DirectoryEntry directoryObject = new DirectoryEntry(<pathToAD>);
    
       foreach (DirectoryEntry user in directoryObject.Children)
       {
          if (user.Properties[propertyName].Value != null)    
             if (user.Properties[propertyName].Value.ToString() == searchTerm)
                 return user;                       
       }
    
       return null;
    }
    
    Совет по добавлению к groupId префикса названия вашей компании (например, acme) может облегчить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

    -121) --- 4350900-
    public DirectoryEntry Search(string searchTerm, string propertyName)
    {
       DirectoryEntry directoryObject = new DirectoryEntry(<pathToAD>);
    
       foreach (DirectoryEntry user in directoryObject.Children)
       {
          if (user.Properties[propertyName].Value != null)    
             if (user.Properties[propertyName].Value.ToString() == searchTerm)
                 return user;                       
       }
    
       return null;
    }
    
    Совет по добавлению к groupId префикса названия вашей компании (например, acme) может облегчить использование функции маршрутизации Nexus. Это гарантирует, что запросы на внутренние артефакты не будут переданы в Maven Central и попадут в их журналы (что может быть важно, если ваш groupId равен « acme.secret.project »!

    -121) --- 4350900-
    public DirectoryEntry Search(string searchTerm, string propertyName)
    {
       DirectoryEntry directoryObject = new DirectoryEntry(<pathToAD>);
    
       foreach (DirectoryEntry user in directoryObject.Children)
       {
          if (user.Properties[propertyName].Value != null)    
             if (user.Properties[propertyName].Value.ToString() == searchTerm)
                 return user;                       
       }
    
       return null;
    }
    
    3
    ответ дан 30 November 2019 в 07:04
    поделиться

    Получил это от Джо Каплан и Итан Вилански Статья Используйте это Использование (из ссылки на dll System.DirectoryServices.AccountManagement):

    using System.DirectoryServices.AccountManagement;
    
    private bool CheckUserinAD(string domain, string username)
    {
        PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, domain);
        UserPrincipal user = new UserPrincipal(domainContext);
        user.Name = username;
        PrincipalSearcher pS = new PrincipalSearcher();
        pS.QueryFilter = user;
        PrincipalSearchResult<Principal> results = pS.FindAll();
        if (results != null && results.Count() > 0)
            return true;
        return false;
    }
    
    2
    ответ дан 30 November 2019 в 07:04
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: