LaPorta USB

Установка на одну машину

Что нужно заранее

Ловушка 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 с журналом при удалении не трогается: записи аудита за три месяца — не собственность программы.