Установка на одну машину
Что нужно заранее
- Пакет
LaPortaUsb.msi(64-разрядный). - Файл политики на этой же машине — его надо завести до установки, см. ниже.
Ловушка POLICYPATH. Это обязательный параметр установки. Если его не передать,
служба идёт на путь по умолчанию — \\server\laportausb$\policy.json, которого
на одиночной машине нет. Файл не находится, и служба уходит в запасной режим:
политика недоступна, значит разрешено всё. Установка руками на этом останавливается
с предупреждением и не ставит ничего. Тихая установка (/qn) предупреждения
не показывает вовсе и проходит до конца — условие установщика пропускает её, чтобы
раскатка групповой политикой не спотыкалась.
Так и получается машина, на которой программа стоит, а не запрещено ничего: ставили
ради запрета, вышло прямо противоположное. Поэтому команда установки в этом документе
всегда указывает POLICYPATH с локальным путём.
Заведите файл политики
До установки. Без этого файла служба запустится в запасном режиме и не запретит ничего — установщик его не создаёт и о его отсутствии не предупреждает.
Создайте каталог и положите в него policy.json. Путь может быть любым; здесь и дальше
в документе — C:\ProgramData\LaPortaUsb\policy.json. Это не каталог данных самой
программы (C:\ProgramData\LaPorta USB), их легко перепутать.
Самая простая политика, запрещающая флешки и внешние диски:
{
"version": 1,
"enforcement_mode": "enforce",
"defaults": { "flash": "block", "external_hdd": "block" }
}
Поле version обязано быть больше нуля и расти при каждой правке — по нему служба
узнаёт, что файл сменился. Значение audit вместо enforce даёт режим наблюдения:
решения принимаются и пишутся в журнал, но не применяются. Разрешить отдельные
носители, поставить метку «только чтение», настроить срок хранения журнала — всё это
в policy-reference.md.
Закройте файл от того, кого он ограничивает. Каталог, созданный обычным
пользователем в C:\ProgramData, оставляет этому же пользователю полный доступ: он
сможет открыть policy.json и разрешить себе всё. Оставьте право на запись только
администраторам и системной учётной записи, пользователям — чтение:
icacls "C:\ProgramData\LaPortaUsb" /inheritance:r /grant "*S-1-5-18:(OI)(CI)F" "*S-1-5-32-544:(OI)(CI)F" "*S-1-5-32-545:(OI)(CI)R"
Учётные записи заданы известными кодами, а не именами: имена встроенных групп
переведены, и на английской Windows «Администраторы» команду уронят. Проверить,
что вышло: icacls "C:\ProgramData\LaPortaUsb\policy.json" — у группы пользователей
должно остаться только чтение.
Установка пакета
msiexec /i LaPortaUsb.msi POLICYPATH="C:\ProgramData\LaPortaUsb\policy.json" /qn /l*v install.log
Пакет может быть подписан кодовой подписью или не подписан. Если не подписан — при первом запуске компонентов Windows SmartScreen предупредит о неизвестном издателе; это ожидаемо, установку можно продолжить.
Где хранится путь к политике
Путь из POLICYPATH записывается в реестр (HKLM\SOFTWARE\LaPortaUsb\PolicyPath),
откуда его читают и служба, и окно администратора. Реестр выбран не просто для порядка:
диспетчер служб кэширует блок окружения, и служба, запущенная установщиком сразу после
установки, переменную среды могла бы не увидеть — поэтому путь передаётся не через неё,
а через параметр установки.
Чтобы сменить путь к политике на уже установленной машине, задайте POLICYPATH заново
при восстановлении пакета (msiexec /i ... POLICYPATH=... REINSTALL=ALL REINSTALLMODE=amus) и перезапустите службу.
Проверка: запрет работает
Вставьте носитель в USB-порт и убедитесь, что буква диска не появилась (при правиле
«только чтение» — что носитель доступен без возможности записи). В журнале программы
должна появиться запись с принятым решением. Разбор видов записей и полей —
в journal-reference.md.
Политику служба перечитывает сама, опросом раз в пять минут, — перезапускать её
после правки файла не нужно. В журнале это видно парой: policy_reloaded с новой
версией, следом enforced с applied: true. Рядом появится detach через считаные
миллисекунды — это не извлечение носителя, а исчезновение отключённого узла.
Смена версии
Новая версия ставится тем же пакетом (файлом LaPortaUsb.msi новой сборки) с тем же
кодом обновления (UpgradeCode) и увеличенной версией — командой установки, как при
первой установке:
msiexec /i LaPortaUsb.msi POLICYPATH="C:\ProgramData\LaPortaUsb\policy.json" /qn /l*v install.log
POLICYPATH указывает на тот же локальный путь, что и при первой установке. Отдельно
удалять прежнюю версию перед этим не нужно: совпадающий UpgradeCode и увеличенная
версия заставляют Windows Installer снять старую версию и поставить новую в рамках
одной команды — это обновление, а не удаление с последующей установкой руками и не
подмена файлов в каталоге программы.
Подмена файлов вместо запуска пакета опасна: учёт отключённых узлов живёт в
%ProgramData%\LaPorta USB\disabled-nodes.json и хранит вместе с узлом класс носителя.
Формат прежних версий новая служба читает, обратно — нет. Подмена файлов на прежнюю
версию оставит машину с записями, которых та не понимает: отключённые узлы останутся
отключёнными, а служба о них не узнает, и включать их придётся руками через диспетчер
устройств. Обновление пакетом этой сложности не создаёт: штатное удаление внутри
процесса обновления останавливает службу, та снимает все отключения и очищает учёт,
и новая версия начинает с чистого листа.
Удаление
msiexec /x LaPortaUsb.msi /qn
Удаление останавливает службу и дожидается её остановки: при штатной остановке служба
снимает отключения с узлов устройств, и удаление файлов раньше оставило бы машину
с носителями, которые не работают и после удаления программы. Каталог
%ProgramData%\LaPortaUsb с журналом при удалении не трогается: записи аудита за три
месяца — не собственность программы.