Windows PowerShell — весьма ценный инструмент, который вы можете задействовать для инвентаризации высокоуровневых объектов SharePoint. В предыдущей статье, «Инвентаризация SharePoint с использованием PowerShell», было показано, как собирать списки свойств фермы, веб-приложений, коллекций сайтов и сайтов, используя команды PowerShell. В данной статье я поясню, как можно использовать PowerShell для сбора информации из SharePoint о списках, библиотеках, файлах и страницах. Вот несколько задач, которые мы исследуем:

  • поиск списков и библиотек по любому свойству (например, версия, одобрение контента, дата создания);
  • поиск всех библиотек, которые используют выбранный тип контента;
  • обнаружение всех элементов с использованием выбранного столбца (включая поиск всех документов, созданных пользователем);
  • поиск всех документов определенного типа (например,. docx);
  • обнаружение всех файлов больше определенного размера;
  • перечисление всех библиотек, число файлов в них и общий размер файлов.

Разрешения

Вы используете PowerShell, но это совсем не означает, что вы можете игнорировать систему безопасности SharePoint. Вам понадобится, как минимум, иметь разрешение на чтение контента, который вы хотите исследовать. Вы можете добавить учетную запись, которую используете с PowerShell, в группу администраторов коллекции сайта в каждой коллекции сайта или применять пользовательские политики SharePoint Central Administration для предоставления вашей учетной записи полных разрешений на чтение в каждом приложении (выберите Central Administration, Application Management, затем выберите приложение и щелкните User Policy).

Сценарии, которые я представлю, вы можете загрузить на сервер. Имейте в виду, что они могут повлиять на работу ваших пользователей. Возможно, вы захотите запускать эти сценарии только в нерабочее время.

Общая схема для примеров сценариев

Все примеры сценариев в данной статье являются «однострочными». Несмотря на то, что они сформатированы в несколько строк (из-за формата статьи), вы можете вводить их одной строкой. Также вы можете вводить сценарии в несколько строк, если будете передавать их по конвейеру, обозначенному вертикальной линией ( | ) или добавлять символ «обратное ударение» ( ` ) в конце каждой строки.

Для написания и тестирования сценариев я настоятельно рекомендую вам использовать среду Windows PowerShell Integrated Scripting Environment (ISE) вместо командной строки.

Сценарии в данной статье следуют описанному ниже шаблону.

  • Выбираем веб-сайт, коллекцию сайта веб-сайтов или всю ферму веб-сайтов:
o Get-SPWeb http://sharepoint/sites/training
o Get-SPSite http://sharepoint/sites/training -Limit All | Select -ExpandProperty AllWebs
o Get-SPSite http://sharepoint/sites/training -Limit All | Select -ExpandProperty AllWebs OR
o Get-SPSite http://sharepoint/sites/training -Limit All | Get-SPWeb -Limit All
o Get-SPSite -Limit All | Select -ExpandProperty AllWebs OR
o Get-SPSite -Limit All | Get-SPWeb -Limit All
  • Раскрываем список свойств и передаем каждый список по одному по конвейеру:
Select -ExpandProperty Lists
  • Отфильтровываем списки:
o Where { $_.GetType().Name -eq «SPDocumentLibrary» }
  • Выбираем и форматируем результаты:
o Select Name, @{Name = «URL»;Expression = {$_.ParentList.ParentWeb.Url + «/" + $_.Url}
  • В некоторых случаях суммируем результаты:
o Group ParentWebUrl | Select Name, Count
  • Для краткости суммируем общие псевдонимы. Например, Select = Select-Object, Where = Where-Object, Group = Group-Object.

Один веб-сайт, коллекция сайта, приложение или вся ферма целиком?

В приведенном ниже примере мы начнем с одного сайта SharePoint (веб) с такой команды:

Get-SPWeb http://sharepoint/sites/training/salestraining |
Select -ExpandProperty Lists |
Select Title

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

Все списки в коллекции сайта:

Get-SPSite http://sharepoint/sites/training -Limit All |
Select -ExpandProperty AllWebs |
Select -ExpandProperty Lists |
Select ParentWebUrl, Title

 

Все коллекции сайта в одном веб-приложении:

Get-SPSite -WebApplication http://sharepoint -Limit All |
Select -ExpandProperty AllWebs |
Select -ExpandProperty Lists |
Select ParentWebUrl, Title

Все коллекции сайта в ферме:

Get-SPSite -Limit All |
Select -ExpandProperty AllWebs |
Select -ExpandProperty Lists |
Select {$_.ParentWeb.Url}, Title

Обратите внимание: в последнем примере мы заменили ParentWebUrl на {$_.ParentWeb.Url}, поскольку ParentWebUrl является относительным к приложению URL и не показывает нам полного адреса URL приложения.

Быстрое получение числа элементов

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

( Get-SPSite -Limit All |
Select -ExpandProperty AllWebs |
Select -ExpandProperty Lists ).Count

Поиск списков определенного типа

Существует два основных типа списков: списки и библиотеки. Чтобы найти первый или второй тип, вы можете провести тест на тип списка, создав вызов GetType().

Чтобы найти только списки:

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPList«} |
Select Title

Чтобы найти только библиотеки:

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«} |
Select Title

Многие списки и библиотеки используются внутри SharePoint и обычно скрыты от глаз пользователей. Такие примеры включают в себя Master Page Gallery и библиотеку Workflows. Мы можем исключить эти списки из круга наших поисков, так как они не будут содержать контента непосредственного пользователя. Чтобы это сделать, добавьте»-and -not $_.hidden«к задаче Where.

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.hidden } |
Select Title

Поиск списков и библиотек по любому свойству

Изменяя свойство, по которому вы фильтруете в операторе Where, вы можете найти списки и библиотеки только по одному свойству или функции. Следующий пример находит списки и библиотеки, поддерживающие управление версиями.

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { -not $_.hidden -and
$_.EnableVersioning -eq $true} |
Select ParentWebUrl, title

Вот несколько компонентов и функций, по которым вы можете искать (где $_ — это список или библиотека):

  • Поддержка версий: $_.EnableVersioning -eq $true
  • Требуется одобрение контента: $_.EnableModeration -eq $true
  • Внешние списки: $_.HasExternalDataSource -eq $true
  • Электронная почта активирована: $_.EmailAlias -ne $null or just $_.EmailAlias
  • Доступность веб-каналов RSS: $_.AllowRssFeeds -eq $true
  • Доступность вложений (только для списков): $_.EnableAttachments -eq $true
  • Доступность папок: $_.EnableFolderCreation -eq $true
  • Наличие папок: $_.Folders.Count -gt 0
  • Отсутствие элементов: $_.ItemCount -eq 0 (Note: External lists will always report ItemCount=0.)
  • Наличие более чем х элементов: $_.ItemCount -gt 1000
  • Наличие ассоциированных рабочих процессов: $_.WorkflowAssociations.count -gt 0
  • Отображение на QuickLaunch: $_.OnQuickLaunch -eq $true
  • Наличие нарушенного наследования элементов (уникальные разрешения): $_.HasUniqueRoleAssignments -eq $true
  • Кто создал библиотеку: $_.Author -like»sharepointstellas«
  • Даты: нахождение списков и библиотек на основании того, когда они были созданы или когда элемент был добавлен, обновлен в последний раз либо удален. $_.LastItemModifiedDate -gt (Get-Date 1/1/2013)
o Created
o LastItemModifiedDate
o LastItemDeletedDate
  • Любая комбинация указанных выше задач с использованием -Or (или), -And (и), или -Not (нет) и группирование условий в обычные скобки. Например: ( $_.Author -like»sharepointstellas«-or $_.Author -like»sharepointsamc«) -and $_.LastItemModifiedDate -gt (Get-Date 1/1/2013)

Нахождение списков по определенному типу контента

Можно провести фильтрацию по заголовку списка, но это не очень надежный способ отыскать все списки Announcement или все библиотеки документов. Ваши владельцы сайтов могут дать имена своим спискам. Поскольку списки в состоянии поддерживать более одного типа контента, наилучшим способом является поиск списков, которые поддерживают определенный тип контента.

Вы можете вывести все типы контента, использованные в коллекции сайта, поэтому следует знать их названия:

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty ContentTypes |
Select Name, ID | Sort Name

Теперь давайте найдем все списки Announcement в коллекции сайта. Чтобы это сделать, мы отфильтруем список по типу контента.

Get-SPSite http://sharepoint/sites/training |
Select -ExpandProperty AllWebs |
Select -ExpandProperty Lists |
ForEach { ForEach($ct in $_.ContentTypes)
{ if($ct.Name -eq»Announcement«) {$_} } } |
Select ParentWebUrl, Title

Этот пример требует пояснений. Внешний оператор ForEach принимает объект List по конвейеру и запускает код в скобках ( { } ). Этот код проверяет контент каждого типа»(ForEach($ct в $_.ContentTypes))«дабы убедиться, что его название Announcement. Если проверка прошла успешно, код посылает список»( $_ )«далее по конвейеру. Отсюда мы можем выбрать URL и Title (заголовок) списка. Вот переформатированная версия, чтобы лучше показать структуру:

. .. | ForEach for each item in the pipe
{
ForEach($ct in $_.ContentTypes) for each item in the content type collection
{
If it's the one we want, pass it ($_) on to the next pipe
if($ct.Name -eq»Announcement«) {$_}
}
}
|. ..

Нахождение элементов списка и документов библиотеки определенного типа

Документы могут храниться как библиотеки и как список вложений. Хотя свойства элемента для библиотеки будут содержать большее количество информации, чем вам нужно, некоторые данные, такие как размер файла, доступны из дочернего объекта, именуемого File. Файлы в списках можно найти в свойстве Attachments.

Сначала мы рассмотрим поиск документов в библиотеках. Существует несколько способов найти элементы списка и документы:

  • по слову в заголовке документа;
  • по значению в столбце;
  • по типу файла (например,. doc,. docx,. ppt,. pdf);
  • по размеру;
  • по типу контента (об этом говорилось ранее);
  • по возрасту;
  • по свойству, такому как поддержка версии или одобрение контента;
  • по любой комбинации этих критериев.

Во время фильтрации контента с использованием Where-Object (или просто Where) вы можете задействовать операторы -Like и -Match. Подобно применению групповых символов (»*«и "?»), как будет показано в приведенном ниже примере, Match использует постоянные выражения.

Where { $_.Name -Like «*share*» }

По слову в заголовке документа. Используя команду Where с проверкой –like, мы можем найти все похожие друг на друга элементы во всех библиотеках на сайте. Наборы папок и документов также являются элементами в библиотеке и будут учтены, если они совпадают друг с другом. Мы добавим проверку для типов контента позднее, чтобы иметь возможность выбрать или исключить элементы, такие как папки. Приведенный ниже пример выводит размер файла и URL файла. Заметьте, что размер файла извлечен из свойства File элемента «библиотека».

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq «SPDocumentLibrary» -and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_.Name -like «*airplane*» } |
Select Name, {$_.File.Length}, url

По значению в столбце. Вы можете отфильтровать ваш поиск по любому столбцу в списке или в библиотеке. Чтобы провести фильтрацию по столбцу, вам нужен список столбцов в библиотеке. На столбцы есть ссылки как на поля в списках SharePoint. Ниже показано, как вы можете получить список столбцов /полей в библиотеке Shared Documents:

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.Title -eq «Shared Documents» } |
Select -ExpandProperty Fields | Select Title, InternalName

Чтобы отфильтровать список документов, используя поле, просто добавьте Where-Object { $_[«fieldname»] -eq «sometext»} в конвейер.

Обратите внимание, что после «$_" нет пробела, когда вы работаете с полями. Например, $_[»Created By«]. Имя поля – вещь крайне чувствительная. Кроме того, вы можете использовать либо заголовок поля, либо InternalName, однако последнее надежней, так как владелец сайта может переименовать заголовки столбцов.

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

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_[»Created By«] -like»*sharepointstella*«} |
Select Name, url, {$_[»Created By«]}

Обратите внимание, что поля, содержащие имена пользователей, и поля поиска включают номер ID, разделитель (»;#«) и текстовое значение. Вам нужно будет использовать либо шаблон постоянного выражения для сопоставления с текстом после разделителя, либо –like с групповым символом в начале.

Следующий пример находит все документы в ферме с заданным именем столбца (в данном случае, каждый документ, созданный sharepointstellas).

Get-SPSite -Limit All |
Get-SPWeb -Limit All |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_[»Created By«] -like»*stella*«} |
Select Name,
@{ Name =»URL«;
Expression = {$_.ParentList.ParentWeb.Url +»/«+ $_.Url }
}

Обратите внимание:»@{ Name=«"; Expresion={…} }» используется для создания производного, или вычисляемого, столбца.

По типу файла. Поиск файлов по их файловому расширению представляет собой лишь поиск расширения как текста внутри названия файла. Чтобы найти файлы. docx, вам нужно просто передать по конвейеру список элементов в «Where { $_.Name -Like»*.docx«}". Хотя вы можете найти все файлы. doc и. docx при помощи»Where { $_.Name -Like «*.doc*» }«, более точным подходом будет тест на оба расширения с помощью»Where { $_.Name -Like «*.doc» -or $_.Name -Like «*.docx» }«.

Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_.Name -Like»*.docx«} |
Select Name,
@{Name=»URL«;
Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}}

Если вы хотите найти более одного типа, просто добавьте»-or«к предложению Where:

Where { $_.Name -Like»*.docx«
-or $_.Name -Like»*.xlsx«
-or $_.Name -Like»*.pptx«}

По размеру. Размер файла – это просто другое поле, поэтому проверка по размеру – это процесс, похожий на несколько предыдущих примеров. Будьте осторожны – существует более одного свойства «размер файла»!

-$_.File.Length (это числовой и, возможно, самый лучший вариант);

-$_[»File Size«] (то же самое значение, что и $_.File.Length, но оно является текстом, а не числом);

-$_.File.TotalLength (то же, что и $_.File.Length, исключение составляют страницы веб-части, где значение включает в себя пространство, необходимое для страницы и веб-частей);

-Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_.File.Length -gt 5000 } |
Select Name, {$_.File.Length},
@{Name=»URL«;
Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}}

По возрасту. Чтобы произвести фильтрацию по дате, мы можем сравнить дату или вычисляемую дату. Для этого необходимо знать имя поля или внутреннее имя. Следующий пример находит все документы в ферме, созданные до 12 января 2011 года:

Get-SPSite -Limit All |
Get-SPWeb -Limit All |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_[»Created«] -lt (get-date»12/1/2011«) } |
Select Name, {$_[»Created«]},
@{Name=»URL«;Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}}

Также можно использовать команду Get-Date для того, чтобы произвести сопоставление дат. Get-Date возвращает текущую дату по умолчанию. Заключая команду в простые скобки, мы можем вызвать методы. Net DateTime для вычисления любой будущей или прошлой даты. Некоторые из этих методов включают в себя AddMinutes, AddDays и AddYears. Вот пример, который находит все документы за три прошедших года и использует (Get-Date).AddYears(-3):

Get-SPWeb http://sharepoint/sites/training/salestraining |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_[»Created«] -lt (Get-Date).AddYears(-3) } |
Select Name, {$_[»Created«]},
@{Name=»URL«;Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}}

По свойству, такому как поддержка версии или одобрение контента. Поддержка версии — очень ценный компонент SharePoint, если его использовать должным образом. Владельцы сайтов часто включают поддержку версии без настройки ограничений версии. В результате вы можете столкнуться с сотнями версий, так как пользователи редактируют документы. Элементы списка и библиотеки имеют свойство, называемое Versions. Оно содержит коллекцию всех версий элемента. Мы можем получить число Versions для поиска документов с избыточным количеством версий. Приведенный ниже пример находит все документы с более чем 20-ю версиями:

Get-SPWeb http://sharepoint/sites/training/salestraining |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_.Versions.Count -gt 20 } |
Select Name, @{Name=»URL«;Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}},
{$_.versions.count}

Мы можем ускорить работу в предыдущем примере, проверяя только те списки, которые имеют свойство EnableVersioning, настроенное как $true.

Get-SPWeb http://sharepoint/sites/training/salestraining |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden -and
$_.EnableVersioning -eq $true } |
Select -ExpandProperty Items |
Where { $_.Versions.Count -gt 20 } |
Select Name, @{Name=»URL«;Expression={$_.ParentList.ParentWeb.Url +»/«+ $_.Url}},
{$_.versions.count}

Перечисление всех библиотек, число файлов в них и общий размер файлов

Предыдущие примеры сценариев возвращали списки элементов. Иногда вам необходимо просто их число. PowerShell включает в себя команду Group-Object, которая хорошо справляется с такой задачей.

Пример: как много открытых списков в каждом сайте ((SPWeb)?

Get-SPSite -Limit All |
Get-SPWeb -Limit All |
Select -ExpandProperty Lists |
Where { -not $_.hidden } |
Group ParentWebUrl |
Select Name, Count |
FT -AutoSize

В данном примере мы получаем всю коллекцию сайта, все веб-сайты и все списки, которые не скрыты. Затем группируем их по URL веб-сайта. Последний шаг – это отбор имени и число групп. Кроме того, вы можете использовать Format-Table (FT) для регулировки ширины столбцов.

Пример: как много документов в каждой библиотеке в веб-сайте?

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Group {$_.ParentList.ParentWeb.Url +»/«+ $_.ParentList.Title} |
Select Name, Count |
FT -AutoSize

Единственной хитростью в данном примере является группирование по выражению для получения полного пути к библиотеке. Расчет был простым, так как Group- команда Object автоматически добавила размер. Для получения промежуточных итогов по библиотекам вам придется провести дополнительную работу.

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

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Group {$_.ParentList.ParentWeb.Url +»/«+ $_.ParentList.Title} |
Select Name, count,
@{Name='Total';
Expression={$_.Group |
ForEach-Object `
-Begin {$total=0;} `
-Process {$total+=[int]$_.File.Length} `
-End {$total} `
}
} |
format-table -AutoSize

Все строки вниз от предложения Group — те же, что и в предыдущем примере. В предложении Select мы показываем имя и перебираем группу, а затем используем ForEach для перечисления каждого элемента в группе и добавления к общему числу.

Обратите внимание на символ ( ` ) в операторе ForEach. Это отметка «продолжение на следующей строке», потому что мы разбили ForEach на несколько строк. Вы могли бы написать такое же выражение без этого символа, если все располагается в одной строке.

ForEach-Object -Begin {. .. } -Process {. .. } -End {. .. }

Чтобы отфильтровать по типу и размеру файла, мы просто добавляем предложение Where для фильтрации элементов.

Get-SPWeb http://sharepoint/sites/training |
Select -ExpandProperty Lists |
Where { $_.GetType().Name -eq»SPDocumentLibrary«-and
-not $_.Hidden } |
Select -ExpandProperty Items |
Where { $_.Name -like»*.docx«-and
$_.File.Length -gt 10000000 } |
Group {$_.ParentList.ParentWeb.Url +»/" + $_.ParentList.Title} |
Select Name, Count |
FT -AutoSize

Насколько велик мегабайт? Одни говорят, это 1,000,000 байт, другие говорят, это 1,048,576 байт. Если вы хотите использовать второй вариант мегабайта и не все степени двойки помните, тогда позвольте PowerShell делать свою работу! Просто напечатайте две буквы: KB, MB, GB или TB. Между вашим числом и буквами пробела нет.

1KB = 1024

1MB = 1048576

1GB = 1073741824

1TB = 1099511627776

Итак, например, чтобы найти файлы, размер которых превышает 10MB, напечатайте следующее:

$_.File.Length -gt 10MB

От описи к контенту, от контента к системе безопасности

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