<# Установка расширения Vastu Scribe. Скрипт делает ровно одну вещь: разрешает браузеру установить расширение с сервера школы. Для этого он добавляет одну запись в системную политику браузера — там же, где организации перечисляют разрешённые расширения. Что скрипт НЕ делает: ничего не скачивает и не запускает, не меняет настройки системы, не трогает другие расширения, не выходит в интернет. Строка, которая попадёт в реестр, показана ниже и печатается на экран. Всё происходящее дублируется в install-log.txt рядом с этим файлом — чтобы при любой ошибке было что показать. Удаление: uninstall.bat рядом. #> # Кодировка вывода: без этого русский текст в консоли превращается в мусор. try { [Console]::OutputEncoding = [Text.Encoding]::UTF8 $OutputEncoding = [Text.Encoding]::UTF8 } catch { } $ExtensionId = 'hmkdgelfnjbmbmpnihlmjiebacmdobgk' $UpdateUrl = 'https://scribe.vastubase.store/ext/updates.xml' $Entry = "$ExtensionId;$UpdateUrl" $LogPath = Join-Path $PSScriptRoot 'install-log.txt' "=== Vastu Scribe, установка, $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ===" | Out-File -FilePath $LogPath -Encoding UTF8 function Say { param([string]$Text, [string]$Color = 'Gray') Write-Host " $Text" -ForegroundColor $Color " $Text" | Out-File -FilePath $LogPath -Encoding UTF8 -Append } function Note { param([string]$Text) " # $Text" | Out-File -FilePath $LogPath -Encoding UTF8 -Append } $Browsers = @( @{ Name = 'Google Chrome'; Policy = 'HKLM:\SOFTWARE\Policies\Google\Chrome'; Marker = 'Google\Chrome\Application\chrome.exe' } @{ Name = 'Яндекс.Браузер'; Policy = 'HKLM:\SOFTWARE\Policies\YandexBrowser'; Marker = 'Yandex\YandexBrowser\Application\browser.exe' } @{ Name = 'Microsoft Edge'; Policy = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge'; Marker = 'Microsoft\Edge\Application\msedge.exe' } ) # Ищем браузер по обычным местам установки. Раньше здесь был рекурсивный обход # Program Files — он подолгу висел и сыпал ошибками доступа. function Find-Browser { param([string]$Marker) $roots = @($env:ProgramFiles, ${env:ProgramFiles(x86)}, $env:LocalAppData) | Where-Object { $_ } foreach ($root in $roots) { $candidate = Join-Path $root $Marker if (Test-Path $candidate) { return $candidate } } return $null } Write-Host "" Write-Host " Vastu Scribe — установка расширения" -ForegroundColor White Write-Host " ====================================" Write-Host "" Say "Что будет сделано: в политику браузера добавится одна строка —" Say $Entry 'DarkGray' Say "по ней браузер сам скачает расширение с сервера школы." Write-Host "" Note "PowerShell $($PSVersionTable.PSVersion), ОС $([Environment]::OSVersion.VersionString)" # --- права администратора -------------------------------------------------- # Политика браузера лежит в разделе реестра, общем для всей машины, — писать # туда может только администратор. Это единственная причина запроса прав. $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal($identity) if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Say "Нужны права администратора — запрашиваю их." 'Yellow' Say "Откроется окно подтверждения Windows, нажми «Да»." Note "перезапуск с повышением прав" Start-Sleep -Seconds 1 try { Start-Process powershell.exe -Verb RunAs -ArgumentList @( '-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', "`"$PSCommandPath`"" ) -ErrorAction Stop } catch { Say "Не удалось получить права администратора: $($_.Exception.Message)" 'Red' Say "Запусти install.bat правой кнопкой → «Запуск от имени администратора»." Read-Host " Нажми Enter" } exit 0 } Note "права администратора есть" # --- установка ------------------------------------------------------------- $installed = 0 $problems = 0 foreach ($browser in $Browsers) { $name = $browser.Name $path = Find-Browser $browser.Marker if (-not $path) { Say "$name : не установлен, пропускаю" 'DarkGray' Note "$name не найден по стандартным путям" continue } Note "$name найден: $path" try { $listKey = Join-Path $browser.Policy 'ExtensionInstallForcelist' if (-not (Test-Path $listKey)) { New-Item -Path $listKey -Force -ErrorAction Stop | Out-Null Note "создан раздел $listKey" } # В списке могут быть чужие расширения — затирать их нельзя. Ищем либо # нашу прежнюю запись, либо первый свободный номер. $existing = Get-ItemProperty -Path $listKey -ErrorAction SilentlyContinue $slot = $null $already = $false for ($i = 1; $i -le 50; $i++) { $value = $null if ($existing) { $property = $existing.PSObject.Properties[[string]$i] if ($property) { $value = $property.Value } } if ([string]::IsNullOrEmpty($value)) { if (-not $slot) { $slot = $i } } elseif ($value -like "$ExtensionId*") { $slot = $i $already = $true break } } if (-not $slot) { Say "$name : список расширений заполнен, пропускаю" 'Yellow' $problems++ continue } Set-ItemProperty -Path $listKey -Name ([string]$slot) -Value $Entry -Type String -ErrorAction Stop # Проверяем, что запись действительно легла: молчаливый успех здесь # обманчив, а разбираться потом придётся вслепую. $check = (Get-ItemProperty -Path $listKey).PSObject.Properties[[string]$slot].Value if ($check -ne $Entry) { Say "$name : запись не сохранилась" 'Red' Note "ожидали '$Entry', в реестре '$check'" $problems++ continue } $installed++ if ($already) { Say "$name : запись обновлена" 'Green' } else { Say "$name : установлено" 'Green' } Note "$listKey значение $slot = $Entry" } catch { Say "$name : ошибка — $($_.Exception.Message)" 'Red' Note "исключение: $($_.Exception.GetType().FullName) $($_.Exception.Message)" $problems++ } } Write-Host "" if ($installed -eq 0 -and $problems -eq 0) { Say "Ни одного поддерживаемого браузера не нашлось." 'Yellow' Say "Подходят Google Chrome, Яндекс.Браузер и Microsoft Edge." Say "Если браузер стоит в необычном месте, напиши администратору." } elseif ($installed -eq 0) { Say "Установить не удалось. Подробности выше и в файле install-log.txt" 'Red' Say "Отправь этот файл администратору — по нему сразу видно причину." } else { Write-Host " Готово. Осталось два шага:" -ForegroundColor White Write-Host "" Write-Host " 1. Полностью закрой браузер и открой заново." Say " Именно закрой все окна, а не сверни. Расширение появится" Say " в течение минуты после запуска." Write-Host "" Write-Host " 2. Нажми на иконку расширения, открой «Настройки»" Say " и вставь выданный тебе токен." if ($problems -gt 0) { Write-Host "" Say "С частью браузеров были заминки — смотри install-log.txt" 'Yellow' } } Write-Host "" Say "Журнал: $LogPath" 'DarkGray' Write-Host ""