
Команда SUBST A: D:\keys не эмулирует дискету: она лишь назначает букву каталогу. Для старой программы этого иногда достаточно, но для загрузочного образа, низкоуровневого доступа или файловой системы носителя нужен VHD/VHDX, виртуальная машина или специализированный эмулятор. Выбор зависит от того, что проверяет приложение.

1. Определите требование старой программы
Проверьте, нужна ли только буква A:, запись в корень, фиксированный размер, FAT, загрузка BIOS или настоящий floppy-контроллер. Запишите версию программы и операционной системы. Не экспериментируйте на единственной копии ключей или прошивки.
| Требование | Подход |
|---|---|
| Только путь с буквой диска | SUBST |
| Общая папка по сети | net use |
| Отдельная файловая система | VHD/VHDX |
| Образ .img/.ima и контроллер | виртуальная машина/эмулятор |
Почему образ, буква диска и дисковод не взаимозаменяемы
Каталог с буквой A: остаётся каталогом на исходной файловой системе: у него нет собственного boot sector, таблиц FAT12 и геометрии 80 цилиндров/2 головки/18 секторов. VHDX предоставляет блоковый диск, но гостевая Windows обычно видит его как жёсткий диск. Образ 1,44 МБ — файл с содержимым всех 2880 секторов по 512 байт; сам файл не создаёт драйвер дисковода в современной host Windows. Программа, которая проверяет GetDriveType, использует низкоуровневые команды или обращается к BIOS, может требовать именно эмуляцию floppy-контроллера.
Поэтому начните с теста требований приложения. Если оно лишь открывает A:\key.dat, достаточно SUBST и проверки видимости в нужной сессии. Если оно требует «вставить дискету» после успешного чтения пути, изучите документацию и режим проверки носителя. Для архива старой загрузочной дискеты используйте совместимую виртуальную машину. Не устанавливайте неподписанный драйвер на административную рабочую станцию и не отключайте Secure Boot ради одного legacy-приложения.
2. Подготовьте отдельный каталог и права
Создайте каталог вне системных директорий, скопируйте в него тестовые данные и ограничьте доступ нужной учётной записью. Не используйте C:\Windows или профиль администратора как источник.
$Root='D:\LegacyKeys'
New-Item -ItemType Directory -Path $Root -Force
icacls $Root /inheritance:r
icacls $Root /grant:r "${env:USERDOMAIN}\${env:USERNAME}:(OI)(CI)M"
Сначала проверьте синтаксис прав в тестовом каталоге.
Исправные ACL и влияние UAC на SUBST
В PowerShell двоеточие после интерполируемой переменной требует явного ограничения имени. Для новой пустой папки пример правил записывают так:
$Root = 'D:\LegacyKeys'
$Account = "$env:USERDOMAIN\$env:USERNAME"
New-Item -ItemType Directory -Path $Root -Force | Out-Null
icacls.exe $Root /inheritance:r
icacls.exe $Root /grant:r "${Account}:(OI)(CI)M" 'SYSTEM:(OI)(CI)F'
icacls.exe $Root
Пример предназначен для отдельно созданного каталога, не существующей общей папки. (OI)(CI) распространяет разрешения на файлы и подкаталоги, M — Modify, F — Full control. Проверьте владельца и дополнительные явные ACE: отключение наследования не удаляет все старые явные разрешения. Для компании используйте утверждённую группу вместо привязки к одному оператору.
Сопоставления SUBST зависят от контекста входа. Программа, запущенная с повышением UAC, может не видеть букву, созданную обычным процессом, и наоборот. Служба, другой пользователь и удалённая сессия также имеют иной контекст. Проверяйте subst и Test-Path A:\ именно в той сессии, где запускается приложение. Создание задачи от SYSTEM не делает пользовательскую букву универсальной.
3. Назначьте букву через SUBST
Выберите свободную букву. Microsoft описывает subst как сопоставление пути букве диска; это не отдельный том.
subst
subst A: D:\LegacyKeys
Get-PSDrive A
Get-ChildItem 'A:\'
Если A: занята оборудованием или политикой, используйте другую букву и настройте приложение.
4. Проверьте ограничения SUBST
На SUBST-диске не работают операции уровня тома: chkdsk, format, label, diskcopy. Программа, которая проверяет тип носителя или геометрию дискеты, распознает подмену. Сервис под другой учётной записью может не видеть пользовательское сопоставление.
fsutil fsinfo drivetype A:
subst
Поэтому успешный dir A: ещё не означает совместимость.
5. Сделайте сопоставление управляемым
SUBST обычно не переживает вход/перезагрузку как гарантированная системная настройка. Для рабочего сценария создайте подписанный login script или задачу планировщика от того же пользователя. Команда должна проверять наличие каталога и свободную букву.
$Root='D:\LegacyKeys'
if ((Test-Path $Root) -and -not (Get-PSDrive A -ErrorAction SilentlyContinue)) {
subst A: $Root
}
Не запускайте задачу с SYSTEM, если программу использует обычный пользователь.
6. Для сетевого каталога используйте net use
Если данные находятся на SMB-ресурсе, SUBST не заменяет аутентификацию к сети. Применяйте управляемое сопоставление и не храните пароль в сценарии.
net use K: \\files.example.net\legacy /persistent:no
Get-SmbMapping
Для сервиса лучше использовать UNC и отдельную управляемую учётную запись.
7. Для отдельного тома создайте VHDX
VHDX даёт настоящую файловую систему и управляется через Disk Management или PowerShell. Создавайте его только на тестовой машине и выбирайте размер по данным. VHDX не становится «дискетой», но подходит приложениям, которым нужен отдельный том.
New-VHD -Path 'D:\Legacy\legacy.vhdx' -Dynamic -SizeBytes 256MB
Mount-VHD -Path 'D:\Legacy\legacy.vhdx' -PassThru | Get-Disk
Инициализация и форматирование изменяют выбранный диск; сверяйте номер вручную и держите резервную копию.
Полный пример VHDX с привязкой к созданному объекту
Для отдельного учебного тома требуется Hyper-V PowerShell module и повышенная консоль. Не выбирайте «первый RAW-диск»: он может оказаться новым физическим накопителем с чужими данными. Получайте объект диска непосредственно из Mount-VHD для конкретного файла.
Import-Module Hyper-V
$ImagePath = 'D:\Legacy\legacy-lab.vhdx'
if (Test-Path -LiteralPath $ImagePath) { throw 'Образ уже существует' }
if (Get-Volume -DriveLetter L -ErrorAction SilentlyContinue) { throw 'Буква L занята' }
New-Item -ItemType Directory -Path (Split-Path $ImagePath) -Force | Out-Null
New-VHD -Path $ImagePath -Dynamic -SizeBytes 256MB | Out-Null
$Disk = Mount-VHD -Path $ImagePath -PassThru | Get-Disk
if (@($Disk).Count -ne 1 -or $Disk.PartitionStyle -ne 'RAW') {
throw 'Неожиданное состояние нового диска; форматирование остановлено'
}
Initialize-Disk -Number $Disk.Number -PartitionStyle MBR
$Partition = New-Partition -DiskNumber $Disk.Number -UseMaximumSize -DriveLetter L
$Partition | Format-Volume -FileSystem FAT -NewFileSystemLabel LEGACYLAB -Confirm
Get-Volume -DriveLetter L | Select-Object DriveLetter,FileSystem,Size,SizeRemaining
Форматирование относится только к новому файлу legacy-lab.vhdx, подтверждённому в текущем сценарии. FAT здесь выбирает поддерживаемый формат для размера тома; это не обещание FAT12 и не эмуляция дискеты. Для приложения с требованием FAT12 используйте следующий отдельный сценарий. Закончив тест, закройте файлы и выполните Dismount-VHD -Path $ImagePath; не отключайте произвольный диск по номеру после изменения списка устройств.
8. Для .img/.ima используйте виртуальную машину
Если приложение читает boot sector, FAT12 или обращается к контроллеру, подключите образ дискеты к совместимой виртуальной машине. Хост Windows может не предоставлять безопасную универсальную эмуляцию floppy. Проверяйте хеш образа до и после работы.
Get-FileHash 'D:\Images\legacy.ima' -Algorithm SHA256
Copy-Item 'D:\Images\legacy.ima' 'D:\Images\legacy-working.ima'
Работайте с копией, особенно если программа пишет на носитель.
Настоящий виртуальный floppy в Hyper-V Generation 1
На хосте с установленным Hyper-V проверьте доступность команд и поколение существующей тестовой VM. Виртуальный floppy относится к Generation 1; перевод существующей Generation 2 «на лету» не является вариантом. Используйте отдельную совместимую машину и лицензированную гостевую ОС.
Import-Module Hyper-V
Get-Command New-VFD,Get-VMFloppyDiskDrive,Set-VMFloppyDiskDrive
$VmName = 'Legacy-Lab'
$Vm = Get-VM -Name $VmName -ErrorAction Stop
if ($Vm.Generation -ne 1) { throw 'Нужна совместимая Generation 1 VM' }
$FloppyImage = 'D:\Legacy\legacy-lab.vfd'
if (Test-Path -LiteralPath $FloppyImage) { throw 'Не перезаписывайте существующий VFD' }
New-VFD -Path $FloppyImage
Get-VMFloppyDiskDrive -VMName $VmName
Set-VMFloppyDiskDrive -VMName $VmName -Path $FloppyImage
Get-VMFloppyDiskDrive -VMName $VmName | Select-Object VMName,Path
Создание VFD и подключение — разные шаги. Если гостевая ОС просит форматировать новый образ, делайте это только для свежего учебного файла; архивную дискету не форматируют. Внутри гостя проверьте A:, выполните чтение тестового файла и убедитесь, что legacy-программа видит требуемый тип устройства. Для отключения после закрытия гостевых файлов используйте Set-VMFloppyDiskDrive -VMName $VmName -Path $null. Работа с host-буквой A: не подменяет гостевой floppy.
Создание FAT12-образа без драйвера Windows
Альтернативный путь для переносимого raw .img — mtools в отдельной Linux-среде. WSL подходит для создания и анализа файла; эмуляция самого floppy выполняется гипервизором. На Debian/Ubuntu установите mtools из репозитория. Все команды ниже обращаются к обычному файлу legacy.img, а не /dev/sdX.
sudo apt-get update
sudo apt-get install mtools
mkdir -p "$HOME/legacy-floppy-lab"
cd "$HOME/legacy-floppy-lab"
test ! -e legacy.img || { echo 'Образ уже существует'; exit 1; }
truncate -s 1474560 legacy.img
mformat -i legacy.img -f 1440 ::
printf 'Legacy lab\n' > README.TXT
mcopy -i legacy.img README.TXT ::README.TXT
mdir -i legacy.img ::
mtype -i legacy.img ::README.TXT
sha256sum legacy.img
-i выбирает файл-образ, -f 1440 задаёт стандартный формат 1,44 МБ, :: обозначает корень образа. mdir должен показать README.TXT, а mtype — его содержимое. Не переносите ключи и прошивки, пока этот учебный цикл не прошёл. Созданный образ содержит FAT12, но не становится загрузочным автоматически: для загрузки нужны соответствующий boot code и системные файлы ОС, распространяемые на законных основаниях.
Исходные архивные образы сохраняйте отдельно, проверяйте SHA-256 до и после копирования и подключайте рабочую копию. В отчёте укажите гипервизор, поколение VM, формат образа, требование приложения и результат открытия файла. Тест «видна буква» и тест «работает BIOS-загрузчик» подтверждают разные уровни совместимости.
9. Проверьте бизнес-операцию и безопасность
Запустите программу обычным пользователем, прочитайте и запишите тестовый файл, закройте программу и повторите вход. Убедитесь, что секретные ключи не стали доступны другим пользователям и не попали в незащищённый backup.
Set-Content A:\probe.txt 'test'
Get-Content A:\probe.txt
Remove-Item A:\probe.txt
10. Удалите сопоставление и верните состояние
Для SUBST используйте /d; для VHDX — безопасное отключение после закрытия файлов; сетевой диск удалите через net use /delete. Проверьте, что буква исчезла и исходный каталог сохранился.
subst A: /d
net use K: /delete
Dismount-VHD -Path 'D:\Legacy\legacy.vhdx'
Источники: Microsoft — subst, Microsoft — New-VHD, Microsoft — Mount-VHD.
Дополнительная документация: Hyper-V: New-VFD, Hyper-V: Set-VMFloppyDiskDrive, GNU mtools: mformat.
