Совсем недавно вышел замечательный контрол для Silverlight — PivotViewer. Попробуем использовать его для просмотра пользователей Active Directory. Для удобства понимания будем использовать готовый проект, предоставленный создателями Pivot.
Для работы нам потребуется:
Поехали:
Открываем в Visual Studio 2010 скаченный проект PivotJitServer. Находим проект CollectionFactories и добавляем туда новый класс, назовем его ActiveDirectoryFactory и унаследуем его от CollectionFactoryBase.
Далее добавим в проект CollectionFactories ссылку на сборку System.DirectoryServices и добавим «using System.DirectoryServices;» в наш класс.
Cоздадим вспомогательный класс ActiveDirectoryUser, который будет содержать в себе необходимые нам параметры. Для удобства в классе используется Dictionary для хранения связок параметр-значение Код (комментарии внутри):
Для создания коллекции элементов в классе CollectionFactoryBase существует метод MakeCollection, который возвращает PivotServerTools.Collection (коллекцию элементов для показа). Нам надо его изменить, чтобы в нем заполнить коллекцию нашими элементами.
SetFacetDisplay позволяет не отображать указанный параметр в фильтре, но показать его в свойствах при выбранном объекте в Pivot.
SetFacetFormat позволяет установить формат даты. В нашем случае устанавливается формат даты последнего входа пользователя.
И код для поиска объектов в ActiveDirectory
Тут важный параметр это PageSize, если его не установить, то поиск выдаст не более 1000 результатов.
Все готово. Запускаем веб-проект и выбираем на странице «Click here to view the samples in a Silverlight application using the PivotViewer control». В качестве sample collection выбираем ActiveDirectoryFactory.cs, после чего начнется заполнение данными и вы увидите весь список пользователей с возможностью сортировки по компании, отделу, должности…
Лично я сразу нашел кучу опечаток в параметрах пользователей, начиная от компании до должности. Простой и удобный просмотр, вместо dsquery.
Поскольку показать на маленьком скрине не очень удобно, вот ссылка на картинки
Для работы нам потребуется:
Поехали:
Открываем в 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.
Поскольку показать на маленьком скрине не очень удобно, вот ссылка на картинки