Хабрахабр

Пытаемся автоматизировать процессы с помощью Powershell

В этой статье рассмотрим почему мы все любим Powershell на паре рабочих примеров. Все это будет полезно при инвентаризации, поиске конкретного компьютера и прочих делах. Powershell оборудован удобными и запоминающимися командлетами, автодополнение всего и интуитивные названия делают его наверное самым простым в освоении языком.

Начнем со снипетов.
В этом руководстве рассмотрим несколько крутых по мнению автора команд и расскажем почему это круто.

Полезные снипеты:

Заносим компьютер в TrustedHosts

Команда перезапишет предыдущее значение, будьте осторожны, добавляйте ip или имена хостов через запятую. Пригодится при подключении к серверу по WinRm. Если все ваши хосты находятся в 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,
@}

Получаем список установленных программ:

Именно программ, а не компонентов:

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]}}

Останавливаем процесс по его имени.

Wildcard тоже подойдет, если хотите завершить всё. В этом примере останавливаем Chrome.

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 } }

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

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»