В течение многих лет работы администратором серверов я всегда выполнял регистрацию на каждом рабочем сервере, чтобы собрать данные или внести изменения. Обычный способ сделать это на серверах Windows — использовать протокол RDP, обеспечивающий доступ к серверу через клавиатуру и монитор. К сожалению, у этого метода есть два недостатка: во-первых, только два человека могут подключиться через RDP к любому серверу, а, во-вторых, RDP использует много ресурсов, что может повлиять на производительность сервера.

В PowerShell 2.0 реализован иной способ управления серверами, именуемый удаленным взаимодействием. При удаленном взаимодействии используется упрощенный протокол WSMan, чтобы предоставить доступ, необходимый для выполнения работ на сервере, но без значительных требований к ресурсам, свойственных RDP. Благодаря удаленному взаимодействию снимается ограничение на регистрацию двух пользователей, и вам не приходится разыскивать сетевого администратора, чтобы он освободил сервер и дал выполнить работу.

PowerShell 2.0 совместим с Windows Server 2003 с пакетом обновления SP2 и более поздними версиями. Обратите внимание, что для использования удаленного взаимодействия с заданием агента SQL Server на SQL Server 2008 или SQL Server 2008 R2 необходимо задействовать тип задачи командной строки и запустить powershell.exe с указанием полного пути к вашему сценарию. Дело в том, что эти версии SQL Server, поддерживая тип задач PowerShell, используют sqlps.exe на основе PowerShell 1 для выполнения сценариев PowerShell, и эта версия не поддерживает удаленное взаимодействие. SQL Server 2012 и выше используют версию PowerShell, установленную на сервере.

На приведенном рисунке вы видите простую схему, где показаны компоненты, используемые при удаленном взаимодействии PowerShell.

 

Компоненты, реализующие удаленное управление
Рисунок. Компоненты, реализующие удаленное управление

Сеанс PowerShell устанавливает соединение с HTTP-прослушивателем на сервере через протокол WSMan. Этот прослушиватель направляет запрос к конечной точке PowerShell, обслуживающей удаленное взаимодействие, и сервер запускает процесс wsmprovhost.exe, который представляет собой PowerShell на удаленном сервере. Важно помнить, что каждый уникальный удаленный сеанс с сервером получает собственный экземпляр wsmprovhost, поэтому может существовать больше двух сеансов связи с сервером, но с ростом их числа увеличивается количество ресурсов, выделяемых сервером для этих процессов.

В Windows Server 2012 и Windows Server 2012 R2 удаленное взаимодействие предусмотрено изначально, и вам остается лишь начать использовать его. Пользователям предыдущих серверных версий Windows необходимо подготовить сервер для удаленного взаимодействия с помощью команды Enable-PSRemoting. Если нужно подготовить для удаленного взаимодействия все серверы в домене, можно «Разрешить автоматическую настройку прослушивателей», выбрав Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM service.

После того, как удаленное взаимодействие будет разрешено, можно выполнить регистрацию в специальном сеансе на сервере с использованием команды Enter-PSSession. На данном этапе вы подключены к серверу таким же образом, как если бы выполнили прямую регистрацию на сервере. Это состояние продлится до тех пор, пока не будет выполнена команда Exit-PSSession (см. экран 1).

 

Команда Exit-PSSession
Экран 1. Команда Exit-PSSession

Специальные сеансы подходят для быстро выполняемых задач, но процесс организации сеанса на сервере связан с серьезными затратами. Поэтому, если предстоит выполнить значительный объем работ на сервере, полезно организовать постоянный сеанс с помощью команды New-PSSession. Затем можно открывать и закрывать сеанс по мере необходимости, и созданные объекты будут существовать до тех пор, пока не будут уничтожены с помощью команды Remove-PSSession (см. экран 2).

 

Команда Remove-PSSession
Экран 2. Команда Remove-PSSession

Благодаря интерактивным сеансам удается избежать затрат и ограничений, связанных с RDP, но преимущества удаленного взаимодействия будут еще более привлекательны, если использовать команду Invoke-Command для запуска задач на нескольких серверах. С помощью этой команды можно запускать один сценарий или набор сценариев на многих серверах. Я знаю администратора, который таким образом управляет тысячами серверов по всей стране. Кроме того, Invoke-Command обеспечивает одновременный запуск нужного числа таких команд. По умолчанию это число равно 32, но его можно изменить, указав аргумент -ThrottleLimit с другим значением.

Команда Invoke-Command принимает аргумент –ComputerName, чтобы получить список серверов, на которых можно запустить команду. Этот аргумент принимает единственное имя сервера, список имен серверов с разделителями-запятыми или объект с набором имен серверов. Вы указываете команду с помощью блока кода сценария после аргумента –ScriptBlock или задавая полный путь к запускаемому сценарию с использованием аргумента –filepath (см. экран 3).

 

Блок кода сценария после аргумента ScriptBlock
Экран 3. Блок кода сценария после аргумента ScriptBlock

После этого сценарии, подготовленные для сбора информации из SQL Server с использованием PowerShell, можно запускать на всех серверах одновременно. Собрать данные в таком случае удается гораздо быстрее, чем при запуске сценария на каждом сервере в отдельности. Результаты можно направить в переменную и проанализировать ее содержимое в поисках возможных проблем. В примере на экране 4 я искал любые базы данных со свойством AutoShrink, имеющим значение True.

 

Свойство AutoShrink имеет значение True
Экран 4. Свойство AutoShrink имеет значение True

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