Все курсы
Акции и промокоды Отзывы о школах

PowerShell: ваши первые шаги к автоматизации и контролю

Признаюсь честно, долгое время я относился к PowerShell как к избалованному младшему брату доброй старой командной строки – вроде бы и функционал богаче, и синтаксис современнее, но зачем все эти сложности, когда есть проверенный временем cmd.exe? Однако жизнь, как обычно, расставила все по своим местам.

PowerShell: когда cmd.exe становится слишком скучной

PowerShell – это не просто очередная командная оболочка от Microsoft (хотя, казалось бы, куда еще), а полноценная платформа для автоматизации задач и управления конфигурациями. В отличие от своего «древнего родственника» cmd.exe, который оперирует текстовыми данными, PowerShell работает с объектами .NET Framework. Звучит пугающе? На практике это означает, что вместо парсинга текстового вывода команд (помните эти бесконечные for-циклы в батниках?) мы получаем структурированные данные, с которыми можно работать напрямую.

А теперь самое интересное – с версии 7.0 PowerShell стал кросс-платформенным решением с открытым исходным кодом. Да-да, теперь вы можете использовать его не только в Windows, но и в Linux, и даже в macOS. Microsoft, выпускающая open-source продукт – забавные времена настали, не правда ли?

На мой скептический взгляд системного администратора со стажем, PowerShell сегодня – это тот инструмент, который должен быть в арсенале каждого IT-специалиста. Особенно если вы работаете в экосистеме Microsoft (а кто сегодня с ней не работает?).

Установка и настройка

Установка и настройка: первое свидание с PowerShell

Если вы счастливый обладатель Windows 10 или 11 (а кто сегодня не он?), то PowerShell уже установлен в вашей системе – Microsoft позаботилась об этом за вас. Правда, это может быть Windows PowerShell 5.1 – этакий «олдскул» версия, которая все еще актуальна для работы с legacy-системами.

Для тех же, кто хочет быть в тренде и использовать современный PowerShell 7+ (а он, поверьте моему опыту, стоит того), процесс установки прост как пара строк кода:

winget install Microsoft.PowerShell
# или для любителей классики
msiexec.exe /package PowerShell-7.4.0-win-x64.msi

А вот дальше начинается самое интересное – права доступа. Как человек, регулярно сталкивающийся с корпоративными политиками безопасности, могу сказать: для выполнения большинства действительно полезных команд вам понадобятся права администратора. Да-да, те самые, которые ваш системный администратор охраняет как зеницу ока (и правильно делает, кстати).

Для Linux-энтузиастов процесс установки может варьироваться в зависимости от дистрибутива (потому что когда это в мире Linux что-то было стандартизировано?). Для Ubuntu это будет что-то вроде:

sudo apt-get install -y powershell

Для macOS-пользователей (которые, вероятно, оценили кросс-платформенные возможности PowerShell) есть два способа установки:

# Через Homebrew для любителей пакетных менеджеров
brew install powershell

# Через официальный установщик
# Скачайте последнюю версию .pkg файла с GitHub
# github.com/PowerShell/PowerShell/releases
sudo installer -pkg ./powershell-7.4.0-osx-x64.pkg -target /

brew install powershell

И помните – с большой силой приходит большая ответственность. PowerShell – это мощный инструмент, способный как автоматизировать рутинные задачи, так и случайно «уронить» production-сервер. Поэтому первым делом после установки рекомендую ознакомиться с системой безопасности и политиками выполнения скриптов. Но об этом мы поговорим чуть позже – если, конечно, вы к тому моменту случайно не удалите системные файлы одной неверной командой (шучу, но на всякий случай делайте бэкапы).

Основные команды и скрипты: погружение в синтаксический океан

Помните, как в детстве нас учили, что глагол – это действие? В PowerShell эта школьная мудрость неожиданно становится практически полезной. Все командлеты (да, именно так называются команды в PowerShell – видимо, кто-то в Microsoft очень любит неологизмы) построены по принципу «Глагол-Существительное».

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

Get-Process # Получить список процессов (спойлер: их много)
Get-Service # Узнать, какие службы работают (или не работают)
Get-ChildItem # ls для тех, кто в костюме
Set-Location # cd для тех же людей в костюмах

Особенно радует Get-Help – это ваш лучший друг в мире PowerShell, этакий локальный Stack Overflow, только без минусов в карму за «глупые» вопросы:

Get-Help Get-Process -Detailed # Узнать все о команде, даже то, что вы не хотели знать

А теперь о самом интересном – создании скриптов. Файл с расширением .ps1 – это как текстовый документ, только с претензией на автоматизацию. Вот простейший пример:

# Мой первый не очень полезный скрипт
$processes = Get-Process
foreach ($process in $processes) {
    if ($process.CPU -gt 50) {
    	Write-Host "Процесс $($process.Name) съедает много CPU. Может, пора что-то с этим сделать?"
    }
}

Сохраняете это в файл script.ps1, и… нет, подождите, сначала нужно настроить политику выполнения (о которой мы поговорим позже), иначе система решит, что вы пытаетесь устроить восстание машин.

И да, переменные в PowerShell начинаются с $. Почему? Возможно, разработчики были фанатами PHP или просто хотели напомнить нам о деньгах, которые мы могли бы сэкономить на автоматизации рутинных задач.

Кстати, о рутине – PowerShell поддерживает конвейеры (pipes), что делает его похожим на bash для тех, кто привык к Unix-системам:

Get-Process | Where-Object {$_.CPU -gt 50} | Sort-Object CPU -Descending
# Получить процессы, отфильтровать прожорливые, отсортировать по потреблению CPU

И помните: в PowerShell всё является объектом. Даже когда вам кажется, что это не так – это всё равно объект. Просто смиритесь с этим – так проще жить.

Мониторинг ресурсов сервера: держим руку на пульсе Windows

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

PowerShell предоставляет несколько способов следить за здоровьем вашего сервера. И нет, я не про то, чтобы постоянно обновлять диспетчер задач — мы же не в каменном веке живем!

Начнем с самого простого — мониторинга процессора:

# Получаем загрузку процессора
$cpu = Get-WmiObject Win32_Processor | Select-Object LoadPercentage
Write-Host "Загрузка CPU: $($cpu.LoadPercentage)%"

# Для тех, кто любит современные решения:
Get-Counter '\Processor(_Total)\% Processor Time' | 
    Select-Object -ExpandProperty CounterSamples | 
    Select-Object CookedValue
# Да, второй вариант длиннее, но зато точнее и "современнее"

А теперь посмотрим, что там с памятью (потому что RAM много не бывает):

Для тех, кто хочет быть готовым к худшему (а это мы все), вот простой скрипт мониторинга с оповещениями:

# Скрипт "Почему сервер тормозит?"
function Monitor-ServerHealth {
    param(
        [int]$cpuThreshold = 90,
        [int]$memThreshold = 85
    )
    
    while($true) {
        $cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
        $memory = Get-WmiObject Win32_OperatingSystem
        $memUsage = [math]::Round(($memory.TotalVisibleMemorySize - $memory.FreePhysicalMemory) / $memory.TotalVisibleMemorySize * 100, 2)
        
        if($cpu -gt $cpuThreshold) {
            Write-Warning "CPU usage is too high: $([math]::Round($cpu,2))%!"
            # Тут можно добавить отправку email или SMS
            # Но это уже тема для следующего раздела...
        }
        
        if($memUsage -gt $memThreshold) {
            Write-Warning "Memory usage is critical: $memUsage%!"
        }
        
        Start-Sleep -Seconds 60  # Пауза минута (чтобы не устроить DOS-атаку на свой же сервер)
    }
}

И напоследок, для тех, кто любит все держать под контролем — мониторинг дискового пространства:

# Получаем информацию о памяти
$os = Get-WmiObject Win32_OperatingSystem
$usedMem = $os.TotalVisibleMemorySize - $os.FreePhysicalMemory
$totalMem = $os.TotalVisibleMemorySize
$memUsage = [math]::Round(($usedMem / $totalMem) * 100, 2)

Write-Host "Использование памяти: $memUsage%"

Кстати, все эти скрипты можно объединить в один мощный инструмент мониторинга. Но перед этим убедитесь, что у вас достаточно кофе — отладка сложных скриптов требует особого состояния сознания.

P.S. Если вы заметили, что в примерах используются разные подходы к получению одной и той же информации — это не баг, а фича. PowerShell, как и жизнь, предлагает множество путей к цели. Выбирайте тот, который лучше подходит именно вам. Главное — не забывайте документировать свой выбор, иначе через полгода вы сами не вспомните, почему использовали именно этот метод.

График отображает критические значения использования ресурсов (CPU и памяти) в реальном времени, с указанием порога критичности (90%)

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

Работа с PowerShell: когда консоль становится вторым домом

После нескольких месяцев работы с PowerShell начинаешь замечать, что привычный GUI кажется каким-то… избыточным. Знакомое чувство? Добро пожаловать в клуб консольных гиков!

PowerShell предлагает два основных интерфейса: классическую консоль (для тех, кто любит минимализм) и ISE (Integrated Scripting Environment) – для тех, кто все еще скучает по графическому интерфейсу. ISE, кстати, это такой швейцарский нож для разработки скриптов – с подсветкой синтаксиса, автодополнением и даже отладчиком. Правда, в новых версиях Microsoft настойчиво рекомендует использовать VS Code с расширением PowerShell (потому что когда это Microsoft упускала возможность продвинуть свой продукт?).

Особого внимания заслуживает профиль пользователя – этакий .bashrc для Windows-мира. Вот как можно создать и настроить свой профиль:

# Проверяем, существует ли профиль
Test-Path $PROFILE
# Если нет - создаем
if (!(Test-Path $PROFILE)) {
    New-Item -Type File -Path $PROFILE -Force
}
# Открываем для редактирования
notepad $PROFILE

В профиль можно добавить свои функции, алиасы и переменные. Например:

# Функция для ленивых (как я)
function gs { git status }
# Приветствие для корпоративного позитива
function prompt {
    "PS $($executionContext.SessionState.Path.CurrentLocation)> "
    # Да, я знаю, что это не очень креативно
}

И мой личный фаворит – настройка PSReadLine для автодополнения команд по истории:

Set-PSReadLineOption -PredictionSource History
# Теперь PowerShell будет подсказывать команды как ChatGPT, только без халлюцинаций

А знаете, что самое приятное? Все эти настройки сохраняются между сессиями. То есть, однажды настроив все «под себя», вы можете забыть о рутинной настройке рабочего окружения. По крайней мере, до следующего обновления Windows, которое, конечно же, случится в самый неподходящий момент.

P.S. Если вы когда-нибудь задумывались, почему промпт PowerShell по умолчанию такой скучный – я тоже. Видимо, дизайнер Microsoft в тот день был особенно минималистичен.

Планировщик задач: пусть работа делается сама

Знаете, что лучше чем автоматизировать рутинные задачи? Автоматизировать их запуск! Потому что даже самый крутой скрипт не принесет пользы, если вы забудете его запустить (а такое случается с лучшими из нас, особенно по понедельникам).

Windows Task Scheduler (или Планировщик задач для тех, кто предпочитает русский интерфейс) — это такой корпоративный будильник для ваших скриптов. И PowerShell, конечно же, умеет с ним работать:

# Создаем простейшую задачу
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
    -Argument '-NoProfile -File "C:\Scripts\MonitorHealth.ps1"'

$trigger = New-ScheduledTaskTrigger -Daily -At 9am
# Потому что каждое утро должно начинаться с проверки серверов

Register-ScheduledTask -TaskName "DailyHealthCheck" `
    -Action $action `
    -Trigger $trigger `
    -Description "Ежедневная проверка здоровья сервера" `
    -RunLevel Highest

Для тех, кто любит более сложные сценарии (а кто их не любит?), вот пример с несколькими триггерами:

# Задача "параноика": проверяем систему по будням каждые 4 часа
$triggers = @(
    $(New-ScheduledTaskTrigger -At 8am -Daily),
    $(New-ScheduledTaskTrigger -At 12pm -Daily),
    $(New-ScheduledTaskTrigger -At 4pm -Daily),
    $(New-ScheduledTaskTrigger -At 8pm -Daily)
)

$settings = New-ScheduledTaskSettingsSet `
    -StartWhenAvailable `
    -DontStopOnIdleEnd `
    -RestartInterval (New-TimeSpan -Minutes 1) `
    -RestartCount 3
# Потому что хороший скрипт должен быть настойчивым

Register-ScheduledTask -TaskName "ParanoidHealthCheck" `
    -Action $action `
    -Trigger $triggers `
    -Settings $settings

А вот как проверить, что наши задачи действительно работают (потому что доверяй, но проверяй):

# Получаем список всех задач в папке root
Get-ScheduledTask | Where-Object {$_.TaskPath -eq "\"} 

# Получаем историю выполнения конкретной задачи
Get-ScheduledTaskInfo -TaskName "DailyHealthCheck"

# Для тех, кто хочет знать все детали
$task = Get-ScheduledTask -TaskName "ParanoidHealthCheck"
$task | Select-Object -Property *

Особое внимание стоит уделить учетным записям, под которыми выполняются задачи. Потому что запуск скрипта от имени обычного пользователя — это как пытаться управлять сервером с помощью детского пульта от телевизора:

# Создаем задачу с указанием учетной записи
$credential = Get-Credential  # Запросит логин и пароль
Register-ScheduledTask -TaskName "AdminTask" `
    -Action $action `
    -Trigger $trigger `
    -User $credential.UserName `
    -Password $credential.GetNetworkCredential().Password

И помните о безопасности! Планировщик задач — это как ключи от квартиры: дали доступ не тому человеку — и прощай, спокойный сон. Поэтому:

# Проверяем права доступа к задаче
$taskPrincipal = New-ScheduledTaskPrincipal `
    -UserId "СИСТЕМА" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# Обновляем существующую задачу
Set-ScheduledTask -TaskName "DailyHealthCheck" `
    -Principal $taskPrincipal

P.S. Если вы когда-нибудь задумывались, почему некоторые задачи в планировщике помечены как «Последний результат: (0x1)», знайте — вы не одиноки. Расшифровка кодов ошибок планировщика задач — это отдельный вид искусства, достойный собственной главы. Но это уже совсем другая история…

А теперь, когда мы научились заставлять Windows работать по расписанию, давайте поговорим о том, как обезопасить все эти автоматизированные процессы от любопытных глаз и шаловливых рук…

Управление версиями и совместимость: танцы с бубном в мире Windows

Знаете, что самое забавное в работе с разными версиями PowerShell? То, что они могут сосуществовать на одной системе как соседи в коммунальной квартире – вроде бы и живут вместе, но у каждого свой характер и привычки.

Windows PowerShell 5.1 (тот самый, встроенный в Windows) и PowerShell 7+ могут работать параллельно, как будто специально чтобы запутать системных администраторов. Это как иметь в одном доме старый добрый DVD-плеер и новомодный стриминговый сервис – каждый для своих задач.

# Проверяем версию PowerShell
$PSVersionTable.PSVersion
# Если видите что-то вроде "5.1" - вы в Windows PowerShell
# Если "7.x" - поздравляю, вы в современном мире

Совместимость с операционными системами? О, это отдельная песня! PowerShell 7+ работает везде, где есть .NET Core (что, конечно, не означает, что все будет работать идеально). А вот Windows PowerShell 5.1 – это как старый верный пес, который знает только Windows, но знает его хорошо.

Для тех, кто любит жить на грани:

# Установка preview-версии PowerShell
winget install --id Microsoft.PowerShell.Preview
# Теперь у вас есть доступ к самым свежим багам... то есть, функциям

И да, помните о режиме совместимости. Некоторые старые скрипты могут работать не так, как ожидалось (или не работать вообще) в новых версиях. Это как пытаться запустить Windows 95 игру на современном компьютере – технически возможно, но потребует шаманских плясок с бубном.

Кстати, о шаманских плясках – в PowerShell 7+ появилась замечательная команда:

Enable-ExperimentalFeature
# Для тех, кто любит жить опасно и тестировать экспериментальные функции

P.S. Если вы когда-нибудь столкнетесь с ошибкой «Script is not digitally signed» в одной версии PowerShell, а в другой тот же скрипт работает – поздравляю, вы только что познакомились с прелестями различных политик безопасности в разных версиях. Но об этом в следующем разделе…

Политики выполнения и безопасность: паранойя как стиль жизни

В мире PowerShell безопасность – это не просто слово из корпоративной презентации, а целая философия. Microsoft настолько заботится о нашей безопасности, что по умолчанию запрещает выполнять практически все скрипты. Как говорится, предохраняйтесь!

# Узнать текущую политику выполнения
Get-ExecutionPolicy
# Спойлер: скорее всего, увидите "Restricted" - самый параноидальный режим

Существует несколько уровней паранойи… простите, политик выполнения:

  • Restricted: режим «никому не верю» (даже себе)
  • AllSigned: «доверяй, но проверяй цифровую подпись»
  • RemoteSigned: «локальным скриптам верю, удаленным – нет»
  • Unrestricted: «живем один раз!» (не рекомендуется, если вы дорожите своей работой)

Чтобы изменить политику (требуются права администратора, конечно же):

Set-ExecutionPolicy RemoteSigned
# Warning: This operation might affect system security...
# Да-да, мы в курсе, спасибо за заботу

Особо упоротые в плане безопасности могут использовать цифровые подписи для скриптов:

# Создание самоподписанного сертификата (для тех, кто любит все усложнять)
New-SelfSignedCertificate -DnsName "YourName" -CertStoreLocation "Cert:\CurrentUser\My" -Type CodeSigning
# Подписание скрипта (потому что мы можем)
Set-AuthenticodeSignature -FilePath .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My\[thumbprint])

А знаете, что самое забавное? Даже с самой строгой политикой безопасности всегда можно выполнить скрипт, набрав его содержимое прямо в консоли. Это как запрет на пронос напитков в кинотеатр – все равно кто-нибудь придумает способ обойти правила.

Помните: безопасность – это процесс, а не результат. И да, если вы работаете в корпоративной среде, лучше десять раз подумать, прежде чем менять политики безопасности. Потому что «а вдруг что-то пойдет не так» – это не параноя, это здравый смысл.

P.S. Если вы когда-нибудь получали сообщение «Выполнение скриптов отключено в этой системе», знайте – вы не одиноки. Мы все через это проходили.

Дополнительные ресурсы и сообщество: где найти помощь, когда Stack Overflow не помогает

После нескольких часов борьбы с непонятной ошибкой даже самые стойкие из нас начинают искать поддержки у единомышленников. К счастью, сообщество PowerShell настолько же активно, насколько Microsoft любит выпускать обновления Windows (то есть очень).

Первым делом, конечно, официальная документация на docs.microsoft.com. Да, я знаю, что читать документацию – это как читать инструкцию к телевизору, но поверьте моему опыту: иногда там действительно можно найти что-то полезное. Особенно когда все остальные источники подводят.

GitHub-репозиторий PowerShell – это как Reddit для кода: можно найти ответы на вопросы, которые вы еще не успели задать, посмотреть на чужие ошибки (чтобы потом их не повторять) и даже поучаствовать в развитии проекта. Если, конечно, вы готовы погрузиться в пучину pull request’ов и code review.

Для тех, кто предпочитает живое общение:

  • PowerShell.org – форум, где даже глупые вопросы получают умные ответы
  • r/PowerShell на Reddit – место, где можно найти решение проблемы, о существовании которой вы даже не подозревали
  • Twitter с хэштегом #PowerShell – для тех, кто любит короткие решения длинных проблем

Если вы чувствуете, что хотите не просто читать документацию, а получить структурированные знания под руководством опытных преподавателей, загляните в подборку курсов для системных администраторов на KursHub. Там можно найти образовательные программы разного уровня сложности, включая курсы по PowerShell и автоматизации администрирования Windows-серверов. В конце концов, иногда структурированное обучение эффективнее метода проб и ошибок – особенно когда речь идет о production-среде.

P.S. И помните: лучший способ научиться PowerShell – это сломать что-нибудь и попытаться это починить. Желательно не в production-среде, конечно. Хотя… кого я обманываю? Мы все учились именно там.

Дата: 23 декабря 2024
Читайте также
Блог
12 ноября 2024
Serverless для Java: новые возможности и решения для разработчиков

Изучите, как Java-разработчики могут использовать serverless-архитектуру для создания гибких, масштабируемых приложений, минимизируя затраты и сложность.

Блог
12 ноября 2024
Unit тестирование в Java: от основ до продвинутых техник

Как внедрить unit тестирование в Java-проект и получить стабильный код? Разбираем инструменты и лучшие практики для уверенного тестирования.

Блог
12 ноября 2024
Как Java помогает создавать идеальные облачные решения

Java и cloud computing — комбинация для масштабируемых приложений. Узнайте, какие фреймворки выбрать и как обеспечить высокую производительность.

Блог
22 ноября 2024
Почему Selenium и Java — лучший дуэт для автоматизации тестирования?

Автоматизация тестирования требует надежных инструментов. Узнайте, как Selenium с Java помогает создавать эффективные автотесты и какие ошибки стоит избегать.

Блог
13 ноября 2024
Java для бизнеса: старый друг лучше новых двух?

Почему Java остается востребованной в корпоративной среде? Мы объясним, какие преимущества она дает компаниям.

Блог
16 декабря 2024
Как выбрать лучший PHP-конструктор для вашего сайта: что стоит учитывать

Вам нужно быстро создать сайт, но вы не хотите заниматься написанием кода? Разбираемся, как выбрать идеальный PHP-конструктор для вашего проекта и на что обратить внимание.

Блог
12 декабря 2024
Интеграционное тестирование: основы, подходы, примеры

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

Блог
17 ноября 2024
Composer или ручное подключение? Как установить PHP-библиотеку в проект

Не знаете, как установить библиотеку в PHP-проект? В статье объясняется, как использовать Composer — мощный менеджер зависимостей, и как подключать библиотеки вручную, когда это необходимо. Разберём все шаги на примерах!

Блог
28 ноября 2024
Серверный JavaScript: революция в мире веб-разработки

Node.js сделал серверный JavaScript популярным инструментом для создания масштабируемых приложений. Разбираем, почему компании выбирают эту платформу и как она меняет подход к разработке.

Категории курсов
Отзывы о школах