Files
scripts/sergey-filter.ps1

167 lines
13 KiB
PowerShell
Raw 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 минут
1. Частный DNS (работает и дома, и на мобильном интернете)
Настройки -> Сеть и интернет (или «Подключения») -> Частный DNS
(если не видно — в поиске настроек наберите «Частный DNS»)
Выбрать «Имя хоста поставщика частного DNS» и ввести ровно:
1c4d5c7d.d.adguard-dns.com
Нажать «Сохранить».
2. Telegram
Удалить приложение: долгое нажатие на иконку -> Удалить.
MAX не трогаем — он остаётся.
3. Проверка
Открыть в браузере телефона: t.me — должна быть ошибка «не удалось открыть».
Открыть ya.ru — должен открыться как обычно.
Если t.me открывается — Частный DNS не сохранился, повторить шаг 1.
4. Раздача интернета (точка доступа)
Если ноутбук подключён к раздаче с телефона — ноутбук защищён своим фильтром,
ничего дополнительно делать не нужно.
Если сайт закрылся ошибочно (нужный по работе) — напишите Олегу, домен уберём из фильтра.
Первый месяц правки списка бесплатно.
"@
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