Пытаемся автоматизировать процессы с помощью Powershell
В этой статье рассмотрим почему мы все любим Powershell на паре рабочих примеров. Все это будет полезно при инвентаризации, поиске конкретного компьютера и прочих делах. Powershell оборудован удобными и запоминающимися командлетами, автодополнение всего и интуитивные названия делают его наверное самым простым в освоении языком.
В этом руководстве рассмотрим несколько крутых по мнению автора команд и расскажем почему это круто. Начнем со снипетов.
Полезные снипеты:
Заносим компьютер в TrustedHosts
Пригодится при подключении к серверу по WinRm. Команда перезапишет предыдущее значение, будьте осторожны, добавляйте ip или имена хостов через запятую. Если все ваши хосты находятся в AD, трогать этот файл не нужно.
Set-Item WSMan:\localhost\Client\TrustedHosts -Value '192.168.0.1'
Wildcard тоже работает, если не хотите каждый раз добавлять новый хост в TrustedHosts.
Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*'
Храним пароль в зашифрованном виде в файле:
Пригодится для автоматизации, сильно облегчает жизнь при выполнении скриптов из планировщика, но при этом пароль хранится в безопасном виде.
Если выполнять скрипты из под зашедшего пользователя, будут использоваться креды этого пользователя.
Read-Host -AsSecureString | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath .\Password.txt
Забираем зашифрованный пароль из файла:
$Password = Get-Content C:\Password.txt | ConvertTo-SecureString
Тоже самое можно проделать и с Credentials, заменим Read-Host на Get-Credential.
Get-Credential | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File -FilePath .\Credential.txt
Получаем дату последней загрузки ОС.
(gcim win32_operatingsystem).LastBootUpTime
Тем же самым способом получаем еще и аптайм.
Get-CimInstance Win32_operatingsystem -ComputerName $computers |
Select-Object LastBootUpTime,
@{Name="Uptime";Expression = {(Get-Date) - $_.LastBootUptime}}
Получаем список установленных программ:
Именно программ, а не компонентов:
gcim win32_product -computername $env:computername | Sort-Object -property Vendor,Name | Select-Object -property Vendor,Name, Caption
Тоже самое, только через реестр:
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
Получаем список дисков, в том числе сетевых и свободное место на них
Get-PSDrive -PSProvider filesystem | where-object {$_.used -gt 0} |
Select-Object -property Root,@{name="Size";expression={($_.used+$_.free)/1GB -as [int]}},
@{name="Used";expression={($_.used/1GB) -as [int]}},
@{name="Free";expression={($_.free/1GB) -as [int]}}
Останавливаем процесс по его имени.
В этом примере останавливаем Chrome. Wildcard тоже подойдет, если хотите завершить всё.
Get-Process -Name "chrome" | Stop-Process
Копируем настройки доступа к папкам на дочерние папки
Пригодится, если вам захочется отобрать или дать права на пользование к папке и всем подпапкам у группы пользователей или у пользователя. Команда рекурсивно, снизу вверх копирует права на чтение и запись.
Копируем ACL у папки:
$Acl = Get-Acl -Path C:\folder\
Вставляем ACL на все файлы и подпапки:
Get-ChildItem -Path C:\Folder\ -Recurse | Set-Acl $Acl
Полезные скрипты:
Вот тут начинается самое страшное веселье. Если вам нужно провести инвентаризацию, будет очень полезно глянуть. Если ваши компьютеры не в AD, то скрипт станет немного сложнее, итерировать придется по заранее составленному файлу, а пароли нужно будет брать из файла или через Get-Credential. Вся разница:
C AD:
$ADComputers = (Get-ADComputer -filter *).DNSHostName
Без AD:
$Credentials = Get-Credential
$Computers = Get-Content -Path C:\servers.txt
Получаем аптайм дату последней загрузки каждого из компьютеров в AD:
$ADComputers = (Get-ADComputer -filter *).DNSHostName
foreach ($i in $ADComputers) {
Invoke-Command $i {
Get-CimInstance Win32_operatingsystem |
Select-Object LastBootUpTime,
@{Name="Uptime";Expression = {(Get-Date) - $_.LastBootUptime}}
}
}
Получаем все установленные программы на всех компьютерах AD:
$ADComputers = (Get-ADComputer -filter *).DNSHostName
foreach ($i in $ADComputers) {
Invoke-Command -computername $i {
gcim win32_product -computername $env:computername | Sort-Object -property Vendor,Name | Select-Object -property Vendor,Name, Caption
}
}
Тоже самое можно будет получить и для компонентов, подставив в Invoke-Command:
Get-WindowsFeature | Where-Object -Property "Installed" -EQ "Installed"
Получаем компьютеры, где запущен нужный нам процесс:
Если вы забыли на каком компьютере запущена та или иная программа, можно получить её таким способом. Рассмотрим на примере браузера:
$ADComputers = (Get-ADComputer -filter *).DNSHostName
foreach ($i in $ADComputers) {
Invoke-Command -computername $i {
Get-Process -Name "Chrome" -ErrorAction SilentlyContinue
}
}
Убить браузер можно будет так же легко, как и получить процесс:
$ADComputers = (Get-ADComputer -filter *).DNSHostName
foreach ($i in $ADComputers) {
Invoke-Command -computername $i {
Get-Process -Name "Chrome" | Stop-Process -ErrorAction SilentlyContinue
}
}
Получаем компьютеры, где установлена конкретная программа:
Кокретно в этом случае Java. Поможет при проведении инвентаризации можно будет посмотреть имена компьютеров где она была установлена.
$ADComputers = (Get-ADComputer -filter *).DNSHostName
foreach ($i in $ADComputers) {
Invoke-Command -computername $i {
gcim win32_product -computername $env:computername | Select-String -Pattern "Java" -AllMatches | Sort-Object -property Vendor,Name | Format-Table -ErrorAction SilentlyContinue
}
}
Если у вас возникнут предложения, будем рады добавить их в эту статью. Надеемся, эти примеры были для вас полезны.