Использование Windows PowerShell для управления SharePoint Online

 

Дата изменения раздела: 2015-03-09

Сводка. Используйте Windows PowerShell, чтобы управлять Office 365 с помощью командлетов, сценариев и процессов пакетной обработки Windows PowerShell.

SharePoint Online можно управлять с помощью командлетов SharePoint Online. (Видите? Не все названия программ загадочны и непонятны.) В своем текущем воплощении оболочка Windows PowerShell внедрена в SharePoint Online несколько ограничено: администраторы Office 365 могут использовать только 30 командлетов, и в настоящее время вы не можете использовать Windows PowerShell для управления такими компонентами как OneDrive для бизнеса, поисковые запросы SharePoint Online, хранилище терминов SharePoint Online, профили пользователей и т. д. Значит ли это, что использовать Windows PowerShell для управления SharePoint Online нецелесообразно? Давайте не спешить с выводами. Как оказывается, несколькими ключевыми компонентами SharePoint Online можно не просто управлять с помощью Windows PowerShell, а управлять ими в Windows PowerShell чрезвычайно эффективно.

Использование Windows PowerShell для управления SharePoint Online

В этом разделе рассматриваются приведенные ниже темы.

  • Работа с сайтами SharePoint Online

  • Работа с пользователями SharePoint Online

  • Работа с группами сайтов SharePoint Online

  • Небольшое примечание относительно командлета ForEach-Object

Дополнительные сведения об использовании Windows PowerShell для управлении SharePoint Online можно найти в разделах справки по командлетам SharePoint Onlineпо следующему адресу.

Не забывайте про приведенные ниже две статьи, в которых описано много полезных команд Windows PowerShell для SharePoint Online.

Работа с сайтами SharePoint Online

Показать вам пример связанной области SharePoint Online, которой можно управлять с помощью Windows PowerShell? Без проблем. Централизованное место, где реализованы все возможности Windows PowerShell, поможет вам идентифицировать подмножество сайтов SharePoint Online. В крупных организациях количество сайтов часто может исчисляться сотнями или даже тысячами. Что в этом плохого? Ничего. Однако предположим, что у вас есть несколько сотен сайтов. Вы хотите знать, сколько из них являются вики-сайтами. Другими словами, вам нужно узнать, сколько ваших сайтов создано с помощью шаблона корпоративного вики-сайта (шаблона с официальным именем ENTERWIKI#0). Можно ли найти эти сведения с помощью Центра администрирования SharePoint Online? Это возможно, но нелегко. В любом случае, намного проще выполнить следующую команду Windows PowerShell:

Get-SPOSite | Where-Object {$_.Template -eq "ENTERWIKI#0"}

Другими словами, мы используем командлет Get-SPOSite, чтобы вернуть сведения обо всех наших сайтах, а затем с помощью командлета Where-Object выбираем только те сайты, для свойства Template которых задано значение ENTERWIKI#0.

Примечание

Как мы узнали, что шаблон корпоративного вики-сайта официально называется ENTERWIKI#0? Это просто: мы лишь выполнили эту команду.
Get-SPOWebTemplate

Возможно, вам нужен список всех сайтов, квота хранилища которых — более 1000 мегабайт или менее 250 мегабайт. Можно ли быстро и легко сделать это с помощью Windows PowerShell? Конечно, можно:

Get-SPOSite | Where-Object {$_.StorageQuota -gt 1000 -or $_.StorageQuota -lt 250}

Этот запрос немного сложнее некоторых из тех, которые встречались нам ранее, но изучив его, вы легко поймете, как он работает. В этом примере мы ищем сайты, отвечающие одному из двух критериев. Для сайта: 1) значение параметра StorageQuota должно превышать (-gt) 1000 мегабайт; или (-or), 2) значение параметра StorageQuota должно составлять менее (-lt) 250 мегабайт. Предположим, у нас 4 сайта.

Сайт StorageQuota

Сайт А

180

Сайт Б

700

Сайт В

300

Сайт Г

1500

В этом примере будет возвращен сайт А, так как значение его параметра StorageQuota составляет менее 250. Кроме того, будет возвращен сайт Г, потому что значение его параметра StorageQuota превышает 1000. Сайты Б и В не соответствуют ни одному из критериев, поэтому не будут возвращены.

Ниже приведен еще один пример, который может быть вам интересен. Предположим, вам нужен список всех сайтов, которые не принадлежат администратору, т. е. всех сайтов, для свойства Owner которых задано значение, отличное от (в нашем примере) admin@litwareinc.onmicrosoft.com. Эта команда чрезвычайно простая:

Get-SPOSite | Where-Object {$_.Owner -ne "admin@litwareinc.onmicrosoft.com"}

Но это не умаляет ее пользу.

Работа с пользователями SharePoint Online

Windows PowerShell — это невероятно полезное средство для работы с пользователями сайтов SharePoint Online. Вы можете использовать Windows PowerShell и командлет Get-SPOUser, чтобы получить список всех пользователей, которым предоставлен доступ к сайту. Это просто:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance"

необходимо вызвать Get-SPOUser и указать URL-адрес требуемого сайта.

Если же вы хотите получить только пользователей (а не группы) с доступом к сайту, выполните команду:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsGroup -eq $False}

Это также просто: мы запрашиваем пользователей сайта, свойство IsGroup которых имеет значение False. (В командах Windows PowerShell вместо традиционных значений True и False используются $True и $False.)

Это так же просто, как получить только пользователей, которые являются администраторами сайта, т. е. пользователей, свойство IsSiteAdmin которых имеет значение True:

Get-SPOUser -Site "https://litwareinc.sharepoint.com/sites/finance" | Where-Object {$_.IsSiteAdmin -eq $True}

Но это только для одного сайта. Вся сила Windows PowerShell (образно говоря) по-настоящему проявляется при работе с многочисленными объектами, например сайтами. Бывает удобно получить список всех пользователей с доступом к указанному сайту. Но что, если все наоборот: необходимо получить список всех сайтов, к которым у пользователя есть доступ? Можно ли это сделать с помощью Windows PowerShell? Конечно, можно. Вот простой скрипт (по правде говоря, он прост для тех, у кого есть опыт работы с Windows PowerShell), возвращающий имена всех сайтов, доступ к которым есть у определенного пользователя (в этом примере это Кен Майер (Ken Myer)):

$x = (Get-SPOSite).Url

foreach ($y in $x)
    {
        $z = $Null
        $z = Get-SpoUser -Site $y | Where-Object {$_.DisplayName -eq "Ken Myer"}
        if ($z -ne $Null) {$y}
    }

Примечание

Как использовать скрипт в Windows PowerShell? Следующим образом: скопируйте предыдущий код, вставьте его в Блокнот (или другой текстовый редактор), а затем сохраните файл с расширением .ps1 (например, C:\Scripts\SitesAUserCanAccess.ps1). Чтобы выполнить скрипт, подключитесь с помощью Windows PowerShell к SharePoint Online, а затем в командной строке Windows PowerShell просто введите путь к PS1-файлу и нажмите ВВОД:
C:\Scripts\SitesAUserCanAccess.ps1

Как насчет списка всех сайтов и их администраторов? Эти сведения можно получить одной командой:

Get-SPOSite | ForEach-Object {Write-Host $_.Url; Get-SPOUser -Site $_.Url | Where-Object {$_.IsSiteAdmin -eq $True}}

Результаты будут аналогичны следующим:

https://litwareinc.sharepoint.com/sites/communities
MOD Administrator  admin@litwareinc.com {Communities Members, Comm...}
Sara Davis  sarad@litwareinc.com {Communities Members, Communities...}

https://litwareinc.sharepoint.com/sites/finance
MOD Administrator admin@litwareinc.com {Excel Services Viewers, Hi...}

https://litwareinc.sharepoint.com/sites/hr
MOD Administrator  admin@litwareinc.com   {Contoso Beta Members, C...}

Данные выглядят не очень красиво, но ведь внешний вид — не главное. Ближе познакомившись с Windows PowerShell, вы узнаете, как настраивать выходные данные различными удобными способами.

Главное то, что Windows PowerShell позволяет не только получать данные, но и настраивать различные компоненты. У вас несколько сотен сайтов и вам нужно сделать пользователя Кена Майера (Ken Myer) администратором на каждом из них? Вот как это сделать:

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

Замечательно, да?

Работа с группами сайтов SharePoint Online

Не волнуйтесь, мы не забыли про группы сайтов. На самом деле, Windows PowerShell — это прекрасный инструмент для управления группами сайтов SharePoint. В центре администрирования SharePoint Online есть несколько простых в использовании способов для управления группами сайтов, но добраться до них не так просто. Предположим, например, что вы хотите просмотреть группы и участников групп для сайта https://litwareinc.com/sites/finance. Вот, что необходимо сделать для этого:

  1. В центре администрирования SharePoint Online на вкладке семейства веб-сайтов нажмите имя сайта.

  2. В диалоговом окне свойства семейства веб-сайтов нажмите ссылку, чтобы открыть веб-сайт https://litwareinc.com/sites/finance.

  3. На странице сайта нажмите значок Параметры (в верхнем правом углу страницы) и нажмите кнопку Параметры сайта:

    Параметр SharePoint Online: "Параметры сайта".

  4. На странице "Параметры сайта" нажмите Сайты и разрешения.

Затем повторите процесс для следующего сайта, который необходимо просмотреть.

Есть ли другой способ получить список всех групп и пользователей для определенного сайта? Есть по крайней мере один альтернативный способ:

$x = Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance"

foreach ($y in $x)
    {
        Write-Host $y.Title -ForegroundColor "Yellow"
        Get-SPOSiteGroup -Site "https://litwareinc.com/sites/finance" -Group $y.Title | Select-Object -ExpandProperty Users
        Write-Host
    }

Безусловно, предыдущий скрипт немного сложнее, чем большинство команд, которые мы продемонстрировали раньше. И для его выполнения требуются определенные усилия: в конце необходимо скопировать код, вставить его в Блокнот (или другой текстовый редактор), сохранить файл с расширением .ps1 (например, C:\Scripts\SiteGroupsAndUsers.ps1) и запустить скрипт в Windows PowerShell. Хотя, как мы сказали, это требует небольших усилий — для запуска скрипта требуется просто ввести полный путь к PS1-файлу:

C:\Scripts\SiteGroupsAndUsers.ps1

Так что — да, определенные усилия необходимы. Но посмотрите, что мы получаем, немного поработав:

Группы сайтов и участники групп сайтов.

Это все группы, созданные для сайта https://litwareinc.com/sites/finance, а также все пользователи, назначенные этим группам. (Чтобы немного похвастаться, мы показали имена групп желтым цветом, отделяя группы от их участников.)

Если вы думаете, что это что-то невероятное, посмотрите на этот скрипт:

$x = Get-SPOSite

foreach ($y in $x)
    {
        Write-Host $y.Url -ForegroundColor "Yellow"
        $z = Get-SPOSiteGroup -Site $y.Url
        foreach ($a in $z)
            {
                 $b = Get-SPOSiteGroup -Site $y.Url -Group $a.Title 
                 Write-Host $b.Title -ForegroundColor "Cyan"
                 $b | Select-Object -ExpandProperty Users
                 Write-Host
            }
    }

Он перечисляет все группы и всех участников групп для всех сайтов SharePoint Online. Попробуйте и посмотрите, что получится.

Теперь вы понимаете преимущества Windows PowerShell для управления SharePoint Online?

Небольшое примечание относительно командлета ForEach-Object

В разделе Работа с пользователями SharePoint Online вы могли заметить, что мы передали сведения о сайте командлету ForEach-Object.

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

Возникает интересный вопрос: зачем? В конце концов, при работе с командлетами Azure Active Directory мы передавали информацию непосредственно из командлета Get-MsolUser в командлет Set-MsolUser.

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

Так почему бы не сделать подобное с нашей командой SharePoint Online?

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Главная причина — это не сработает. Если используется командлет Set-SPOUser, необходимо явно включить параметр Site, а также указать после него имя сайта. Например:

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/communities" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Поэтому если мы попытаемся передать сведения непосредственно командлету Set-SPOUser, он не назначит пользователя Кена Майера (Ken Myer) администратором каждого из них. Вместо этого нам предложат ввести URL-адрес сайта.

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True
cmdlet Set-SPOUser at command pipeline position 2
Supply values for the following parameters:
Site: 

Это значит, что вместо этого нам нужно передать сведения о сайте в командлет ForEach-Object. Командлет ForEach-Object берет каждый переданный ему элемент (каждый сайт) и выполняет с ним действия, которые мы указали. В этом случае он должен с помощью командлета Set-SPOUser назначить пользователя Кена Майера администратором этого сайта.

Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Синтаксис $_.Url представляет URL-адрес сайта. $_. Указывает, что мы используем сведения, переданные в командлет ForEach-Object другим командлетом.

Слишком запутано? Ниже приведен краткий пример. Предположим, что у нас есть три сайта с указанными ниже URL-адресами.

Когда мы передаем сведения в командлет ForEach-Object, он берет первый элемент в коллекции (site1) и выполняет командлет Set-SPOUser, используя URL-адрес этого сайта. Другими словами, выполняется следующая команда.

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/site1" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

По завершении он берет второй сайт (site2) и выполняет применительно к нему командлет Set-SPOUser.

Set-SPOUser –Site "https://litwareinc.sharepoint.com/sites/site1" –LoginName "kenmyer@litwareinc.com" –IsSiteCollectionAdmin $True

Как видите, сейчас используется URL-адрес второго сайта в коллекции. Командлет ForEach-Object постепенно выполнит действия над всеми сайтами в коллекции и назначит пользователя Кена Майера (Ken Myer) администратором каждого из них.

Дополнительные сведения см. в этой статье. Несомненно, ForEach-Object — удобный небольшой командлет, о котором следует знать. Например, иногда при попытке передать сведения из одного командлета в другой отображается сообщение об ошибке, похожее на следующее.

The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Это связано с тем, что не все командлеты принимают входные данные, переданные по конвейеру. Как обойти эту проблему? Очень просто: использовать командлет ForEach-Object.

См. также

Лучшие способы управления Office 365 с помощью Windows PowerShell