Очень часто приходиться работать на удаленных серверах и зачастую надо выполнить простые команды – посмотреть список процессов, загрузку CPU, свободное место на дисках запустить (закрыть) программу, выполнить настройку и т.д. Чаще всего под такие цели делают удаленный вход на сервер по средствам RDP, RAdmin и т.д. Это конечно хорошо, но надо тратить время на вход, запуск консоли, копания в настройках. Давайте рассмотрим еще один способ удаленной работы.
Одним из нововведений компании Microsoft стала система WinRM — это новая удобная служба удаленного управления для Windows Server 2003 R2, Windows Vista и Windows Server 2008. WinRM — это «серверный» компонент этого приложения удаленного управления, а WinRS (Windows Remote Shell – удаленная среда Windows) – это «клиент» для WinRM, которые запускается на удаленном компьютере, пытаясь удаленно управлять сервером WinRM. Более подробно о этой системе можно прочитать в интернете.
Для быстрой настройки WinRM необходимо выполнить всего 3 команды на стороне сервера:
1 2 3 4 5 |
rem Включаем WinRM winrm quickconfig rem Настраиваем прием команд по протоколам HTTP и HTTPS winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"} winrm set winrm/config/service @{EnableCompatibilityHttpsListener="true"} |
Настройка на клиенте:
1 |
winrm set winrm/config/client @{TrustedHosts="*"} |
И еще одна полезная команда — проверка настроек:
1 |
winrm get winrm/config |
разрешаем выполнения любых скриптов на сервере:
1 |
Set-ExecutionPolicy Unrestricted |
Если сервер установлен за NAT, необходимо сделать проброс портов .
Более подробно о настройке можно прочитать тут или тут. Хорошо, настроили, а что дальше и что это дает? А дает это вот что, давайте рассмотрим пример на PowerShell:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Скрипт устанавливает на серверах (список должен быть в файле server.txt, каждый сервер в новой строке) # Временную зону "UTC" и потом ее проверяет, результат выводит в файл report.txt # Логин и пароль к серверам должен быть одинаковый. $username = 'Administrator' $password = 'Pa$$Word' $srv = Get-Content server.txt $report = "report.txt" $cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,(ConvertTo-SecureString -String $password -AsPlainText -Force) $session = New-PSSession -ComputerName $srv -Credential $cred # Утанавливаем GMT Invoke-Command -Session $session {tzutil /s "UTC"} #Выходим из сессии. Remove-PSSession -Session $session # Проверяем foreach ($server in $srv) { $session = New-PSSession -ComputerName $server -Credential $cred # выполняем запрос $result = Invoke-Command -Session $session {tzutil /g} # помещаем результат в файл Add-Content $Report "$server $result" #Выходим из сессии. Remove-PSSession -Session $session } |
Спасибо за статью очень достойный сайт.