avatar
SuppTech

PowerShell для сисадмина

powershell-dlya-sisadmina-scenarii-kotorye-spasut-tebe-den

Если вы ещё не используете PowerShell на полную катушку, эта статья — ваш путеводитель по сценариям, которые действительно могут спасти вам день.

Почему PowerShell — ваш лучший друг

До появления PowerShell администраторы Windows часто полагались на графический интерфейс (GUI) или старые командные строки типа netsh или ipconfig.

PowerShell изменил всё. Его ключевые преимущества:

  • Автоматизация: Пишите сценарии один раз и используйте их снова и снова.
  • Мощность и гибкость: Работает с объектами, а не просто с текстом, что даёт беспрецедентные возможности для фильтрации, сортировки и манипуляции данными.
  • Интеграция: Глубокая интеграция с практически всеми продуктами Microsoft (Active Directory, Exchange, SQL Server, SharePoint, Hyper-V, Azure) и многими сторонними решениями.
  • Удалённое управление: Выполняйте команды и сценарии на сотнях серверов одновременно.
  • Отчётность: Легко генерируйте отчёты о состоянии системы, ошибках и производительности.

Давайте рассмотрим несколько сценариев, которые должен знать каждый сисадмин.

Сценарий 1: Управление службами

Часто возникает необходимость проверить статус службы, перезапустить её или изменить тип запуска на нескольких серверах.

# 1. Проверить статус службы на локальном компьютере
Get-Service -DisplayName "Диспетчер печати"

# 2. Перезапустить службу на локальном компьютере
Restart-Service -Name Spooler -Force

# 3. Получить статус службы на удалённом компьютере
# Замените 'RemoteServer01' на имя вашего сервера
Invoke-Command -ComputerName RemoteServer01 -ScriptBlock { Get-Service -Name Spooler }

# 4. Остановить службу на нескольких удалённых серверах
# Замените имена серверов в массиве
$servers = "Server01", "Server02", "Server03"
Invoke-Command -ComputerName $servers -ScriptBlock { Stop-Service -Name W3SVC -Force }

# 5. Установить тип запуска службы (например, автоматический)
Set-Service -Name "BITS" -StartupType Automatic

Когда это спасает день: Когда пользователи жалуются на недоступность сетевой печати, или когда нужно быстро перезапустить веб-сервер IIS на группе машин после изменения конфигурации.

Сценарий 2: Управление файлами и папками

Беспорядок на файловых серверах может стать настоящей головной болью. PowerShell поможет вам навести порядок.

# 1. Найти все файлы старше 30 дней в определённой папке и удалить их
$path = "C:\Logs"
Get-ChildItem -Path $path -Recurse | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-30) } | Remove-Item -Force

# 2. Найти все пустые папки и удалить их
Get-ChildItem -Path "D:\Temp" -Recurse -Directory | Where-Object { (Get-ChildItem -Path $_.FullName).Count -eq 0 } | Remove-Item -Force -Recurse

# 3. Получить размер папки (с подпапками)
Get-ChildItem -Path "C:\Program Files" -Recurse | Measure-Object -Property Length -Sum

# 4. Копировать файлы с одного сервера на другой (через SMB)
Copy-Item -Path "\\Server01\Share\config.ini" -Destination "\\Server02\Share\config.ini" -Force

Когда это спасает день: Когда дисковое пространство на сервере заканчивается из-за разросшихся логов, или когда нужно периодически очищать временные папки.

Сценарий 3: Управление Active Directory

Active Directory — сердце большинства корпоративных сетей. PowerShell делает управление им невероятно эффективным. Для этих команд нужен модуль ActiveDirectory (устанавливается вместе с RSAT).

# 1. Создать нового пользователя
New-ADUser -Name "Ivan Ivanov" -SamAccountName "i.ivanov" -GivenName "Ivan" -Surname "Ivanov" -Path "OU=Users,DC=example,DC=com" -AccountPassword (Read-Host -AsSecureString "Введите пароль") -Enabled $true

# 2. Добавить пользователя в группу
Add-ADGroupMember -Identity "IT Support" -Members "i.ivanov"

# 3. Найти всех пользователей, которые не заходили в систему более 90 дней
$lastLogonThreshold = (Get-Date).AddDays(-90)
Get-ADUser -Filter {LastLogonTimeStamp -lt $lastLogonThreshold} -Properties LastLogonTimeStamp | Select-Object Name, SamAccountName, @{Name="LastLogon"; Expression={[DateTime]::FromFileTime($_.LastLogonTimeStamp)}}

# 4. Отключить учётную запись пользователя
Disable-ADAccount -Identity "j.doe"

# 5. Получить всех членов группы
Get-ADGroupMember -Identity "Domain Admins" -Recursive | Select-Object Name, SamAccountName, ObjectClass

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

Сценарий 4: Мониторинг производительности и событий

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

# 1. Получить текущую загрузку процессора и использование памяти
Get-Counter '\Processor(_Total)\ Processor Time', '\Memory\Available MBytes'

# 2. Получить последние 20 ошибок из журнала событий 'System'
Get-WinEvent -LogName System -MaxEvents 20 -FilterXPath '[System[(Level=2)]]'

# 3. Найти все входы в систему с определённого IP-адреса (для аудита безопасности)
# Event ID 4624 - Успешный вход
Get-WinEvent -LogName Security -FilterXPath '[System[(EventID=4624)]] and [EventData[Data[@Name="IpAddress"] = "192.168.1.100"]]'

# 4. Отслеживать потребление памяти определённым процессом в реальном времени
Get-Process -Name chrome | Format-Table ProcessName, @{Name="WorkingSet (MB)";Expression={$_.WS / 1MB}} -AutoSize -Wait

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

Сценарий 5: Управление сетью

Настройка сетевых параметров может быть утомительной. PowerShell упрощает это.

# 1. Получить информацию о сетевых адаптерах
Get-NetAdapter

# 2. Изменить статический IP-адрес сетевого адаптера
# Замените значения под ваши нужды
$interfaceIndex = (Get-NetAdapter -Name "Ethernet").IfIndex
New-NetIPAddress -InterfaceIndex $interfaceIndex -IPAddress "192.168.1.10" -PrefixLength 24 -DefaultGateway "192.168.1.1"

# 3. Добавить/удалить DNS-серверы
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses ("192.168.1.1", "8.8.8.8")

# 4. Проверить открытые порты на удалённом хосте
Test-NetConnection -ComputerName "google.com" -Port 443

Когда нужно быстро перенастроить IP-адреса на нескольких серверах или проверить сетевое подключение к определённому сервису.

Сценарий 6: Управление обновлениями Windows

Неконтролируемые обновления могут вызвать проблемы. PowerShell поможет вам их контролировать.

# 1. Проверить наличие обновлений (требует модуль PSWindowsUpdate)
# Install-Module -Name PSWindowsUpdate -Force
Get-WindowsUpdate

# 2. Установить все доступные обновления и перезагрузить (требует модуль PSWindowsUpdate)
Install-WindowsUpdate -AcceptAll -AutoReboot

# 3. Проверить статус ожидающей перезагрузки на удалённом сервере (стандартный подход)
Invoke-Command -ComputerName RemoteServer01 -ScriptBlock { (Get-CimInstance -ClassName Win32_OperatingSystem).RebootPending }

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

Начало работы: Советы для новичков

  • Начните с малого: Не пытайтесь сразу написать сложный скрипт. Начните с простых команд, затем объединяйте их.
  • Сначала тестируйте: Всегда тестируйте свои скрипты в тестовой среде, прежде чем запускать их на производственных серверах, особенно те, что удаляют или изменяют данные.
  • Используйте Integrated Scripting Environment (ISE) или VS Code: Эти редакторы предоставляют автодополнение, подсветку синтаксиса и отладчик, что значительно упрощает написание скриптов.
  • Учитесь PowerShell Core: Это кроссплатформенная версия PowerShell, которая работает на Linux, macOS и Windows, и является будущим PowerShell.

Заключение

PowerShell — это мощный и незаменимый инструмент для современного системного администратора. Освоив его, вы сможете значительно сократить время на рутинные задачи, повысить надёжность своей инфраструктуры и, что самое главное, спасти себе день (и не один!).

Начните с этих простых сценариев, и очень скоро вы обнаружите, что PowerShell стал неотъемлемой частью вашего рабочего процесса.