Files
scripts/sergey-filter.ps1

193 lines
15 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# sergey-filter.ps1 — фильтр контента на Windows: AdGuard DNS (DoH) + браузеры без своего DoH + hosts + удаление Telegram + запрет запуска (MAX НЕ трогаем — нужен клиенту, 16.09)
# Запуск (PowerShell от администратора), ПЕРЕД запуском задать ID профиля AdGuard DNS:
# $AGID='abcdef'; [Net.ServicePointManager]::SecurityProtocol='Tls12'; irm https://git.dttb.ru/oleg/scripts/raw/branch/main/sergey-filter.ps1 | iex
# Откат: $UNDO=1; ... | iex — снимает политики DNS/браузеров, hosts и запреты запуска (программы не восстанавливает)
# Вернуть MAX после старой версии скрипта: $RESTORE_MAX=1; ... | iex — убирает max.ru из hosts и Max.exe из запретов (сам MAX переустановить с max.ru)
$ErrorActionPreference = 'Continue'
if (-not $AGID -and -not $UNDO -and -not $RESTORE_MAX) { Write-Host 'Не задан $AGID (ID профиля AdGuard DNS). Пример: $AGID=''abcdef''' -ForegroundColor Red; return }
$DohTemplate = "https://d.adguard-dns.com/dns-query/$AGID"
$DnsIPs = @('94.140.14.49','94.140.14.59') # IP приватного профиля AdGuard (d.adguard-dns.com), не публичные .14/.15
$BlockDomains = @('telegram.org','www.telegram.org','desktop.telegram.org','t.me','telegram.me','web.telegram.org','tdesktop.com','telegram.dog')
$BlockExe = @('Telegram.exe','Unigram.exe')
function Step($t){ Write-Host "`n=== $t ===" -ForegroundColor Cyan }
function RegSet($path,$name,$value,$type='DWord'){ if(-not (Test-Path $path)){ New-Item -Path $path -Force | Out-Null }; New-ItemProperty -Path $path -Name $name -Value $value -PropertyType $type -Force | Out-Null; Write-Host " $path\$name = $value" }
$os = Get-CimInstance Win32_OperatingSystem
$build = [int]$os.BuildNumber
$isPro = $os.Caption -notmatch 'Home|Домашняя'
Step "Система"
Write-Host " $($os.Caption) build $build ($(if($isPro){'Pro-ветка: SRP доступен'}else{'Home: только DisallowRun'}))"
if ($RESTORE_MAX) {
Step "ВЕРНУТЬ MAX"
$h = "$env:SystemRoot\System32\drivers\etc\hosts"; (Get-Content $h) | Where-Object { $_ -notmatch 'max\.ru|oneme\.ru' } | Set-Content $h -Encoding ASCII; ipconfig /flushdns | Out-Null
$dr = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun'
if(Test-Path $dr){ Get-ItemProperty $dr | ForEach-Object { $_.PSObject.Properties } | Where-Object { $_.Value -match '^Max\.exe$' } | ForEach-Object { Remove-ItemProperty $dr -Name $_.Name -EA SilentlyContinue } }
Get-ChildItem 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\0\Paths' -EA SilentlyContinue | Where-Object { (Get-ItemProperty $_.PSPath).ItemData -match '^Max\.exe$' } | Remove-Item -Recurse -Force
Write-Host "hosts и запреты для MAX сняты. MAX переустановить с max.ru (ссылка «Скачать для Windows»)." -ForegroundColor Green; return
}
if ($UNDO) {
Step "ОТКАТ"
Remove-Item 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient' -Recurse -Force -EA SilentlyContinue
foreach($k in 'HKLM:\SOFTWARE\Policies\Google\Chrome','HKLM:\SOFTWARE\Policies\Microsoft\Edge','HKLM:\SOFTWARE\Policies\YandexBrowser','HKLM:\SOFTWARE\Policies\Mozilla\Firefox'){
foreach($n in 'DnsOverHttpsMode','BuiltInDnsClientEnabled','ForceGoogleSafeSearch','ForceYouTubeRestrict'){ Remove-ItemProperty $k -Name $n -EA SilentlyContinue } }
Remove-Item 'HKLM:\SOFTWARE\Policies\Mozilla\Firefox\DNSOverHTTPS' -Recurse -Force -EA SilentlyContinue
Remove-Item 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Safer' -Recurse -Force -EA SilentlyContinue
Remove-Item 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun' -Recurse -Force -EA SilentlyContinue
Remove-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Name DisallowRun -EA SilentlyContinue
$h = "$env:SystemRoot\System32\drivers\etc\hosts"; (Get-Content $h) | Where-Object { $_ -notmatch '# sergey-filter' } | Set-Content $h -Encoding ASCII
Get-NetAdapter -Physical | Where-Object Status -eq 'Up' | ForEach-Object { Set-DnsClientServerAddress -InterfaceIndex $_.ifIndex -ResetServerAddresses }
Write-Host "Откат выполнен. Перезагрузить." -ForegroundColor Green; return
}
Step "1. DNS системы → AdGuard DNS"
$adapters = Get-NetAdapter -Physical | Where-Object Status -eq 'Up'
foreach($a in $adapters){ Set-DnsClientServerAddress -InterfaceIndex $a.ifIndex -ServerAddresses $DnsIPs; Write-Host " $($a.Name): $($DnsIPs -join ', ')" }
if ($build -ge 22000) {
foreach($ip in $DnsIPs){
Remove-DnsClientDohServerAddress -ServerAddress $ip -EA SilentlyContinue
Add-DnsClientDohServerAddress -ServerAddress $ip -DohTemplate $DohTemplate -AllowFallbackToUdp $false -AutoUpgrade $true | Out-Null
Write-Host " DoH: $ip → $DohTemplate"
}
# Политика: DoH обязателен (3). Если DoH недоступен — DNS не работает, это осознанно (иначе фильтр обходится сменой DNS).
RegSet 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient' 'DoHPolicy' 3
} else {
Write-Host " Windows 10: системного DoH нет. Стоит обычный DNS AdGuard (публичный, без профиля!)." -ForegroundColor Yellow
Write-Host " Для профиля на Win10 нужен AdGuard DNS Client или привязка IP (Linked IP) в панели — решить вручную." -ForegroundColor Yellow
}
Step "2. Браузеры: свой DoH выключен, SafeSearch принудительно"
foreach($k in 'HKLM:\SOFTWARE\Policies\Google\Chrome','HKLM:\SOFTWARE\Policies\Microsoft\Edge','HKLM:\SOFTWARE\Policies\YandexBrowser'){
RegSet $k 'DnsOverHttpsMode' 'off' 'String'
RegSet $k 'BuiltInDnsClientEnabled' 0
RegSet $k 'ForceGoogleSafeSearch' 1
RegSet $k 'ForceYouTubeRestrict' 1
}
RegSet 'HKLM:\SOFTWARE\Policies\Mozilla\Firefox\DNSOverHTTPS' 'Enabled' 0
RegSet 'HKLM:\SOFTWARE\Policies\Mozilla\Firefox\DNSOverHTTPS' 'Locked' 1
$opera = Get-ChildItem "$env:LOCALAPPDATA\Programs\Opera*","$env:APPDATA\Opera Software" -EA SilentlyContinue
if($opera){ Write-Host " ВНИМАНИЕ: найден Opera — политиками не управляется, встроенный VPN обходит фильтр. Удалить вручную." -ForegroundColor Yellow }
Step "3. hosts: веб-версии и загрузка Telegram"
$h = "$env:SystemRoot\System32\drivers\etc\hosts"
$cur = Get-Content $h -EA SilentlyContinue
$add = $BlockDomains | Where-Object { $d=$_; -not ($cur | Where-Object { $_ -match "\s$([regex]::Escape($d))(\s|$)" }) } | ForEach-Object { "0.0.0.0 $_ # sergey-filter" }
if($add){ Add-Content $h -Value $add -Encoding ASCII; Write-Host " добавлено $($add.Count) записей" } else { Write-Host " уже есть" }
ipconfig /flushdns | Out-Null
Step "4. Удаление Telegram"
Get-Process | Where-Object { $_.Name -match '^(Telegram|Unigram)$' } | Stop-Process -Force -EA SilentlyContinue
$unins = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' -EA SilentlyContinue |
Where-Object { $_.DisplayName -match '^Telegram' }
foreach($u in $unins){
Write-Host " найдено: $($u.DisplayName) → $($u.UninstallString)"
$cmd = $u.QuietUninstallString; if(-not $cmd){ $cmd = $u.UninstallString }
if($cmd -match 'unins\d*\.exe'){ $cmd = "$cmd /VERYSILENT /NORESTART" }
elseif($cmd -match 'Update\.exe.*--uninstall'){ $cmd = "$cmd -s" }
elseif($cmd -match 'msiexec'){ $cmd = ($cmd -replace '/I','/X') + ' /qn /norestart' }
try { cmd /c "$cmd" | Out-Null; Write-Host " выполнено: $cmd" } catch { Write-Host " ошибка, удалить вручную: $cmd" -ForegroundColor Yellow }
}
if(-not $unins){ Write-Host " в списке программ не найдено" }
$appx = Get-AppxPackage -AllUsers | Where-Object { $_.Name -match 'Telegram|Unigram' }
foreach($p in $appx){ Write-Host " Store-пакет: $($p.Name)"; Remove-AppxPackage -Package $p.PackageFullName -AllUsers -EA SilentlyContinue }
# Портативные остатки
foreach($d in "$env:APPDATA\Telegram Desktop"){
if(Test-Path $d){ Remove-Item $d -Recurse -Force -EA SilentlyContinue; Write-Host " удалена папка $d" } }
$left = Get-ChildItem "$env:USERPROFILE","$env:ProgramFiles","${env:ProgramFiles(x86)}" -Recurse -Include $BlockExe -EA SilentlyContinue -Depth 4 | Select-Object -Expand FullName
if($left){ Write-Host " ОСТАЛИСЬ exe (удалить вручную):" -ForegroundColor Yellow; $left | ForEach-Object { Write-Host " $_" } }
Step "5. Запрет запуска"
$dr = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer'
RegSet $dr 'DisallowRun' 1
if(-not (Test-Path "$dr\DisallowRun")){ New-Item "$dr\DisallowRun" -Force | Out-Null }
$i=1; foreach($e in $BlockExe){ New-ItemProperty "$dr\DisallowRun" -Name $i -Value $e -PropertyType String -Force | Out-Null; $i++ }
Write-Host " DisallowRun: $($BlockExe -join ', ')"
if($isPro){
$safer = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers'
RegSet $safer 'DefaultLevel' 262144 # Unrestricted
RegSet $safer 'TransparentEnabled' 1
RegSet $safer 'PolicyScope' 0
RegSet $safer 'AuthenticodeEnabled' 0
RegSet $safer 'ExecutableTypes' @('ADE','ADP','BAS','BAT','CHM','CMD','COM','CPL','CRT','EXE','HLP','HTA','INF','INS','ISP','LNK','MDB','MDE','MSC','MSI','MSP','MST','OCX','PCD','PIF','REG','SCR','SHS','URL','VB','WSC') 'MultiString'
foreach($e in $BlockExe){
$g = "{$([guid]::NewGuid().ToString())}"
$p = "$safer\0\Paths\$g"
RegSet $p 'ItemData' $e 'ExpandString'
RegSet $p 'SaferFlags' 0
RegSet $p 'Description' 'sergey-filter' 'String'
}
Write-Host " SRP (Disallowed по имени файла) добавлен — действует после перезагрузки/перелогина"
}
Step "6. Инструкция для телефона на рабочем столе"
$txt = @"
НАСТРОЙКА ФИЛЬТРА НА ТЕЛЕФОНЕ (Android) — 5 минут, 3 шага
=============================================================
ШАГ 1. ЧАСТНЫЙ DNS (главное, работает и дома, и на мобильном интернете)
-----------------------------------------------------------------------
Самый простой способ найти пункт: открыть «Настройки», вверху в строке
поиска набрать слово DNS и выбрать «Частный DNS» (Private DNS).
Если поиска нет, где лежит пункт на разных телефонах:
• Samsung: Настройки → Подключения → Другие настройки → Частный DNS
• Xiaomi / Redmi / POCO: Настройки → Подключение и общий доступ → Частный DNS
• Huawei / Honor: Настройки → Мобильная сеть → Частный DNS
(или: Настройки → Другие соединения → Частный DNS)
• realme / OPPO / OnePlus: Настройки → Подключение и общий доступ → Частный DNS
• Google Pixel, чистый Android: Настройки → Сеть и интернет → Частный DNS
В открывшемся окне выбрать третий вариант:
«Имя хоста поставщика частного DNS» (Private DNS provider hostname)
и ввести ровно, маленькими буквами, без пробелов и без https:
1c4d5c7d.d.adguard-dns.com
Нажать «Сохранить».
Как понять, что получилось: открыть в браузере телефона адрес t.me
Должна быть ошибка «не удалось открыть страницу». Если t.me открывается,
имя введено с ошибкой или не сохранилось — повторить шаг 1.
Обычные сайты (ya.ru, gosuslugi.ru) должны открываться как раньше.
ШАГ 2. УДАЛИТЬ TELEGRAM
-----------------------
Долгое нажатие на иконку Telegram → «Удалить» (или «Информация о приложении» → «Удалить»).
MAX не трогаем — он остаётся и работает как обычно.
ШАГ 3. ПРОВЕРКА
---------------
• t.me — ошибка, не открывается
• ya.ru — открывается
• Раздача интернета с телефона на ноутбук: ничего дополнительно делать не нужно,
ноутбук защищён своим фильтром.
ЕСЛИ ЧТО-ТО ПОШЛО НЕ ТАК
------------------------
• Пункта «Частный DNS» нет вообще — телефон старше Android 9, напишите Олегу,
решим по-другому.
• После настройки не открывается нужный по работе сайт — пришлите Олегу его адрес,
уберём из фильтра. Первый месяц правки бесплатно.
• Пропал интернет на телефоне совсем — зайти в «Частный DNS» и проверить,
что имя введено без ошибок: 1c4d5c7d.d.adguard-dns.com
"@
foreach($dt in "$env:USERPROFILE\Desktop","$env:PUBLIC\Desktop"){
if(Test-Path $dt){ [IO.File]::WriteAllText("$dt\Настройка телефона.txt", $txt, [Text.Encoding]::UTF8); Write-Host " записано: $dt\Настройка телефона.txt"; break }
}
Step "7. Проверка"
if($build -ge 22000){ Get-DnsClientDohServerAddress | Format-Table -AutoSize | Out-String | Write-Host }
foreach($d in 'pornhub.com','t.me','web.telegram.org','ya.ru','web.max.ru'){
try { $r = Resolve-DnsName $d -Type A -EA Stop | Select-Object -First 1 -Expand IPAddress } catch { $r = 'NXDOMAIN/ошибка' }
Write-Host (" {0,-14} → {1}" -f $d, $r)
}
Write-Host "`nОжидание: pornhub/t.me/web.telegram.org → 0.0.0.0 или пусто; ya.ru и web.max.ru → реальный IP (MAX не блокируем)." -ForegroundColor Green
Write-Host "Дальше: перезагрузка, затем проверить в браузере и в режиме раздачи с телефона." -ForegroundColor Green