Pull to refresh

Обзор пользователей Active Directory с помощью PivotViewer

Reading time6 min
Views1.3K
Совсем недавно вышел замечательный контрол для Silverlight — PivotViewer. Попробуем использовать его для просмотра пользователей Active Directory. Для удобства понимания будем использовать готовый проект, предоставленный создателями Pivot.

Для работы нам потребуется:


Поехали:

Открываем в Visual Studio 2010 скаченный проект PivotJitServer. Находим проект CollectionFactories и добавляем туда новый класс, назовем его ActiveDirectoryFactory и унаследуем его от CollectionFactoryBase.

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using PivotServerTools;

  namespace CollectionFactories
  {
    public class ActiveDirectoryFactory : CollectionFactoryBase
    {
      public ActiveDirectoryFactory()
      {
        this.Summary = "ActiveDirectory collection";
      }
    }
  }


* This source code was highlighted with Source Code Highlighter.


Далее добавим в проект CollectionFactories ссылку на сборку System.DirectoryServices и добавим «using System.DirectoryServices;» в наш класс.

Cоздадим вспомогательный класс ActiveDirectoryUser, который будет содержать в себе необходимые нам параметры. Для удобства в классе используется Dictionary для хранения связок параметр-значение Код (комментарии внутри):

    public class ActiveDirectoryUser
    {
      // конструктор, передаем в качестве параметра результат поиска в ActiveDirectory
      public ActiveDirectoryUser(SearchResult entry)
      {
        _Parameters = new Dictionary<String, Object>();
        
        // Заполняем все найденные параметры объекта AD в параметры нашего класса
        foreach (string propertyName in entry.Properties.PropertyNames)
        {
          _Parameters.Add(propertyName, entry.Properties[propertyName][0]);
        }
      }

      private Dictionary<String, Object> _Parameters;
      public Dictionary<String, Object> Parameters
      {
        get { return _Parameters; }
      }
    }


* This source code was highlighted with Source Code Highlighter.


Для создания коллекции элементов в классе CollectionFactoryBase существует метод MakeCollection, который возвращает PivotServerTools.Collection (коллекцию элементов для показа). Нам надо его изменить, чтобы в нем заполнить коллекцию нашими элементами.

      public override Collection MakeCollection(CollectionRequestContext context)
      {
        Collection collection = new Collection(); // новая коллекция
        collection.Name = "ActiveDirectory database"; // название коллекции
        List<ActiveDirectoryUser> users = GetObjects("LDAP://servad", "(&(objectClass=user)(objectCategory=person))"); // фильтр для получения объектов из AD

        // перебираем все найденные объекты и добавляем их в коллекцию
        foreach (ActiveDirectoryUser user in users)
        {
           ItemImage itemImage = null; // картинка при показе, можно использовать картинку из AD, или взять картинку по http

          // добавляем объект в коллекцию, с проверкой есть ли параметр у найденного объекта, если нет, то в качестве данных используем String.Empty
          collection.AddItem(
            user.Parameters.ContainsKey("displayname") ? user.Parameters["displayname"].ToString() : user.Parameters["samaccountname"].ToString(),
            null, null, itemImage,
            user.Parameters.ContainsKey("samaccountname") ? new Facet("Account Name", FacetType.Text, user.Parameters["samaccountname"].ToString()) : new Facet("Account Name", FacetType.Text, String.Empty),
            user.Parameters.ContainsKey("lastlogon") ? new Facet("Last Logon", FacetType.DateTime, DateTime.FromFileTime((long)user.Parameters["lastlogon"])) : new Facet("Last Logon", FacetType.DateTime, new DateTime()),
            user.Parameters.ContainsKey("company") ? new Facet("Company", FacetType.Text, user.Parameters["company"].ToString()) : new Facet("Company", String.Empty),
            user.Parameters.ContainsKey("department") ? new Facet("Department", FacetType.Text, user.Parameters["department"].ToString()) : new Facet("Department", String.Empty),
            user.Parameters.ContainsKey("title") ? new Facet("Title", FacetType.Text, user.Parameters["title"].ToString()) : new Facet("Title", String.Empty)
            );
        }

        collection.SetFacetDisplay("Account Name", false, true, false); // не отображать фильтр по именам, но показать его в свойстве объекта
        collection.SetFacetFormat("Last Logon", "dd-MM-yyyy hh:mm:ss"); // формат последней даты входа пользователя

        return collection;
      }

* This source code was highlighted with Source Code Highlighter.


SetFacetDisplay позволяет не отображать указанный параметр в фильтре, но показать его в свойствах при выбранном объекте в Pivot.
SetFacetFormat позволяет установить формат даты. В нашем случае устанавливается формат даты последнего входа пользователя.

И код для поиска объектов в ActiveDirectory

private List<ActiveDirectoryUser> GetObjects(String domainpath, String filter)
{
  List<ActiveDirectoryUser> allUsers = new List<ActiveDirectoryUser>();

  DirectoryEntry searchRoot = new DirectoryEntry(domainpath);
  DirectorySearcher search = new DirectorySearcher(searchRoot);
  search.PageSize = 1000;
  search.Filter = filter;
  search.PropertiesToLoad.Add("displayName");
  search.PropertiesToLoad.Add("samaccountname");
  search.PropertiesToLoad.Add("department");
  search.PropertiesToLoad.Add("company");
  search.PropertiesToLoad.Add("lastlogon");
  search.PropertiesToLoad.Add("title");

  SearchResult result;
  SearchResultCollection resultCol = search.FindAll();
  if (resultCol != null)
  {
    for (int counter = 0; counter < resultCol.Count; counter++)
    {
      result = resultCol[counter];
      ActiveDirectoryUser adObject = new ActiveDirectoryUser(result);

      allUsers.Add(adObject);
    }
  }
  return allUsers;
}

* This source code was highlighted with Source Code Highlighter.

Тут важный параметр это PageSize, если его не установить, то поиск выдаст не более 1000 результатов.

Все готово. Запускаем веб-проект и выбираем на странице «Click here to view the samples in a Silverlight application using the PivotViewer control». В качестве sample collection выбираем ActiveDirectoryFactory.cs, после чего начнется заполнение данными и вы увидите весь список пользователей с возможностью сортировки по компании, отделу, должности…

Лично я сразу нашел кучу опечаток в параметрах пользователей, начиная от компании до должности. Простой и удобный просмотр, вместо dsquery.

Поскольку показать на маленьком скрине не очень удобно, вот ссылка на картинки
Tags:
Hubs:
+12
Comments6

Articles