Всем здарова.
Как известно, Adobe распространяет свой пакет Adobe Acrobat Reader DC в виде exe-файлов для установки - в виде веб-установщика и полного пакета установки. Но чтобы ставить в домене, программа должна быть в формате MSI. Веб-установщик не рассматриваем, а дальше речь только про полный.
Для примера я взял эту версию Adobe Acrobat Reader RU x64 2026.001.21662. Если вы попробуете распаковать её через 7-Zip или WinRAR, то внутри обнаружите массу интересного - в частности MSI-установщик AcroPro.msi, MSP-файл (патч для MSI-установщика), несколько CAB-архивов, Setup.ini и прочее. Если вы попытаетесь просто поставить MSI, то получите базовую версию 21.001.20135, что не есть хорошо с точки зрения безопасности, т.к. с того времени обнаружили много уязвимостей. Ибо Adobe распространяет так свои версии - базовая старая + очередной патч до последней. При простой установке из EXE вы всего этого не видите и получается магия =)
Как вариант, можно сделать AIP и Slipstreaming (административная точка установки и накладывание патча на неё) и ставить оттуда. Но вы получите набор из более чем 4 тысяч файлов и соответствующую скорость установки, особенно по сети. Чтобы убрать недоразумение такой кучи файлов их надо снова упаковать в архив и немного изменить оригинальный AcroPro.msi чтобы он начал понимать этот архив. Собственно для этого я с помощью Google AI и перебора его бредней создал рабочее решение по переупаковке EXE в MSI для установки последней версии.
Для работы с этим скриптом нам понадобятся:
- Windows 10 / Windows Server 2022 или новее. В них создержится Powershell 5.1, на инструкциях которого и построен скрипт.
- Установленный полный Windows SDK отсюда. Конкретно я использовал веб-установщик отсюда для Windows 11. Из всего SDK нам необходим только скрипт WiMakCab.vbs, который собственно и умеет создавать CAB-архивы. Опробованные решения от Google AI через makecab.exe и Wix Toolset V3 успеха не принесли и в лучшем случае давали нерабочий установщик, а в большинстве просто не формировали CAB-архив
- Установленный 7-Zip 64bit последней версии (нужен для распаковки EXE)
- Сам файл полного установщика с нужным языком и разрядностью. Как уже писал в начале - использовал этот Adobe Acrobat Reader RU x64 2026.001.21662
- Собственно, сам скрипт конвертации на Powershell (исходник в конце статьи), в статье я его сохранил под именем SlipstreamAcrobat.ps1, но вы можете назвать как угодно.
- Adobe Acrobat Wizard отсюда - для более тонкой донастройки установщика с заранее предопределёнными свойствами. Он формирует MST-файл трансформации для MSI-установщика, который и устанавливает эти свойства. Очень советую им пользоваться, дальше поймёте почему.
- Поместите скрипт в какую-либо папку. Пусть будет с:\acrobat. Поместите в неё же, а лучше в подпапку - exe-файл полного установщика Acrobat. Пусть это будет подпапка 26.001.21662 (номер версии Acrobat).
- Запустите под админом (это важно для распаковки) консоль PowerShell. Выполните следующую команду:
powershell c:\acrobat\SlipstreamAcrobat.ps1 c:\acrobat\26.001.21662\AcroRdrDCx642600121662_ru_RU.exe
С относительными путями у меня не заработало, поэтому надо вводить абсолютные. - Подождите минут 5-10, в консоли будет выводится текущий прогресс и сообщения.
- По итогу в под-подпапке ready будут лежать 3 файла: AcroPro.msi, custom.cab и Setup.ini. Файл Setup.ini нужен только для Acrobat Wizard.
- Включить опцию Pesonalization Options, Eula Option - не будет показывать пользовательское соглашение при первом запуске.
- Выбрать Installation Options, Default Viewer for PDF files, Make Reader the default PDF viewer - для дефолтности акробата как просмотрщика PDF. Для Win10 и выше не так чтобы актуально, ибо требует интерактива от пользователя по выбору. Там же советую выбрать If reboot required at the end of installation, Supress reboot чтобы не заставлял перезагружаться после установки (больше актуально для ручной установки, через политики ребут не нужен).
- Shortcuts, Destination Computer, Desktop, правой кнопкой по Adobe Acrobat и выбрать Remove - на рабочем столе не будет создаваться иконка запуска (только в Пуске).
- Online Services and Features. Я бы здесь отметил всё, дабы не лезло в интернет лишний раз =) Единственно - можно оставить Load trusted root certificates from Adobe, но можно и отрубить - хз кому нужны корневые сертификаты от Adobe, но вдруг.
- Также, здесь можно добавить несколько записей в реестр, чтобы убрать всякие назойливые штуки. В частности:
Выбираем Registry, Destination Computer:
HKEY_LOCAL_MACHINE\Software\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown. Правой кнопкой New, DWORD value, в название пишем bToggleFTE, в значение 1 - отключает предложение купить/попробовать Acrobat Pro (аналог опции Upsell в п.4).
Там же DWORD, bWhatsNewExp 1 - отключает предложение ознакомиться с функциями при первом запуске. Для сильно любопытных - вот полный список всего чем можно управлять. - Дополнительно рекомендую исключить из установки файл AdobeCollabSync.exe: Files and Folders, Destination Computer, ProgramFiles64Folder, Adobe, Acrobat DC, Acrobat. Найти его там и правой кнопкой мыши выбрать Modify, справа в комбобоксе выбрать Remove file. Он всё равно пропишется в автозагрузку пользователя, но хотя бы не будет стартовать.
Важно! При закрытии Wizard, он предложит сохранить всё в AcroPro - отказываемся, иначе он применит все изменения в msi. Если вы не сторонник MST-файлов, то можете согласиться.
Можно тут же или на тестовой машине, в консоли (cmd или PowerShell) от админа выполнить команду в папке с этими файлами (уже четырьмя с custom.mst):
msiexec /i AcroPro.msi TRANSFORMS=custom.mst
И проверить - как оно вообще, работает или что-то не получилось.
if([string]::IsNullOrEmpty($ExePath)){Write-Error "Provide EXE path";exit 1}
$initDir=$pwd.Path
$exeFull=[System.IO.Path]::GetFullPath($ExePath)
if(-not (Test-Path $exeFull)){Write-Error "File not found";exit 1}
$workDir=[System.IO.Path]::GetDirectoryName($exeFull)
$readyDir=Join-Path $workDir "ready"
$tmp1=Join-Path $workDir "acrotmp1"
$tmp2=Join-Path $workDir "acrotmp2"
Write-Host "Step 1: Locating 7-Zip executable and Windows SDK WiMakCab.vbs..." -ForegroundColor Green
$sevenZ=(Get-ItemProperty "HKLM:\SOFTWARE\7-Zip" -ErrorAction SilentlyContinue).Path
if(-not $sevenZ){$sevenZ=(Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\7-Zip" -ErrorAction SilentlyContinue).Path}
if($sevenZ){$7z=Join-Path $sevenZ "7z.exe"}else{$7z="C:\Program Files\7-Zip\7z.exe"}
if(-not (Test-Path $7z)){$7z="C:\Program Files (x86)\7-Zip\7z.exe"}
if(-not (Test-Path $7z)){Write-Error "7z.exe not found";exit 1}
$sdkPaths=@("C:\Program Files (x86)\Windows Kits","C:\Program Files\Windows Kits")
$regSdk=(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -ErrorAction SilentlyContinue).KitsRoot10
if($regSdk){$sdkPaths+=$regSdk}
$vbs=(Get-ChildItem -Path $sdkPaths -Filter "WiMakCab.vbs" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1).FullName
if(-not $vbs){Write-Error "WiMakCab.vbs not found";exit 1}
$env:Path+=";C:\Windows\System32"
Set-Location $workDir
Write-Host "Step 2: Preparing isolated workspace and temporary output folders..." -ForegroundColor Green
New-Item -ItemType Directory -Path $tmp1 -Force | Out-Null
New-Item -ItemType Directory -Path $tmp2 -Force | Out-Null
New-Item -ItemType Directory -Path $readyDir -Force | Out-Null
Write-Host "Step 3: Extracting files from the source Acrobat EXE installer..." -ForegroundColor Green
Write-Progress -Activity "Acrobat" -Status "Extracting EXE..." -PercentComplete 10
Start-Process $7z -ArgumentList "x `"$exeFull`" -o`"$tmp1`" -y" -NoNewWindow -Wait
$msi=(Get-ChildItem -Path $tmp1 -Filter "*.msi" | Select-Object -First 1).FullName
$msp=(Get-ChildItem -Path $tmp1 -Filter "*.msp" | Select-Object -First 1).FullName
$ini=(Get-ChildItem -Path $tmp1 -Filter "Setup.ini" | Select-Object -First 1).FullName
if((-not $msi) -or (-not $msp)){Write-Error "MSI or MSP missing";Set-Location $initDir;exit 1}
Write-Host "Step 4: Generating an Administrative Installation Point base layout..." -ForegroundColor Green
Write-Progress -Activity "Acrobat" -Status "Creating patched layout..." -PercentComplete 40
Start-Process "msiexec.exe" -ArgumentList "/a `"$msi`" TARGETDIR=`"$tmp2`" /qn" -NoNewWindow -Wait
$patchedMsi=Join-Path $tmp2 (Get-Item $msi).Name
Write-Host "Step 5: Injecting and slipstreaming the MSP patch into the installation layout..." -ForegroundColor Green
Write-Progress -Activity "Acrobat" -Status "Applying MSP patch..." -PercentComplete 60
Start-Process "msiexec.exe" -ArgumentList "/a `"$patchedMsi`" /p `"$msp`" /qn" -NoNewWindow -Wait
Write-Host "Step 6: Compiling files and updating database via WiMakCab.vbs..." -ForegroundColor Green
Write-Progress -Activity "Acrobat" -Status "Building CAB package..." -PercentComplete 80
$vbsDir=[System.IO.Path]::GetDirectoryName($vbs)
Set-Location $tmp2
Start-Process "cscript.exe" -ArgumentList "//nologo `"$vbs`" `"$patchedMsi`" custom /C /L /U /S" -NoNewWindow -Wait
$generatedCab=Join-Path $tmp2 "custom.cab"
if(-not (Test-Path $generatedCab)){
$fallbackCab=Join-Path $vbsDir "custom.cab"
if(Test-Path $fallbackCab){Move-Item $fallbackCab $generatedCab -Force}
}
if(-not (Test-Path $generatedCab)){
$anyCab=Get-ChildItem -Path $tmp2, $vbsDir -Filter "*.cab" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
if($anyCab){Copy-Item $anyCab.FullName $generatedCab -Force}
}
Write-Host "Step 7: Reallocating finalized MSI, CAB, and INI files to the ready directory..." -ForegroundColor Green
Write-Progress -Activity "Acrobat" -Status "Finalizing files..." -PercentComplete 95
Copy-Item $patchedMsi (Join-Path $readyDir "AcroPro.msi") -Force
Copy-Item $generatedCab (Join-Path $readyDir "custom.cab") -Force
if($ini){
$targetIni=Join-Path $readyDir "Setup.ini"
Copy-Item $ini $targetIni -Force
$acl=Get-Acl $targetIni
$userRule=New-Object System.Security.AccessControl.FileSystemAccessRule($env:USERNAME,"FullControl","Allow")
$acl.SetAccessRule($userRule)
Set-Acl $targetIni $acl
}
Set-Location $workDir
Write-Host "Step 8: Cleaning up temporary directories and reverting terminal path location..." -ForegroundColor Green
Remove-Item -Recurse -Force $tmp1 -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force $tmp2 -ErrorAction SilentlyContinue
Write-Progress -Activity "Acrobat" -Status "Completed" -PercentComplete 100
Set-Location $initDir
Write-Host "Process completely finished." -ForegroundColor Green
Комментариев нет:
Отправить комментарий