.

Я давно работаю с SharePoint. Начав с SharePoint Team Services 2001, я по-настоящему приобрел опыт с Windows SharePoint Services 2.0 (WSS 2.0), с помощью которого управлял фермой из более чем 1200 коллекций сайтов и более чем 10 000 подсайтов. С первых шагов я оценил и начал применять сценарии.

Особенно полезным оказался инструмент командной строки Stsadm. С помощью Stsadm я управлял крупной фермой, и у меня еще оставалось время посмотреть видеоклипы на YouTube. Знание Stsadm принесло мне немало пользы. Я написал статью об Stsadm в журнале TechNet Magazine, главу об Stsadm в книге и прочитал на TechEd лекцию — угадайте, о чем? Правильно, об Stsadm.

Представьте мое состояние, когда я узнал, что в SharePoint 2010 предстоит переход на PowerShell и мой излюбленный инструмент Stsadm оказался лишним.

До этого момента в 2010 году мое знакомство с PowerShell было очень ограниченным. По большей части я избегал его, так как, на мой взгляд, этот инструмент слишком ориентирован на разработчиков. В нем есть объекты (что бы ни скрывалось под этим названием). Я — простой человек. Освоить Stsadm, несмотря на его ограничения и странности, было просто. PowerShell казался сложным и замысловатым. Я искренне сомневался, что моих умственных способностей хватит, чтобы одолеть его и привыкнуть использовать так же, как Stsadm. Так я оказался на первой из семи ступеней — печали.

На седьмой ступени, примирения с судьбой, я собрался с духом и возобновил попытки одолеть чудовище. Я купил пару книг по PowerShell и связался с группами поддержки. Ничего не помогало. PowerShell по-прежнему оставался неприступным, и я мог лишь сложить два числа и написать Hello World на экране. Ни одно из этих достижений не украсит резюме, прилагаемое к заявлению о приеме на работу. Возможно, я просто недостаточно сообразителен, чтобы использовать PowerShell? Может быть, думал я, мне лучше устроиться подсобным рабочим в ближайший ресторан…

Урок 1. Просто начните работать

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

Урок 2. Get-Member

Мои первые сценарии были довольно простыми, например получить список коллекций сайтов с помощью Get-SPSite или список веб-частей с помощью Get-SPWeb. Несмотря на их примитивность, я постепенно освоил такие концепции, как конвейер PowerShell, и способы форматирования вывода команд с применением таких команд, как Select-Object и Format-Table. Я научился составлять полезные команды в одну строку, например:

Get-SPSite -Limit all |
Select-Object Url, Owner, SecondaryContact |
Format-Table -AutoSize

Хотя команда разделена на несколько частей, в консоли PowerShell ее нужно вводить одной строкой. То же самое относится и к остальным командам. В результате выполнения этой команды получается удобный список всех коллекций сайтов в ферме, с указанием владельца и совладельца каждой коллекции сайтов.

В этой команде ясно, что в свойстве Owner хранится имя владельца, но не столь очевидно, что в свойстве SecondaryContact хранится имя совладельца. Свойства и методы объекта не всегда интуитивно понятны. Это один из недостатков, из-за которых PowerShell считается трудным для освоения.

К счастью, в PowerShell есть команда Get-Member, которая выручала меня во многих затруднительных ситуациях. С ее помощью можно определить свойства и методы любого объекта. Например, с использованием следующей команды можно увидеть все свойства объекта SPSite:

Get-SPSite | Get-Member

Запустив эту команду, я обнаружил, что должен использовать Owner и SecondaryContact для извлечения имен основного владельца и совладельца. Таким же образом я получил много другой полезной информации об объектах всех типов. Изучая списки свойств и методов объекта, я смог не только понять, как выполнить ту или иную задачу, но и составлял сценарии, которые ранее считал невозможными.

Например, получив элементы объекта SPWeb, я смог написать очень удобный сценарий в одну строку. Работая с SharePoint 2003 и SharePoint 2007, я часто помогал пользователям искать причины неполадок с веб-сайтами. Я спрашивал: «Какой шаблон использовался для создания этого веб-сайта?» — и никогда не мог получить ответа, потому что веб-сайт проектировали другие люди.

У различных веб-сайтов — разные веб-части и характеристики, поэтому полезно знать, какой шаблон использовался при создании веб-сайта. В SharePoint 2003 получить такую информацию было невозможно. В SharePoint 2007 это стало возможным после выхода пакета обновлений SP2. Благодаря PowerShell найти шаблон очень просто с помощью команды

Get-SPWeb http://portal.contoso.com/
   mysteryweb |
Select-Object Url, WebTemplate, WebTemplateId |
Format-Table -AutoSize

Мне бы никогда не пришло в голову использовать PowerShell таким образом, но, применив Get-Member к SPWeb, я открыл для себя свойство WebTemplate и задумался. Теперь мой набор инструментов пополнился еще одним бесценным средством.

Урок 3. Get-Command

Знать элементы объекта полезно, но только когда удалось понять особенности применения объектов и команд. Научиться искать команды было для меня очень важно. Это делается с помощью еще одной отличной команды — Get-Command, которая перечисляет команды на основе указанного пользователем критерия. Мое знакомство с Get-Command состоялось при использовании следующей однострочной команды, которая перечисляет все команды, относящиеся к SharePoint:

Get-Command -Module Microsoft.
   Sharepoint.Powershell

Их больше 500, намного больше, чем можно усвоить за один раз. Поэтому я начал уточнять поиск команд с использованием других параметров. Например, с помощью следующей однострочной команды можно получить все команды, относящиеся к коллекции сайтов (SPSites, как они называются в PowerShell):

Get-Command -Noun SPSite

В этой команде можно заменить любой глагол или существительное. Можно также использовать универсальные символы, например:

Get-Command *SPSite*

Фундамент будущего

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

В листинге показано одно из моих последних «произведений». Этот сценарий записывает URL-адреса SharePoint в файл HOSTS на сервере. Как правило, в моих файлах HOSTS серверы SharePoint всегда направлены на самих себя. Это упрощает диагностику и помогает определить, как компьютеры используются индексатором поиска при просмотре содержимого. При установке программных продуктов приходится многократно вносить одни и те же изменения, поэтому данная задача идеально подходит для автоматизации с использованием PowerShell. При подготовке сценария требовалось понять, как применить PowerShell для работы не только с SharePoint, но и с файловыми системами и реестром. Кроме того, нужно было обойти коллекцию объектов посредством цикла ForEach и манипулировать значениями с помощью методов Replace и ToString. У меня уже был фундамент, и я смог подготовить сценарий без особого труда. Подробнее об этом сценарии рассказано в моем блоге по адресу www.toddrkindt.com/edithosts в статье «PowerShell script to write SharePoint URLs to your server’s HOSTS files».

При освоении SharePoint 2010, как любого программного продукта, приходится изучать много нового, и для меня самым трудным было изучение PowerShell. Но благодаря урокам PowerShell я вырос не только как администратор SharePoint, но, возможно, и как личность. Теперь я могу автоматизировать типовые операции SharePoint, а также некоторые нетривиальные задачи. Кроме того, знание PowerShell полезно и при работе с другими продуктами, такими как Windows Server и SQL Server.

Листинг 1. Сценарий PowerShell для записи URL-адресов SharePoint в файл HOSTS сервера

# Подготовьте резервную копию файла HOSTS с сегодняшней датой.
# Убедитесь, что загружены расширения SharePoint.
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0
$hostsfile = 'C:\Windows\System32\drivers\etc\hosts'
$date = Get-Date -UFormat "%y%m%d%H%M%S"
$filecopy = $hostsfile + '.' + $date + '.copy'
Copy-Item $hostsfile -Destination $filecopy
# Получить список сопоставлений для альтернативного доступа (AAM) и удалить дубликаты.
$hosts = Get-SPAlternateURL | ForEach-Object {$_.incomingurl.replace("https://","").replace("http://","")} |
  Where-Object { $_.tostring() -notlike "*:*" } | Select-Object -Unique
# Получить содержимое файла HOSTS.
$file = Get-Content $hostsfile
$file = $file | Out-String
# Записать сопоставления AAM в файл HOSTS, если их еще не существует.
$hosts | ForEach-Object { if ($file.contains($_))
{Write-Host «Entry for $_ already exists. Skipping»} else
{Write-host "Adding entry for $_" ; add-content -path $hostsfile -value "127.0.0.1 `t $_ " }}
# Отключить проверку замыкания на себя, так как если она включена, все выполненные действия окажутся неудачными.
New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -Value "1" -PropertyType dword

Тодд Клиндт (todd@sharepoint911.com) — консультант по SharePoint, имеет звание SharePoint MVP