tgindex
PowerShell Азбука - Иван Сёмин

PowerShell Азбука - Иван Сёмин

Статистика
@azbuka_powershellрусский

Огромное количество примеров скриптов и команд PowerShell, для упрощения повседневной жизни - еще больше материала на http://pyatilistnik.org/ Для связи - microsoftexam@yandex.ru

Последний пост
27 мар.
Последнее чтение
09:12
Постов за неделю
0
Всего постов
20
Тип
открытый
Язык
русский
В каталоге с
16 авг.
Подписчики
120
0 за 1 дн.
Сутки
 
Неделя
 
Месяц
 
Просмотров на пост
303
20 постов
Вовлечённость
252,5%
к подписчикам
Постов в день
0,0
всего 20
Упоминаний
0
каналов
Охват размещения
оценка
1/24сутки в ленте
1/48двое суток
1/72трое суток

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • Тема: Скрипт подсчета файлов и вывод процента по изменениям на определенную дату Он позволяет быстро понять, насколько сильно изменилась файловая система именно в этот день — не просто сколько файлов, а доля от общего количества. Вот практические сценарии, где такой скрипт реально нужен (от самых распространённых до узкоспециализированных): ✅ Аудит и безопасность (самый частый кейс) ✅ Отчётность для руководства / IT-отдел ✅ Анализ активности разработчиков и команд ✅ Бэкапы и системы восстановления. Перед восстановлением из бэкапа нужно понять, сколько файлов «живых» было изменено именно в день инцидента. ✅ Цифровая криминалистика и расследования ✅ Личные и креативные кейсы. Фотограф/видеограф: Сколько % всей медиатеки я добавил 10 марта (съёмка на свадьбе)? ✅ Оптимизация хранения и архивации ✅ Мониторинг тестовых/стендовых окружений. В Dev/Test/QA: сколько % конфигов и тестовых данных было изменено после конкретного деплоя. Пример работающего скрипта я привел в данной статье

  • Тема: Управление включением/Выключением протоколами SSL/TLS Может кому пригодится функция PowerShell по управлению включением/Выключением старых протоколов SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1. function Set-TLSProtocol { param( [string]$Protocol, [string]$Role, [ValidateSet("Enable", "Disable")] [string]$Action = "Disable", [switch]$Force ) $path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$Protocol\$Role" # Создаем путь если не существует if (!(Test-Path $path)) { New-Item -Path $path -Force | Out-Null Write-Host "Создан ключ: $path" -ForegroundColor Cyan } # Устанавливаем значения в зависимости от действия switch ($Action) { "Disable" { Set-ItemProperty -Path $path -Name "Enabled" -Value 0 -Type DWORD Set-ItemProperty -Path $path -Name "DisabledByDefault" -Value 1 -Type DWORD Write-Host "Отключен $Protocol для $Role" -ForegroundColor Red } "Enable" { Set-ItemProperty -Path $path -Name "Enabled" -Value 1 -Type DWORD Set-ItemProperty -Path $path -Name "DisabledByDefault" -Value 0 -Type DWORD Write-Host "Включен $Protocol для $Role" -ForegroundColor Green } } } Далее используем командлет Set-TLSProtocol -Protocol "TLS 1.0" -Role "Client" -Action "Disable" Set-TLSProtocol -Protocol "TLS 1.2" -Role "Server" -Action "Enable Подробнее можно почитать в статье

  • Тема: Скрпит по поиску и подсчету ненужных записей реестра с правилами Firewall. На любом сервере, где реализована служба RDSH по удаленному подключению, со временем накапливается мусор в реестре, по пути HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules. Туда складываются правила Firewall для каждого пользователя. Они автоматически не очищаются, что через некоторое время приведет, например к черным экран, когда по RDP будет подгружаться ваш рабочий стол, может падать производительность сервера и так далее. Тут можете почитать, как это отключать, чтобы это не создавалось, а вот вам скрипт для подсчета текущего состояния на массе серверов. # 1. Получаем список серверов из файла $servers = Get-Content -Path "C:\Path\To\Your\servers.txt" # 2. Создаем массив для хранения результатов $results = @() # 3. Перебираем каждый сервер foreach ($server in $servers) { try { # Пытаемся подключиться к реестру $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $server) $firewallRules = $reg.OpenSubKey('SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules') # Если ключ существует, подсчитываем записи GUID if ($firewallRules) { $guidCount = $firewallRules.GetValueNames() | Where-Object { $_ -match '^{[A-F0-9-]+}$' } | Measure-Object | Select-Object -ExpandProperty Count $firewallRules.Close() } else { $guidCount = 0 } $reg.Close() } catch { # В случае ошибки устанавливаем счетчик в 0 $guidCount = 0 } # 4. Формируем результат для текущего сервера $results += [PSCustomObject]@{ ServerName = $server RuleCount = $guidCount } } # 5. Выводим результаты в табличном виде $results | Format-Table -AutoSize

  • 8 окт. 2025 г.1827из pyatilistnikorg

    Тема: Как отправлять сообщения в телеграм с помощью PowerShell Большинство людей в России основным мессенджером для получения информации выбрали Телеграм. Он удобный и позволяет много, что автоматизировать и упростить. Подавляющее число администраторов любят получать уведомления из мониторинга именно туда, так как мобильное устройство всегда под рукой и читать чат проще, чем кучу писем на почте. В новой статье я изложил минимальный набор действий, который позволит вам используя PowerShell производить отправку сообщений в чат/группу Telegram. Я поэтапно показываю: ✅ Как узнать ID чата/группы ✅ Как создать бота и токен доступа ✅ Сами команды PowerShell У меня в компании, по данному алгоритму идет отслеживание важных у.з. на предмет блокировки и истечения пароля, кому интересно ссылка слева, дополнительное оповещение с СХД, отслеживание истечения CRL и многое другое. Ссылка на статью с картинками

  • Тема: Конвертирование двоичных чисел в десятичные и наоборот, средствами PowerShell Потребовалось мне для устранения ошибки на кластере Failover Clusters Windows произвести перевод десятичного числа в двоичный формат, потом изменить его и заново конвертировать в 10-е. Для этог оя не стал пользоваться онлайн сервисом, а решил вспомнить как это делать через PowerShell. ✅Перевод десятичного в двоичный формат | ForEach-Object { [Convert]::ToString($_, 2) -replace "(?<=\d)(?=(\d{5})+(?!\d))", " " } ✅Перевод двоичного в десятичный формат = "1010010000000010001000100011001" $decimal = [Convert]::ToInt32($binaryString, 2) Write-Host "Двоичное $binaryString = Десятичное $decimal"

  • Тема: Как удаленно произвести обновление групповой политики на списке серверов. Всегда удобно под рукой держать небольшой скрипт PowerShell, с помощью которого можно мануально ускорить применение нужных GPO: # Шаг 1: Взять список имен компьютеров из файла и поместить их в переменную $computers = Get-Content -Path "C:\Temp\RDS\servers-ntlm.txt" # Шаг 2: Выполнить gpupdate /force на каждом компьютере foreach ($computer in $computers) { Invoke-Command -ComputerName $computer -ScriptBlock { gpupdate /force } } #GPO еще больше скриптов ищите на сайте

  • Тема: Обновление curl.exe в Windows средствами PowerShell Не так давно появилась уязвимость в curl.exe CVE-2025-5399. Microsoft не особо спешит с ее устранением, а вся суть просто перейти на более свежую версию 8.15. Чтобы для своей инфраструктуры или домашней технике ускорить данный процесс, я написал скрипт позволяющий это сделать. Скрипт временно меняет владельца и права на файл C:\WINDOWS\System32\curl.exe, производит замену, на заранее скачанный файл и возвращает права и владельца как было. В статье по ссылке ниже приводятся скрипты для массового обновления. # Установка группы "Администраторы" как владельца файла curl.exe $filePath = "C:\WINDOWS\System32\curl.exe" $adminGroup = [System.Security.Principal.NTAccount]"Администраторы" $trustedInstaller = [System.Security.Principal.NTAccount]"NT SERVICE\TrustedInstaller" # Получаем текущий DACL файла $acl = Get-Acl -Path $filePath # Устанавливаем временного владельца (Администраторы) $acl.SetOwner($adminGroup) Set-Acl -Path $filePath -AclObject $acl # Даем группе "Администраторы" полные права (временно) $fullControlRule = New-Object System.Security.AccessControl.FileSystemAccessRule( $adminGroup, "FullControl", "None", "None", "Allow" ) $acl.AddAccessRule($fullControlRule) Set-Acl -Path $filePath -AclObject $acl # Копирование файла с заменой $sourceFile = "C:\Users\sem\Downloads\curl-8.15.0_4-win64-mingw\curl-8.15.0_4-win64-mingw\bin\curl.exe" $destinationFile = "C:\WINDOWS\System32\curl.exe" Copy-Item -Path $sourceFile -Destination $destinationFile -Force # Восстанавливаем исходные права и владельца $acl = Get-Acl -Path $filePath # Удаляем временное правило FullControl $acl.RemoveAccessRule($fullControlRule) | Out-Null # Добавляем права только на чтение и выполнение $readExecuteRule = New-Object System.Security.AccessControl.FileSystemAccessRule( $adminGroup, "ReadAndExecute", "Allow" ) $acl.AddAccessRule($readExecuteRule) # Восстанавливаем владельца TrustedInstaller $acl.SetOwner($trustedInstaller) # Применяем изменения Set-Acl -Path $filePath -AclObject $acl Write-Host "Файл успешно заменен. Владелец и права восстановлены." Подробнее - Алгоритм обновления curl.exe в Windows

  • Задача: Получить адреса IPv6 на серверах, загруженных из текстового файла. # Получаем список серверов из файла, далее кладем в переменную $servers = Get-Content -Path "C:\Temp\RDS\servers-test.txt" $results = @() foreach ($server in $servers) { try { # Проверяем доступность сервера $connectionTest = Test-Connection -ComputerName $server -Count 1 -Quiet -ErrorAction SilentlyContinue if (-not $connectionTest) { $result = [PSCustomObject]@{ 'ServerName' = $server 'InterfaceName' = 'Сервер недоступен' 'IPv6Address' = 'N/A' } $results += $result continue } # На каждом сервере найти все IPv6 адреса $networkAdapters = Get-NetAdapter -CimSession $server -ErrorAction Stop | Where-Object { $_.Status -eq 'Up' } $hasIPv6 = $false foreach ($adapter in $networkAdapters) { $ipv6Addresses = Get-NetIPAddress -CimSession $server -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv6 -ErrorAction SilentlyContinue if ($ipv6Addresses) { $hasIPv6 = $true foreach ($ipv6 in $ipv6Addresses) { # 3. Формируем объект с данными для вывода $result = [PSCustomObject]@{ 'ServerName' = $server 'InterfaceName' = $adapter.Name 'IPv6Address' = $ipv6.IPAddress } $results += $result } } } # Если на сервере не найдено IPv6 адресов if (-not $hasIPv6) { $result = [PSCustomObject]@{ 'ServerName' = $server 'InterfaceName' = 'Все интерфейсы' 'IPv6Address' = 'Не найдено' } $results += $result } } catch { $result = [PSCustomObject]@{ 'ServerName' = $server 'InterfaceName' = 'Ошибка подключения' 'IPv6Address' = "Ошибка: $_" } $results += $result } } # Выводим результаты в табличном виде $results | Format-Table -AutoSize Подробнее - Более детальная статья про IPv6 и его отключение

  • Тема: Скрипт получения отметки последнего обновления групповой политики на серверах Предположим, что вы создали новую групповую политику и нацелили ее на нужные сущности Active Directory. Произвели принудительное обновление GPO, и хотите убедиться, что политика долетела. В таких случаях можно всегда воспользоваться PowerShell, чтобы проверить временную отсечку. (Дополнительно еще советую почитать причины и методы диагностики почему не применилась групповая политика) Вот пример простого скрипта: # Чтение списка серверов из файла $servers = Get-Content -Path "C:\Temp\RDS\servers-term.txt" # Проход по каждому серверу foreach ($server in $servers) { try { # Использование Invoke-Command для выполнения кода на удаленном сервере $result = Invoke-Command -ComputerName $server -ScriptBlock { # Определение пути к реестру $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}" # Получение значений из реестра $LowTime = Get-ItemProperty -Path $RegPath -Name "EndTimeLo" $HighTime = Get-ItemProperty -Path $RegPath -Name "EndTimeHi" # Вычисление времени $CompTime = ([long]$HighTime.EndTimeHi -shl 32) + [long]$LowTime.EndTimeLo return [DateTime]::FromFileTime($CompTime) } # Вывод имени сервера и полученной даты Write-Output "$server $result" } catch { # Обработка ошибок Write-Output "Ошибка при доступе к серверу $server $_" } } Еще больше скриптов ищите на https://pyatilistnik.org/

  • Тема: Скрипт по массовой чистке Kerberos тикета и обновлению групповой политики Если у вас есть домен на базе Active Directory, то вы сто процентов часто делаете групповые политики, нацеленные на пользователей и объекты компьютеров. Для некоторых ситуаций в GPO используется фильтрация по группам безопасности, чтобы нацеливать ее исключительно на определенные списки. Когда вы добавляете объект компьютера в группу безопасности, это меняет его тикет Kerberos, выдаваемый контроллером домена на 8 часов. И теперь вся боль, как бы вы не удаляли/добавляли объект компьютера в группы, тикет не обновиться и тем самым и политика (не применится или наоборот пропадет). В таких случаях есть утилита командной строки позволяющая его принудительно почистить, ниже я приведу пример, когда мне нужно было это сделать на ряде серверов RDS фермы. Задача скрипта взять список серверов, на каждом очистить тикет Kerberos и обновить групповую политику принудительно. Думаю вы теперь сможете более точечно и осознано применять политику, понимать почему она может не применяться на группу участников. # Шаг 1: Взять список имен компьютеров из файла и поместить их в переменную $computers = Get-Content -Path "C:\Temp\RDS\servers-term.txt" # Шаг 2: Выполнить команду klist –li 0x3e7 purge на каждом компьютере foreach ($computer in $computers) { Invoke-Command -ComputerName $computer -ScriptBlock { klist –li 0x3e7 purge } } # Шаг 3: Выполнить gpupdate /force на каждом компьютере foreach ($computer in $computers) { Invoke-Command -ComputerName $computer -ScriptBlock { gpupdate /force } } Еще больше скриптов ищите на сайте - https://pyatilistnik.org/ #ActiveDirectory #Kerberos #Security

  • Задача: Взять список серверов и на каждом из них проверить какие существуют VPN профили в системе. В результирующей таблице вывести имя сервера, имя профиля с его описанием и путь до нужного ProfileID. Как и ранее в этом нам будет помогать PowerShell ISe в режиме администратора. # 1. Взять список серверов из файла $serverList = Get-Content -Path "C:\Temp\RDS\servers-term.txt" # 2. Создать массив для хранения результатов $results = @() # 3. Обойти каждый сервер из списка foreach ($server in $serverList) { try { # Создать удаленное подключение к серверу $session = New-PSSession -ComputerName $server -ErrorAction Stop # Получить список профилей из реестра $profiles = Invoke-Command -Session $session -ScriptBlock { Get-Item "HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" | Get-ChildItem | Select-Object Name, @{Name='ProfileName'; Expression={(Get-ItemProperty $_.PSPath).ProfileName}}, @{Name='Description'; Expression={(Get-ItemProperty $_.PSPath).Description}} } # 4. Обойти каждый профиль и добавить результаты foreach ($profile in $profiles) { $results += [PSCustomObject]@{ ServerName = $server ProfileID = $profile.Name ProfileName = $profile.ProfileName Description = $profile.Description } } # Закрыть сессию Remove-PSSession -Session $session } catch { Write-Host "Ошибка при подключении к серверу $server $_" } } # Вывести результаты $results | Sort-Object ProfileName | Format-Table -AutoSize Еще больше скриптов ищите на сайте https://pyatilistnik.org/ #Network #VPN

  • Задача: Взять список серверов и удаленно на каждом из них проверить установлено определенное обновление или нет. Для таких вещей отлично подходит PowerShell # 1. Взять список серверов из файла и положить в переменную $servers = Get-Content -Path "C:\Temp\RDS\dc-servers.txt" # 2. На каждом сервере удаленно проверяем наличие обновлений и версию ОС $results = foreach ($server in $servers) { # Получаем информацию о версии ОС $osInfo = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $server -ErrorAction SilentlyContinue # Проверяем наличие обновлений $update1 = Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName $server -ErrorAction SilentlyContinue | Where-Object { $_.HotFixID -eq "KB5048654" } $update2 = Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName $server -ErrorAction SilentlyContinue | Where-Object { $_.HotFixID -eq "KB5048661" } # Формируем результаты [PSCustomObject]@{ ServerName = $server KB5048654 = if ($update1) { $true } else { $false } KB5048661 = if ($update2) { $true } else { $false } OSVersion = if ($osInfo) { $osInfo.Caption + " " + $osInfo.Version } else { "Не удалось получить информацию" } } } # Выводим результаты $results | Format-Table -AutoSize Еще больше скриптов на https://pyatilistnik.org/exchange/ #Security #WindowsUpdate

  • Скрипт для удаленной проверки журнала NTLM на списке серверов. Еще больше скриптов ищите на Pyatilistnik.org. # Чтение списка серверов из файла $servers = Get-Content -Path "C:\Temp\RDS\servers-term.txt" # Проход по каждому серверу foreach ($server in $servers) { try { # Использование Invoke-Command для выполнения кода на удаленном сервере $result = Invoke-Command -ComputerName $server -ScriptBlock { # Определение пути к реестру $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}" # Получение значений из реестра $LowTime = Get-ItemProperty -Path $RegPath -Name "EndTimeLo" $HighTime = Get-ItemProperty -Path $RegPath -Name "EndTimeHi" # Вычисление времени $CompTime = ([long]$HighTime.EndTimeHi -shl 32) + [long]$LowTime.EndTimeLo return [DateTime]::FromFileTime($CompTime) } # Вывод имени сервера и полученной даты Write-Output "$server $result" } catch { # Обработка ошибок Write-Output "Ошибка при доступе к серверу $server $_" } }

  • Тема: Как удалить Java средствами PowerShell Появилась задача удалить на RDS ферме из 50 хостов компоненты Java. Одним из удобных вариантов, это использование кода PowerShell, который сходит на каждый хост, запросит есть там установленная Java, если да, то получит ее версии и затем произведет тихую деинсталляцию. По ссылке ниже представлены рабочие скрипты, как это осуществить. Методы удаления Java с помощью PowerShell

  • 6 нояб. 2024 г.22951из pyatilistnikorg

    Тема: Методы определения срока действия пароля пользователя Active Directory В статье рассматриваются методы позволяющие получить дату, когда у пользователя закончится пароль. Умение это делать позволит вам более тонко настроить политику уведомления, улучшить безопасность в домене и в целом прокачать знания по Active Directory. Подробнее про методы получения срока действия пароля у пользователя AD

  • Тут много примеров именно с помощью PowerShell

  • Тема: Как получить список DNS серверов на сетевых интерфейсах на группе удаленных хостов Я произвожу обновление контроллеров домена до Windows Server 2022, а это подразумевает, что по хорошему перед понижением роли DC нужно убрать из DNS на серверах, чтобы запросы ходили корректно. Ниже я приведу несколько PowerShell скриптов позволяющих это сделать на куче серверов из файла или например, только по контроллерам домена в домене или лесу. # Получаем список серверов из текстового файла $servers = Get-Content -Path "C:\Temp\servers.txt" # Проходим по каждому серверу foreach ($server in $servers) { # Получаем список сетевых подключений на сервере $networkAdapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $server | Where-Object { $_.IPEnabled -eq $true } # Проходим по каждому сетевому подключению foreach ($adapter in $networkAdapters) { # Получаем список DNS серверов на сетевом подключении $dnsServers = $adapter.DNSServerSearchOrder # Выводим данные foreach ($dnsServer in $dnsServers) { Write-Output "$server, $($adapter.Description), $($dnsServer)" } } } Пример для получения на контроллерах домена: # Импортируем модуль Active Directory Import-Module ActiveDirectory # Получаем всех контроллеров домена $DomainControllers = Get-ADDomainController -Filter * # Создаем массив для хранения информации $Result = @() # Проходим по каждому контроллеру домена foreach ($DC in $DomainControllers) { # Получаем IP-адреса контроллера $IPAddress = [System.Net.Dns]::GetHostAddresses($DC.HostName) | Where-Object { $_.AddressFamily -eq 'InterNetwork' } # Добавляем информацию в массив $Result += [PSCustomObject]@{ FQDN = $DC.HostName IPAddress = $IPAddress.IPAddressToString -join ', ' } } # Выводим результат $Result | Format-Table -AutoSize Еще больше скриптов ищите на сайте https://pyatilistnik.org/

  • Тема: Получить в Active Directory все объекты компьютера у которых операционная система Windows Server 2019 и исключить виртуальные компьютеры, а так же произвести сортировку по имени, с указанием количества. Это наверное самое часто выполняемое системным администратором действие. Get-ADComputer -Filter {OperatingSystem -like "*2019*" -and Enabled -eq $true} -Property * | Where-Object { $_.Description -notlike "*Failover cluster virtual network name account*" } | Select-Object Name, OperatingSystem, Enabled | Sort-Object Name | # Добавлено для сортировки по имени Format-Table $Count = (Get-ADComputer -Filter 'OperatingSystem -like "*2019*"' -Property *).Count Write-Host "Количество компьютеров: $Count" Еще больше скриптов PowerShell и примеров использования ищите на сайте https://pyatilistnik.org/

  • Тема: Как получить значения 006 DNS Servers у всех пулов на Windows DHCP. # Получаем все DHCP пулы $dhcpPools = Get-DhcpServerv4Scope -ComputerName "dhcp01.pyatilistnik.org" # Создаем массив для хранения результатов $result = @() foreach ($pool in $dhcpPools) { # Получаем параметры пула $options = Get-DhcpServerv4OptionValue -ScopeId $pool.ScopeId -ComputerName "dhcp01.pyatilistnik.org" # Ищем значение 006 DNS Servers $dnsServers = $options | Where-Object { $_.OptionId -eq 6 } # Если значение найдено, добавляем его в результат if ($dnsServers) { $result += [PSCustomObject]@{ PoolName = $pool.Name DNSServers = ($dnsServers.Value -join ", ") } } } # Выводим результаты в виде таблицы $result | Format-Table -AutoSize Еще больше полезных скриптов можете найти по ссылке

  • Тема: Как посмотреть отпечаток (Thumbprint) сертификата pfx Иногда нужно посмотреть отпечаток сертификата в формате pfx для скриптов и сценариев. Вот простой PowerShell код: # Укажите путь к вашему PFX файлу и пароль (если требуется) $pfxPath = "D:\Софт\pyatilistnik2025.pfx" $password = ConvertTo-SecureString -String "12345678" -AsPlainText -Force # Импортируйте сертификат в временное хранилище $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $cert.Import($pfxPath, $password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags::Exportable) # Выведите отпечаток сертификата $cert.Thumbprint Еще больше скриптов на pyatilistnik.org