Enrol Chrome from the installers, and drop load-unpacked

Both setup scripts ended by telling you to load the folder unpacked, which is
the one install that cannot update itself - and the policy install they moved
to next does nothing on an unmanaged machine. Enrolment is the step that
actually matters: with it, the extension arrives from the Admin console already
force-installed, and there is nothing else to configure on the box.

So step 7 now asks for an enrolment token instead. The Windows script elevates
itself for it - the token is machine-scoped, and that is the only UAC prompt in
the whole install.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Brandon Li
2026-08-31 16:14:14 -05:00
co-authored by Claude Opus 5
parent 95c073d4c2
commit 35dd15d584
4 changed files with 82 additions and 56 deletions
+15 -16
View File
@@ -126,30 +126,29 @@ Automations are declared in `lib/automations.ts` — one entry per firm, with th
steps inside. Adding a button means editing that file; the page and the runner
pick it up from the server.
### 1. Load the extension
### 1. Install the extension
`chrome://extensions` → enable **Developer mode** → **Load unpacked** →
select the `extension` folder.
That is the development install. On a machine that just runs trades, install it
from our own update server instead, and Chrome keeps it updated by itself — the
setup scripts offer this as their last step, and it can be run on its own at any
time:
The setup scripts do this as their last step: give them the Chrome Enterprise
Core enrolment token from the Admin console (Devices → Chrome → Managed
browsers) and they enrol this machine's Chrome. The extension then arrives from
the console already set to force install, and Chrome keeps it updated. Run on
its own at any time:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install-extension-policy.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\enroll-chrome-management.ps1 -Token <token>
```
```bash
sudo scripts/install-extension-policy.sh
sudo scripts/enroll-chrome-management.sh <token>
```
**This only works on an enterprise-managed machine** — domain-joined,
Entra-joined, or enrolled in Chrome Enterprise Core. No Chromium browser will
force-install an off-store extension on an ordinary PC, whatever the registry
says; the scripts check and refuse rather than leave a dead policy behind. On an
unmanaged box, load `extension/` unpacked and let it reload itself. See
[deploy/README.md](deploy/README.md). Either way the extension notices when
**Enrolment is not optional.** No Chromium browser will force-install an
off-store extension on an unmanaged machine, whatever the registry says — it
reads the policy and blanks it. Enrolling is what makes Chrome managed without
joining a domain; Edge cannot be used this way at all. `install-extension-policy`
is still there for a genuinely domain-joined machine, where local policy is
honoured. See [deploy/README.md](deploy/README.md). Either way the extension
notices when
the dashboard is running newer code than it is: a policy install asks Chrome to
fetch the new CRX, an unpacked one reloads itself from disk. Clicking the reload
icon on its card still works and is the thing to try when something looks
+24 -2
View File
@@ -30,7 +30,11 @@ param(
[switch]$Mandatory,
[Parameter(Mandatory = $true, ParameterSetName = 'Remove')]
[switch]$Remove
[switch]$Remove,
# Fail instead of asking for elevation. Also the loop-breaker: the elevated
# copy is launched with this set, so it can never spawn another.
[switch]$NoElevate
)
$ErrorActionPreference = 'Stop'
@@ -38,7 +42,25 @@ $ErrorActionPreference = 'Stop'
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
if (-not ([Security.Principal.WindowsPrincipal]$identity).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw 'Run this from an elevated PowerShell — the enrolment token is machine-level.'
if ($NoElevate) {
throw 'Run this from an elevated PowerShell — the enrolment token is machine-level.'
}
# Relaunch elevated rather than making the caller do it. setup-windows.bat
# runs unelevated on purpose — nothing else it does needs admin — so this is
# the one UAC prompt in the whole install, and it is raised here where the
# arguments are already parsed and can be passed on intact.
Write-Host 'Asking for administrator rights — the enrolment token is machine-level.'
$psArgs = @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', "`"$PSCommandPath`"", '-NoElevate')
if ($Remove) { $psArgs += '-Remove' }
else {
$psArgs += @('-Token', $Token)
if ($Mandatory) { $psArgs += '-Mandatory' }
}
$elevated = Start-Process -FilePath (Get-Process -Id $PID).Path -Verb RunAs -Wait -PassThru `
-ArgumentList $psArgs
exit $elevated.ExitCode
}
$key = 'HKLM:\SOFTWARE\Policies\Google\Chrome'
+18 -15
View File
@@ -141,22 +141,25 @@ else
fi
# ── 7. extension ────────────────────────────────────────────────────────────
# Chrome refuses to side-load a CRX and will not update an unpacked folder, so
# the extension goes in the way a self-hosted one has to: a managed-policy file
# naming our update server. That lives under /etc, hence sudo — there is no
# per-user equivalent on Linux.
# Chrome will not update an unpacked folder, and only force-installs an off-store
# extension on a managed browser. Enrolling in Chrome Enterprise Core is what
# makes this machine's Chrome managed; the extension then arrives from the Admin
# console already set to force install. The token file lives under /etc, hence
# sudo.
echo
info "[7/7] Chrome extension"
info " Installs it from the update server and lets Chrome keep it current"
info " by itself. Needs sudo - the policy file lives under /etc."
read -r -p " Set this up now? [Y/n] " DOEXT
info " Enrols this machine's Chrome, after which the extension installs"
info " itself from the Admin console and stays updated on its own."
info " The token is in the Admin console under Devices > Chrome >"
info " Managed browsers. Blank to skip."
read -r -p " Enrollment token: " ENROLTOKEN
EXTPOLICY=0
if [ "${DOEXT,,}" != "n" ]; then
if sudo bash scripts/install-extension-policy.sh; then EXTPOLICY=1; else
warn "extension policy failed - load $TARGET/extension unpacked for now"
if [ -n "${ENROLTOKEN:-}" ]; then
if sudo bash scripts/enroll-chrome-management.sh "$ENROLTOKEN"; then EXTPOLICY=1; else
warn "enrolment failed - re-run: sudo scripts/enroll-chrome-management.sh <token>"
fi
else
info " Skipped. Run: sudo scripts/install-extension-policy.sh"
info " Skipped. Run: sudo scripts/enroll-chrome-management.sh <token>"
fi
# ── summary ─────────────────────────────────────────────────────────────────
@@ -179,11 +182,11 @@ fi
echo
info "Still manual:"
if [ "$EXTPOLICY" -eq 1 ]; then
info " - Restart Chrome, and remove any unpacked copy of the extension"
info " (it shares the same id now, and Chrome will not load both)"
info " - Restart Chrome. chrome://management should name your organisation,"
info " and the extension installs itself within a minute or two."
else
info " - Load the Chrome extension: chrome://extensions -> Developer mode"
info " -> Load unpacked -> $TARGET/extension"
info " - Enrol Chrome so it can install the extension:"
info " sudo scripts/enroll-chrome-management.sh <token>"
fi
info " - Add your firm credentials on the dashboard's Settings page"
if [ -n "${WAYLAND_DISPLAY:-}" ] && [ -z "${DISPLAY:-}" ]; then
+25 -23
View File
@@ -325,23 +325,27 @@ set "AUTOSTART=0"
:autostart_done
REM ------------------------------------------------------- extension policy
REM Chrome refuses to side-load a CRX and will not update an unpacked folder, so
REM the extension is installed the way a self-hosted one has to be: a policy
REM entry naming our update server. Written to this user's hive, which needs no
REM elevation - install-extension-policy.ps1 -Scope Machine covers every account.
REM ------------------------------------------------------------ extension
REM Chrome refuses to side-load a CRX and will not update an unpacked folder, and
REM it only force-installs an off-store extension on a managed browser. Enrolling
REM in Chrome Enterprise Core is what makes this machine's Chrome managed; the
REM extension itself then arrives from the Admin console, already set to force
REM install, with nothing further to configure here.
echo.
echo [7/7] Browser extension
echo Installs it from the update server into whichever of Chrome, Edge
echo and Brave are present, and lets them keep it current by themselves.
echo No administrator rights needed.
set "DOEXT="
set /p "DOEXT= Set this up now? [Y/n] "
if /i "%DOEXT%"=="n" goto :ext_skipped
powershell -NoProfile -ExecutionPolicy Bypass -File "%TARGET%\scripts\install-extension-policy.ps1"
echo [7/7] Chrome extension
echo Enrols this machine's Chrome, after which the extension installs
echo itself from the Admin console and stays updated on its own.
echo The token is in the Admin console under
echo Devices ^> Chrome ^> Managed browsers. Blank to skip.
set "ENROLTOKEN="
set /p "ENROLTOKEN= Enrollment token: "
if not defined ENROLTOKEN goto :ext_skipped
REM The token is machine-scoped, so this raises a UAC prompt and only this. The
REM script asks for elevation itself; nothing else in this installer needs it.
powershell -NoProfile -ExecutionPolicy Bypass -File "%TARGET%\scripts\enroll-chrome-management.ps1" -Token "%ENROLTOKEN%"
if errorlevel 1 (
echo [!] Extension policy failed. Load %TARGET%\extension unpacked for now,
echo and re-run scripts\install-extension-policy.ps1 to try again.
echo [!] Enrolment failed. Re-run scripts\enroll-chrome-management.ps1 with
echo a fresh token from the Admin console to try again.
set "EXTPOLICY=0"
) else (
set "EXTPOLICY=1"
@@ -349,8 +353,8 @@ if errorlevel 1 (
goto :ext_done
:ext_skipped
echo Skipped. Run scripts\install-extension-policy.ps1 later, or load
echo %TARGET%\extension unpacked and reload it by hand after updates.
echo Skipped. Run scripts\enroll-chrome-management.ps1 -Token ^<token^>
echo later; until then this machine gets no extension.
set "EXTPOLICY=0"
:ext_done
@@ -392,13 +396,11 @@ echo Handy : pm2 list ^| pm2 logs autofirmer ^| pm2 logs clicker
echo.
echo Still manual:
if "%EXTPOLICY%"=="1" (
echo - Restart Chrome, and remove any unpacked copy of the extension
echo ^(it shares the same id now, and Chrome will not load both^)
echo - Restart Chrome. chrome://management should name your organisation,
echo and the extension installs itself within a minute or two.
) else (
echo - Load the Chrome extension: chrome://extensions, enable Developer
echo mode, "Load unpacked", select %TARGET%\extension
echo ^(loaded that way it reloads itself from disk after a pull;
echo the policy install lets Chrome update it properly^)
echo - Enrol Chrome so it can install the extension:
echo scripts\enroll-chrome-management.ps1 -Token ^<token^>
)
echo - Add your firm credentials on the dashboard's Settings page
echo.