tgindex

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

описание

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

120
подписчиков
Охват к подписчикам
252,5%
ERR
Реакции к просмотрам
1,87%
113 на 20 постов
Пересылки к просмотрам
1,31%
79
Постов в день
0,0
всего 20

Где отзываются чаще

доля реакций к просмотрам
  • 27 окт.Тема: Скрпит по поиску и подсчету ненужных записей реестра с правилами 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 -AutoSize3,98%
  • 8 окт. 2025 г.Тема: Как отправлять сообщения в телеграм с помощью PowerShell Большинство людей в России основным мессенджером для получения информации выбрали Телеграм. Он удобный и позволяет много, что автоматизировать и упростить. Подавляющее число администраторов любят получать уведомления из мониторинга именно туда, так как мобильное устройство всегда под рукой и читать чат проще, чем кучу писем на почте. В новой статье я изложил минимальный набор действий, который позволит вам используя PowerShell производить отправку сообщений в чат/группу Telegram. Я поэтапно показываю: ✅ Как узнать ID чата/группы ✅ Как создать бота и токен доступа ✅ Сами команды PowerShell У меня в компании, по данному алгоритму идет отслеживание важных у.з. на предмет блокировки и истечения пароля, кому интересно ссылка слева, дополнительное оповещение с СХД, отслеживание истечения CRL и многое другое. Ссылка на статью с картинками3,85%
  • 4 окт. 2025 г.Тема: Конвертирование двоичных чисел в десятичные и наоборот, средствами 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"3,78%
  • 9 сент. 2025 г.Тема: Как удаленно произвести обновление групповой политики на списке серверов. Всегда удобно под рукой держать небольшой скрипт 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 еще больше скриптов ищите на сайте3,63%
  • 24 июл. 2024 г.Тема: Как посмотреть отпечаток (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.org3,63%
  • 27 мар.Тема: Скрипт подсчета файлов и вывод процента по изменениям на определенную дату Он позволяет быстро понять, насколько сильно изменилась файловая система именно в этот день — не просто сколько файлов, а доля от общего количества. Вот практические сценарии, где такой скрипт реально нужен (от самых распространённых до узкоспециализированных): ✅ Аудит и безопасность (самый частый кейс) ✅ Отчётность для руководства / IT-отдел ✅ Анализ активности разработчиков и команд ✅ Бэкапы и системы восстановления. Перед восстановлением из бэкапа нужно понять, сколько файлов «живых» было изменено именно в день инцидента. ✅ Цифровая криминалистика и расследования ✅ Личные и креативные кейсы. Фотограф/видеограф: Сколько % всей медиатеки я добавил 10 марта (съёмка на свадьбе)? ✅ Оптимизация хранения и архивации ✅ Мониторинг тестовых/стендовых окружений. В Dev/Test/QA: сколько % конфигов и тестовых данных было изменено после конкретного деплоя. Пример работающего скрипта я привел в данной статье3,23%
  • 7 авг. 2025 г.Задача: Получить адреса 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 и его отключение2,84%
  • 6 дек. 2024 г.Скрипт для удаленной проверки журнала 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 $_" } }2,82%
  • 6 нояб. 2024 г.Тема: Методы определения срока действия пароля пользователя Active Directory В статье рассматриваются методы позволяющие получить дату, когда у пользователя закончится пароль. Умение это делать позволит вам более тонко настроить политику уведомления, улучшить безопасность в домене и в целом прокачать знания по Active Directory. Подробнее про методы получения срока действия пароля у пользователя AD2,18%
  • 2 авг. 2024 г.Тема: Как получить значения 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 Еще больше полезных скриптов можете найти по ссылке2,09%
  • 10 нояб.Тема: Управление включением/Выключением протоколами 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 Подробнее можно почитать в статье2,05%
  • 9 авг. 2024 г.Тема: Как получить список 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/1,95%