Microsoft SharePoint быстро распространяется по всем предприятиям, потому что работать с этим инструментом очень просто. К сожалению, зачастую это означает, что его столь же легко использовать неправильно.

Для управления постоянно растущим контентом в SharePoint мы часто пишем планы обслуживания, которые определяют аудит и политики управления. Какие инструменты мы можем задействовать для выполнения этих проверок или даже просто выяснения, что происходит в установленных платформах SharePoint? Решения сторонних фирм могут управлять инвентаризацией и аудитом, но у вас уже есть великолепный инструмент — Windows PowerShell.

SharePoint 2010 и SharePoint 2013 поставляются с настраиваемой оболочкой, которая называется SharePoint 2010 (или SharePoint 2013) Management Shell. Она автоматически загружает команды PowerShell для SharePoint. И SharePoint 2007 тоже не остается в стороне. Используя одну или две дополнительные строчки PowerShell для ссылки на SharePoint DLL, вы можете выполнять те же самые задачи, что и в более новых версиях SharePoint.

Разрешения SharePoint

PowerShell не обходит систему безопасности SharePoint, но добавляет одно или два дополнительных требования. По умолчанию вы не можете получить доступ ни к какому контенту SharePoint или свойству, на доступ к которому у вас нет разрешений. Детальную информацию о необходимых разрешениях и о том, как их устанавливать, можно найти в статье Microsoft «Use Windows PowerShell to Administer SharePoint 2013» (http://technet.microsoft.com/en-us/library/ee806878.aspx).

PowerShell для SharePoint 2007

Хотя примеры, приведенные в данной статье, в целом используют команды PowerShell для SharePoint 2010, такие как Get-SPSite и Get-SPWeb, пользователи SharePoint 2007 не лишены возможности работать с PowerShell. Но им потребуется выполнить несколько больший объем работы. Они могут либо задействовать пользовательские команды (они доступны в моем блоге по адресу http://techtrainingnotes.blogspot.com/2012/12/sharepoint-2007-powershell-командуs.html), либо написать несколько дополнительных строк кода (большинство примеров в данной статье могут быть введены как одна строка кода).

Например, в SharePoint 2010 мы можем получить заголовок подсайта SharePoint, используя команду Get-SPWeb:

$web = Get-SPWeb http://sharepoint/blog
$web.Title

Затем будет показан заголовок сайта. Если вы используете SharePoint 2007 (или иным способом работаете с PowerShell, не применяя команды SharePoint 2010), можете получить заголовок сайта так:

[System.Reflection.Assembly]::LoadWithPartialName
(«Microsoft.SharePoint»)
$sitecollection = New-Object Microsoft.SharePoint.SPSite
(«http://sharepoint/blog»)
$web = $sitecollection.AllWebs[«blog»]
$web.Title

Заметьте, что этот код вводится как четыре отдельные строки. Первая строка предписывает PowerShell загрузить библиотеки SharePoint. Вторая строка создает объект коллекции сайтов. Оставшиеся строки создают объект подсайта. Вы набираете на клавиатуре больше, но в итоге получаете те же результаты, что и при использовании команды Get-SPWeb.

Большая часть объектов SharePoint, которые возвращают команды SharePoint 2010, может быть создана с помощью похожих приемов. Посмотрите мой блог (http://techtrainingnotes.blogspot.com/2012/08/sharepoint-powershell-cmdlets.html), там есть примеры.

Расстановка объектов

Чтобы избежать проблем с памятью при написании пользовательского кода, разработчики должны тщательно располагать объекты, которые они создают. Также вы можете создавать объекты в PowerShell. Хорошие кодировщики, вероятно, захотят предопределить некоторые из этих объектов. У Microsoft имеется соответствующий документ о расположении объекта в SharePoint. Там, вероятно, больше информации, чем вам необходимо по этой теме. Разработчикам сценариев для SharePoint 2007 придется поискать информацию в Интернете, а разработчики для SharePoint 2010 имеют две дополнительных команды, которые помогут им автоматически работать с размещением объекта. Все, что вам нужно сделать, это заключить свои сценарии между командами Start-SPAssignment и Stop-SPAssignment:

Start-SPAssignment -Global
# Your script goes here.
Stop-SPAssignment -Global

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

Чтобы продемонстрировать пример того, как задействовать SharePoint для аудита, нужно начать с инвентаризации нескольких элементов SharePoint, таких как коллекции сайтов (на которые ссылаются внутри SharePoint, как на сайты sites) и веб-сайты (на которые ссылаются как на webs). Команда Get-SPSite используется для поиска коллекций сайтов SharePoint, а Get-SPWeb служит для поиска веб-сайтов SharePoint. Дополнительная информация о Get-SPSite приведена во врезке «Получение справки PowerShell».

Получите список всех коллекций сайтов. Команда SharePoint 2010 Get-SPSite может возвращать список коллекций сайта. Если никаких параметров добавлено не было, Get-SPSite возвращает список всех коллекций сайта, на которые у вас есть разрешения в ферме.

Команда, такая как Get-SPSite, может возвращать тысячи элементов. Как показано на экране 1, выходные результаты будет ограниченными до тех пор, пока вы не добавите в команду переменную -Limit ALL.

 

Возвращение списка всех коллекций сайта
Экран 1. Возвращение списка всех коллекций сайта 

По умолчанию команда Get-SPSite показывает только адрес URL сайта (подробнее см. врезку «Как узнать о данных, переданных из SharePoint»). О том, как показывать свойства, рассказано во врезке «Выборочный показ свойств SharePoint».

Если вы хотите посмотреть URL, владельца и квоту всех коллекций сайта, используйте команду:

Get-SPSite http://yourserver/sites/yoursite |
Select Url, Owner, {$_.Quota.StorageMaximumLevel}

На экране 2 показан пример возвращаемого вывода. Подробная информация об отображении данных приведена во врезке «Отображение данных».

 

Просмотр владельца всех коллекций сайта
Экран 2. Просмотр владельца всех коллекций сайта

Получите список всех веб-сайтов (подсайтов). Получение списка всех веб-сайтов очень похоже на получение списка всех коллекций сайта. Все, что нам нужно, это другая команда — Get-SPWeb. В отличие от Get-SPSite, Get-SPWeb не может сама возвращать все сайты. Вам нужно предоставить URL начального сайта, либо напечатав его, либо посредством получения по конвейеру вывода из другого источника, такого как Get-SPSite. Для каждого веб-сайта, который выводится при помощи Get-SPWeb, команда показывает свойства веб-сайта.

Для отображения информации об одном веб-сайте используйте Get-SPWeb, а затем Select для выбора предназначенных для отображения свойств:

Get-SPWeb http://intranet.contoso.com |
Select Title, WebTemplate, Configuration

На экране 3 показан вывод. Заметьте, что STS#1 является шаблоном ID для пустого сайта. STS#0 также является ID для сайта группы. В данном примере WebTemplate = STS, а Configuration = 0, таким образом, сайт был создан как сайт группы.

 

Отображение информации для одного веб-сайта
Экран 3. Отображение информации для одного веб-сайта

Чтобы посмотреть все подсайты во всех коллекциях сайта, передайте по конвейеру вывод Get-SPSite в Get-SPWeb, как показано на экране 4. Если вы хотите получить список сайтов в одной коллекции сайта, тогда укажите URL этой коллекции сайта (см. экран 5).

 

Просмотр всех подсайтов во всех коллекциях сайта
Экран 4. Просмотр всех подсайтов во всех коллекциях сайта

 

Просмотр списка сайтов в одной коллекции сайта
Экран 5. Просмотр списка сайтов в одной коллекции сайта

Составление инвентарной описи

Предыдущие примеры возвращали все коллекции сайта и все подсайты. Обычно мы хотим найти только определенные сайты, конкретных пользователей или списки. У некоторых команд есть параметры для ограничения вывода, но для большинства команд необходимо отфильтровать результаты, передавая по конвейеру вывод в команду Where-Object. Чтобы не набирать «Where-Object», вы можете использовать один из его псевдонимов: where или «?».

Например, чтобы просмотреть всю ферму, желая увидеть, создал ли кто-нибудь сайт для блога, вы можете ввести такую команду:

Get-SPSite -Limit All | Get-SPWeb -Limit All |
Where { $_.WebTemplate -eq «BLOG» } | Select Url, Title

Условие Where-Object (Where) заключено в фигурные скобки ( { } ). Свойство, которое проверяется, указано с префиксом «$_.», где $_ представляет текущий объект, который вы передаете посредством конвейера. Заметим, что в PowerShell оператор сравнения не является символом, таким как знак равенства (=) или знак «больше» (>), а лишь -eq или -gt.

Теперь давайте посмотрим на эту идею иначе и получим инвентарную опись всех объектов SharePoint. Во всех последующих примерах вы можете передавать по конвейеру вывод команде Get-Member, чтобы раскрыть список свойств и затем использовать Select для отображения свойств или задействовать Where для фильтрации, основанной на свойстве.

Чтобы получить номер версии SharePoint, используйте следующую команду:

Get-SPFarm | Select BuildVersion

На экране 6 видно, что ферма работает на SharePoint 2010 Service Pack 1 (SP1). В статье Тода Клиндта, администратора блога SharePoint Admin Blog, «SharePoint 2010 Build Numbers» (http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=224), приведен список версий SharePoint.

 

Вывод получения номера версии
Экран 6. Вывод получения номера версии

Чтобы получить список всех серверов в ферме, введите следующую команду:

Get-SPServer | Select DisplayName, Role | ft -AutoSize

Чтобы получить список всех служебных приложений SharePoint, которые существуют в ферме, используйте команду:

Get-SPServiceApplication | Select DisplayName,
{$_.ApplicationPool.Name}

Чтобы получить список всех веб-приложений SharePoint, введите следующую команду:

Get-SPWebApplication | Select DisplayName,
Url, {$_.AlternateUrls.Count}

На экране 7 показан вывод. Заметьте, что он не включает Central Administration по умолчанию. Чтобы включить Central Administration, используйте следующую команду:

Get-SPWebApplication -IncludeCentralAdministration

 

Просмотр владельца всех коллекций сайта
Экран 7. Вывод получения списка всех веб-приложений SharePoint

Чтобы получить все коллекции сайта (на которые у вас есть разрешения), введите:

Get-SPSite -Limit All | Select Url, Owner,
{$_.Quota.StorageMaximumLevel}

Чтобы получить все коллекции сайта в одном веб-приложении SharePoint, введите:

Get-SPWebapplication http://intranet | Get-SPSite |
Select Url

Мы уже говорили о том, как при помощи команд получить все веб-сайты:

Get-SPSite -Limit All | Get-SPWeb -Limit All |
Select Title, WebTemplate, Configuration

На экране 8 показан вывод.

 

Вывод получения всех веб-сайтов
Экран 8. Вывод получения всех веб-сайтов

Чтобы получить все веб-сайты в коллекции сайта, введите:

Get-SPSite http://intranet.contoso.com |
Get-SPWeb | Select Title, WebTemplate, Configuration

Чтобы получить список установленных веб-шаблонов, используйте команду:

Get-SPWebTemplate

Получение всех веб-сайтов в коллекции сайта и их веб-шаблонов (Web Template) — процесс более сложный. В листинге 1 мы создаем функцию, возвращающую детали веб-шаблона для определенного имени шаблона и ID. Затем код показывает данные о веб, об URL, WebTemplate и настройках, а также ищет имя шаблона посредством вызова нашей функции. Экран 9 показывает результаты запуска кода листинга 1. Вы можете задействовать код в листинге 2 для очистки заголовков столбцов. На экране 10 показаны результаты.

 

Получение всех веб-сайтов в коллекции сайта и их веб-шаблонов
Экран 9. Получение всех веб-сайтов в коллекции сайта и их веб-шаблонов

 

Очищенный вывод списка всех полученных веб-сайтов в коллекции сайта и их веб-шаблонов
Экран 10. Очищенный вывод списка всех полученных веб-сайтов в коллекции сайта и их веб-шаблонов

При поиске всех веб-сайтов, которые основаны на одном шаблоне, используется похожий код, но при этом применяется команда Where с добавлением поиска Web Template.

Get-SPSite -Limit All | Get-SPWeb -Limit All |
Where { $_.WebTemplateId -eq (Get-SPWebTemplate «BLOG#0»).Id} |
Select Url

Этот пример находит все сайты блогов в ферме. Имя блог-шаблона — BLOG#0. Вывод показан на экране 11.

 

Вывод получения всех веб-сайтов одного шаблона
Экран 11. Вывод получения всех веб-сайтов одного шаблона

От описи к контенту

В данной статье мы начали инвентаризацию объектов ядра SharePoint, таких как коллекции сайта и веб-сайты. В следующих статьях мы остановимся на контенте, таком как поиск всех документов определенного типа (например,. docx) или превышающих определенный размер; перечислении всех библиотек, числа их файлов и общего размера файлов либо поиск всех библиотек, которые используют специфический тип контента; поиске всех настроенных под пользователя страниц или всех страниц, которые используют выбранный Web Part. Кроме того, мы уделим внимание пользователям и вопросам системы безопасности, таким как перечисление всех групп и их членов, всех владельцев сайта во всех сайтах, всех администраторов коллекций сайтов, всех пользователей, у которых есть доступ к файлу и т.д.

До рассмотрения всех указанных выше тем обратите внимание на следующие полезные ресурсы:

  • Scripting with Windows PowerShell (написание сценариев при помощи Windows PowerShell), http://technet.microsoft.com/en-us/scriptcenter/dd742419;
  • Windows PowerShell (http://technet.microsoft.com/en-us/library/bb978526);
  • PowerShell.com (http://powershell.com/);
  • Use Windows PowerShell to Administer SharePoint 2013 (использование Windows PowerShell для администрирования SharePoint 2013, http://technet.microsoft.com/en-us/library/ee806878.aspx).

Листинг 1. Создание функции для возвращения деталей веб-шаблона.

Function Get-SPWebTemplateByIdentity ($name,$id)
{Get-SPWebTemplate -Identity $name«#"$id}
Get-SPSite -Limit All | Get-SPWeb -Limit All |
Select Url, WebTemplate, Configuration,
{ (Get-SPWeb TemplateByIdentity $_.WebTemplate $_.Configuration).Title } |
Format-Table

Листинг 2. Очистка заголовков столбцов.

Function Get-SPWebTemplateByIdentity ($name,$id)
{Get-SPWebTemplate -Identity $name»#«$id}
Get-SPSite -Limit All | Get-SPWeb -Limit All | Select Url,
@{ label=»Template«; expression={$_.WebTemplate+»#«+$_.Configuration}},
@{ label=»Template Name«; expression={ (Get-SPWebTemplateByIdentity
$_.WebTemplate $_.Configuration).Title }} | Format-Table

Получение справки PowerShell

В Windows PowerShell предусмотрена справка для всех команд, имеющихся в SharePoint 2010 и SharePoint 2013. Например, чтобы больше узнать о Get-SPSite, просто введите

Help Get-SPSite

в командной строке. Можно запросить дополнительную информацию, указав одну из следующих переменных:

-Examples
-Detailed
-Full

Как узнать о данных, переданных из SharePoint

В Windows PowerShell есть команда Get-Member, которая выводит список всех свойств и методов объекта. Если ввести

Get-SPSite http://yourserver/sites/yoursite,

то PowerShell показывает URL-адрес сайта. Чтобы увидеть все параметры сайта, направьте вывод команды в Get-Member:

Get-SPSite http://yourserver/sites/yoursite |
-Get-Member MemberType Property

Выборочный показ свойств SharePoint

Для выборочного показа свойств, выданных командой Get-Member, направьте вывод Get-SPSite в Select:

Get-SPSite http://yourserver/sites/yoursite | Select Url, Owner

Некоторые свойства сами являются объектами (а не просто свойствами) и имеют собственные свойства. Например, можно попробовать ввести следующую команду, чтобы получить размер квоты:

Get-SPSite http://yourserver/sites/yoursite |
Select Url, Owner, Quota.StorageMaximumLevel

Эта команда выдает сообщение об ошибке. Чтобы получить квоту, следует ввести команду:

Get-SPSite http://yourserver/sites/yoursite | Select Url, Owner,
{$_.Quota.StorageMaximumLevel}

Отображение данных

С помощью команды Select-Object (Select) из Windows PowerShell можно отображать простые типы данных, такие как строки и целые числа, перечисляя имена свойств:

Select Url, Owner

Многие свойства представляют собой объекты, имеющие собственные свойства. Необходима особая нотация для получения дочерних свойств. Например, свойство квоты семейства веб-сайтов — это объект, который имеет свойство с именем StorageMaximumLevel. Чтобы показать это свойство, введите

Select Url, Owner, {$_.Quota.StorageMaximumLevel

Этот прием работает, но выдает лишь заголовок столбца с меткой $_.Quota.StorageMaximumLevel.

Чтобы показать эти данные с более правильным заголовком столбца Quota, необходимо определить как отображаемую метку (то есть заголовок столбца), так и выражение:

@{ label=»Quota"; expression={$_.Quota.StorageMaximumLevel} }