# BMW-ноутбук — удалённое подключение и работа с ISTA/E-Sys

**Дата сессии:** 2026-05-21
**Хост:** Windows 10 (build 19044.5011), `WIN-11766DP2106`
**Сеть:** домашний Wi-Fi (`192.168.0.x`, RFC1918, серый IP)
**Учётки:**
- `user` — основной (в `Администраторы`, есть полный токен после ребута)
- `admin` — отдельная учётка, **НЕ в группе** `Администраторы` (миф «я админ»)
- `Администратор` — встроенный, пароль неизвестен

UAC отключён (`EnableLUA=0`). Локализация русская — учитывать в скриптах.

## Что работает для удалённого SSH-доступа

**Финальная связка (проверено на 2026-05-21):**

1. **Win32-OpenSSH portable** на стороне Windows (не DISM!) — github.com/PowerShell/Win32-OpenSSH releases latest. Распаковка в `C:\Tools\OpenSSH-Win64`, запуск `install-sshd.ps1`, `Start-Service sshd`. Обходит баги `Add-WindowsCapability` (`Отказано в доступе` несмотря на админ-токен — DISM/TrustedInstaller иногда залочен).

2. **Pinggy.io free TCP tunnel** для пробивания серой сети — без регистрации:
   ```powershell
   & "C:\Tools\OpenSSH-Win64\ssh.exe" -p 443 -R0:localhost:22 -o StrictHostKeyChecking=no -o ServerAliveInterval=30 tcp@a.pinggy.io
   ```
   Выдаёт URL вида `tcp://xxxx-N-N-N-N.run.pinggy-free.link:PORT`. **Лимит 60 минут**, нужно перезапускать.

3. **Мой публичный ключ** для входа: `~/.ssh/id_ed25519_upterm.pub` (`SHA256:CDxuQDYIQpfVZdWQCqvC77ZPCxRwJD9kSEU+WtRFHPE`). Для админ-юзеров пишется в **`C:\ProgramData\ssh\administrators_authorized_keys`** (НЕ в `~/.ssh/authorized_keys`!), с ACL:
   ```powershell
   icacls $ak /inheritance:r /grant "*S-1-5-32-544:F" "*S-1-5-18:F"
   ```
   (SID вместо имён `Administrators`/`SYSTEM` — locale-safe.)

4. **Я подключаюсь:**
   ```bash
   ssh -i ~/.ssh/id_ed25519_upterm -p PORT user@xxxx.run.pinggy-free.link
   ```

## Что НЕ работает (потерял время, не повторять)

- **bore.pub**: туннель устанавливается, но входящие TCP с моего IP не доходят до клиента. Возможно гео-блок или сетевой ад.
- **serveo.net**: `Warning: remote port forwarding failed for listen port 0` — серверная фигня.
- **upterm**: годится для bootstrap, но PTY-only. Команды через `ssh -tt host "cmd"` ненадёжны:
  - cmd как inner-shell не чистит экран (банер с URL виден). powershell — чистит, URL пропадает.
  - **`\U` и `\a` в путях съедаются PTY как ESC-последовательности** → `C:\Users\admin` → `C:sersser^Gdmin`. Использовать **forward slashes** (`C:/Users/admin/...`).
  - Когда client SSH закрывается с `exit`, inner-shell тоже умирает → upterm host umirает → сессия мертва.
  - Лучше использовать **`Tee-Object` или `-RedirectStandardOutput`** для захвата вывода в файл.

## Windows-админ-токен (грабли)

Симптом: `IsInRole(Administrator) = False`, `whoami /groups` не содержит `S-1-5-32-544`, `Add-WindowsCapability` падает с «Отказано в доступе», хотя `net localgroup Администраторы` показывает юзера в списке.

**Причина:** Юзер добавлен в `Администраторы` уже **после** своего логина. Группа кэшируется в токене на момент логина и не обновляется.

**Лечение:** Перезагрузка **строго через меню «Перезагрузка»** (НЕ «Выключение → включение» из-за Fast Startup, который сохраняет старый токен). Можно сначала `powercfg /h off`. После ребута `IsInRole = True` и можно жить.

С UAC=0 «Run as administrator» **не повышает токен** — повышать нечем, либо ты уже с полным токеном, либо никак.

## Кодировка PowerShell-скриптов

PS читает скрипты в cp1251 (русская Windows) → литеральная кириллица **превращается в мусор**.

**Workaround'ы:**
- Использовать только ASCII-литералы в коде, кириллицу искать через **wildcards** (`'EC-APPS*'`) или **SID** (`*S-1-5-32-544` вместо `'Администраторы'`).
- Передавать скрипт через base64 + `Out-File ASCII`:
  ```powershell
  $b64='...'
  [System.IO.File]::WriteAllText("path.ps1", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($b64)))
  ```
- В SFTP домашка зависит от того, **под каким пользователем запущен sshd**. У нас sshd под `user`, SCP-default `C:/Users/user/`.

## BMW-софт: что где лежит и как чинить

Каноничный путь: `C:\EC-APPS\` (родительская папка для ISTA, E-Sys, INPA, NFS, FSTool2, NCS Dummy, и пр.). При установке `C:\EC-APPS` — стандарт. Переименовывать в `EC-APPS(Старая)` и т.п. → ломает ярлыки и реестр.

### ISTA (4.39.20)
- Главный exe: `C:\EC-APPS\ISTA\TesterGUI\bin\Release\ISTAGUI.exe`
- Главный конфиг: `…\ISTAGUI.exe.config` (XML с `<appSettings>`, все пути относительные `..\..\..\PSdZ\…`)
- **Реестр ПЕРЕОПРЕДЕЛЯЕТ конфиг!** `HKLM\SOFTWARE\WOW6432Node\BMWGroup\ISPI\Rheingold`:
  - `BMW.Rheingold.Programming.PsdzDataPath` — путь к PSdZ-данным. Должно быть `..\..\..\PSdZ\data_swi` (там полные 341 ГБ), не `data` (там частичные 18 ГБ).
  - `BMW.Rheingold.Programming.Enabled` = `True` (иначе кнопки «Обновление ПО»/«Замена ЭБУ» серые).
  - `BMW.Rheingold.Programming.ExpertMode` = `True`.
  - `BMW.Rheingold.OnlineMode`, `TRICZentralActive` = `False` — корректно для standalone offline.
- Также `HKLM\SOFTWARE\WOW6432Node\BMWGroup\ISPI\ISTA\InstallLocation` — должен указывать на актуальную папку.
- Логи: `C:\EC-APPS\ISTA\Logs\<timestamp_guid>\*_IstaOperation.log`. В начале лог пишет резолвленные значения `PsdzConfig`: `PsdzDataPath`, `PsdzBinaryPath`, `PsdzJrePath`, `EdiabasBinPath` — там сразу видно несоответствия.
- PSdZ structure: `bin`/`binx64` (Java JRE-libs ~6 МБ), `host`/`hostx64` (`PsdzServiceHost.exe`, не `PSdZHost.exe`!), `data` (мелкая), `data_swi` (большая, правильная для programming).

### E-Sys (3.35.3)
- `C:\EC-APPS\ESG\E-Sys\E-Sys.bat` (батник-лаунчер) и `E-Sys.exe`. Ярлык на рабочем столе указывает на `.bat`.
- Конфиг: `…\E-Sys\config\`.

### Ediabas
- `C:\Ediabas\Bin\EDIABAS.INI` — главный (общесистемный, путь от env `ediabas_config_dir`).
- `C:\EC-APPS\ISTA\Ediabas\Bin\EDIABAS.INI` — копия для ISTA.
- Ключевые строки: `Interface=REMOTE`, `Port=6801`, `RemoteHost=Autodetect`, `PortDoIP=13400`, `NetworkProtocol=TCP` — стандарт ENET.

### Состояние на 2026-05-21 (после нашей правки)
- `EC-APPS` каноничная (переименовали из `EC-APPS(Старая)`).
- `C:\EC-APPS\ISTA.old` — бэкап 111.7 ГБ (из них 107.7 — SQLiteDBs), можно удалить когда новая ISTA подтверждена.
- `C:\ISTA-P` — **другая программа** (45.4 ГБ), не дубликат, оставлять для старых E-серий.
- Все 4 поправленных реестровых ключа Programming: чисто.

## Что установлено для удалённого доступа

- `C:\Tools\OpenSSH-Win64\` — Win32-OpenSSH portable, sshd как сервис на 22 (auto-start, Private profile, firewall открыт).
- `C:\Tools\bore.exe` — не нужен (не работает с bore.pub), но осталось.
- `C:\ProgramData\ssh\administrators_authorized_keys` — мой ключ.
- Окно `ssh ...pinggy.io` нужно запускать вручную (или сделать scheduled task), туннель сам не поднимается.
- Альтернатива при истечении pinggy: перезапустить ту же команду, новый URL.

## Скрипт быстрого восстановления туннеля (на ноуте)

```powershell
# Поднять pinggy-туннель (60-мин лимит, потом перезапускать)
& "C:\Tools\OpenSSH-Win64\ssh.exe" -p 443 -R0:localhost:22 `
    -o StrictHostKeyChecking=no -o ServerAliveInterval=30 tcp@a.pinggy.io
```

Выведет `tcp://....run.pinggy-free.link:PORT` — этот URL юзер шлёт мне, я подключаюсь.

## Чек-лист «всё ли я админ»

```powershell
[Security.Principal.WindowsPrincipal]::new([Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
whoami /groups | Select-String "S-1-5-32-544"
```

True + найденный SID = да. Иначе → ребут через «Перезагрузка».