суббота, 19 мая 2012 г.

Получение данных об изменениях на сайте - использование SPChangeQuery

SPChangeQuery используется для получения данных об изменениях произошедших на сайте в различных разрезах. В отличие от аудита, данная возможность включёна по умолчанию, но возвращает меньше информации.

Для осуществления запроса вызывается метод .GetChanges() объекта SPSite, SPWeb, SPList или SPContentDatabase.

 

Рассмотрим возможные отслеживаемые действия:

var query = new SPChangeQuery(false, false)
                {
                    Add = true, // Добавление объекта
                    Delete = true, // Удаление объекта
                    Update = true, // Обновление объекта
                    SystemUpdate = true, // Системное обновление элемента
                    GroupMembershipAdd = true, // Добавление пользователя в группу
                    GroupMembershipDelete = true, // Добавление пользователя в группу
                    Move = true, // Перемещение объекта
                    Rename = true, // Переименование объекта
                    Restore = true, //Восстановление объекта из корзины или архивной копии
                    RoleAssignmentAdd = true, // Назначение роли пользователю или группе
                    RoleAssignmentDelete = true, // Удаление роли
                    RoleDefinitionAdd = true, // Назначение разрешений роли
                    RoleDefinitionDelete = true, // Удаление разрешений роли
                    RoleDefinitionUpdate = true, // Обновление разрешений роли
                };

и возможные отслеживаемые объекты:

var query = new SPChangeQuery(false, false)
                {
                    Alert = true, // Оповещения
                    ContentType = true, // Типы содержимого
                    Field = true, // Поля списка
                    File = true, // Файлы
                    Folder = true, // Папки
                    Group = true, // Группы
                    Item = true, // Элементы списков
                    List = true, // Списки
                    Navigation = true, // Элементы навигации
                    SecurityPolicy = true, // Политики безопасности
                    Site = true, // Коллекция сайтов
                    User = true, // Пользователи
                    View = true, // Представления списков
                    Web = true, // Сайт
                };

Также позволяет задавать начальную (ChangeTokenStart) или конечную (ChangeTokenEnd) дату возвращаемых изменений.

 

Пример использования:

using (var site = new SPSite("http://site/"))
{
    using (var web = site.OpenWeb())
    {
        var list = web.Lists["TestList"];
        var timeZone = web.RegionalSettings.TimeZone;

        var query = new SPChangeQuery(false, false)
                        {
                            FetchLimit = 500, // Limit
                            Item = true, // Object type
                            Add = true, // Change type
                            Delete = true, // Change type
                            Update = true, // Change type
                            ChangeTokenStart = new SPChangeToken(SPChangeCollection.CollectionScope.List, list.ID, new DateTime(2012, 05, 11)) //From date
                        };

        Console.WriteLine("{0,-20}{1, -10}{2}", "Title/ID", "Action", "Time");

        while (true)
        {
            var changes = list.GetChanges(query);

            foreach (var change in changes.OfType<SPChangeItem>())
            {
                string itemTitle;
                try
                {
                    itemTitle = "Item Title: " + list.Items.GetItemById(change.Id).Title;
                }
                catch (Exception)
                {
                    itemTitle = "Item Id: " + change.Id;
                }

                Console.WriteLine("{0,-20}{1, -10}{2}", itemTitle, change.ChangeType, timeZone.UTCToLocalTime(change.Time));
            }

            // Go to next batch or break
            if (changes.Count < query.FetchLimit)
                break;
            query.ChangeTokenStart = changes.LastChangeToken;
        }
    }
}

 

Результат работы программы (консольное приложение):

image

2 комментария: