54 lines
2.5 KiB
Markdown
54 lines
2.5 KiB
Markdown
# NSIS-установщики: извлечение без прав администратора
|
||
|
||
## Проблема
|
||
Установщики NSIS (Nullsoft Scriptable Install System) требуют прав администратора (UAC elevation).
|
||
Тихая установка (`/S`) без прав возвращает `[WinError 740] Запрошенная операция требует повышения`.
|
||
|
||
## Решение: двухэтапная 7z-экстракция
|
||
|
||
NSIS-установщики содержат:
|
||
1. Заглушку-распаковщик (PE executable)
|
||
2. Вложенный 7z-архив с файлами приложения
|
||
|
||
### Шаг 1: Извлечь внешний контейнер
|
||
```bash
|
||
7z x "Installer.exe" -o"extracted/" -y
|
||
```
|
||
→ Результат: `$PLUGINSDIR/` (NSIS-плагины) и `$R0/` (uninstaller)
|
||
|
||
### Шаг 2: Извлечь вложенный app-64.7z
|
||
В `$PLUGINSDIR/` находится `app-64.7z` — это основной архив приложения.
|
||
```bash
|
||
7z x "extracted/\$PLUGINSDIR/app-64.7z" -o"app/" -y
|
||
```
|
||
|
||
**Важно**: в bash `$` интерпретируется как переменная. Используй Python `subprocess` для избежания экранирования:
|
||
```python
|
||
import subprocess
|
||
subprocess.run([
|
||
r"C:\Program Files\7-Zip\7z.exe", "x",
|
||
r"C:\path\to\extracted\$PLUGINSDIR\app-64.7z",
|
||
"-oC:\path\to\app", "-y"
|
||
])
|
||
```
|
||
|
||
### Шаг 3: Запуск приложения
|
||
После извлечения приложение — это Electron-приложение с `app.exe` в корне.
|
||
```bash
|
||
./app/AppName.exe
|
||
```
|
||
Приложение может запустить автообновление — это нормально.
|
||
|
||
## Пример: LobsterAI
|
||
- Установщик: `LobsterAI-Setup-x64-2026.8.7-official.exe` (244 MB)
|
||
- NSIS-заголовок: offset 405972 (`NullsoftInst`)
|
||
- Вложенный архив: `app-64.7z` (255 MB)
|
||
- После извлечения: 1690 файлов, 443 папки, 1.27 GB
|
||
- Главный исполняемый: `LobsterAI.exe` (214 MB)
|
||
- Electron BrowserWindow с автообновлением
|
||
- Данные: `%APPDATA%/LobsterAI/`
|
||
|
||
## Альтернативы
|
||
- `7z` не установлен: `winget install 7zip` или `choco install 7zip`
|
||
- Если `7z` не находит `$PLUGINSDIR`: используй Python с `subprocess` (не bash)
|
||
- Второй уровень может быть не `7z`, а `zip` — пробуй и тот и другой |