Первое, с чем может столкнуться администратор при развертывании Office 2019 в компании – теперь нельзя скачать установочный образ Office 2019 на сайте лицензирования Volume Licensing Service Center (VLSC). Установочные файлы Office теперь доступы в Интернете в сети Office CDN (Content Delivery Network). Другая неожиданность, дистрибутив Office 2019 теперь поставляется не в виде привычного MSI пакета, а распространяется через установщик Click to Run (как и Office 365). В этой статье мы рассмотрим особенности подготовки и развертывания корпоративной версии Office 2019 в сети предприятия (вручную, с помощью GPO или SCCM).
Основные особенности Office 2019, о которых нужно помнить перед началом развертыванием пакета в компании:
- Office 2019 можно установить только на Windows 10 или Windows Server 2016/2019;
- Установщик Office 2019 основан на технологии «Нажми и работай / Click-to-Run (C2R)», а не на классическом MSI установщике (как это было в предыдущих версиях Office);
- Нельзя одновременно использовать на компьютере Office 2019 и предыдущую версию Office или любой пакет из Office 365 (например, вы не сможете установить Skype for Business Click to Run из Office 365);
- Для настройки параметров установки Office 2019 теперь используется Office Deployment Tool (ODT) вместо привычной Office Customization Tool (OCT);
- Установка всегда выполняется на системный диск.
Перед началом развертывания Office 2019, скопируйте из своего личного кабинета на сайте VLSC ключ для установки продуктов из комплекта Office (это может быть ключ для активации KMS сервера, или MAK ключ многократной установки).
Для развертывания Office 2019 по технологии Click-to-Run нужно использовать специальную утилиту – средство развёртывания Microsoft Office Deployment Tool – ODT (также он используется для развертывания Office 365 ProPlus).
Скачайте Microsoft Office Deployment Tool (https://www.microsoft.com/en-us/download/details.aspx?id=49117), запустите файл officedeploymenttool_11901-20022.exe и распакуйте содержимое Office Click-to-Run Administrator Tool в локальный каталог на компьютере.
Как вы видите, в каталоге установке есть три XML файла c образцом конфигурации установки: configuration-Office365-x64.xml, configuration-Office365-x86.xml и configuration-Office2019Enterprise.xml. Программа setup.exe используется для запуска получения дистрибутива и запуска установки пакета Office на клиенте.
В данном случае нас не интересуют файлы конфигурации для Office 365 (в чем отличия Office 2016/2019 от Office 365). Перейдем к рассмотрению XML файла configuration-Office2019Enterprise.xml в котором содержится пример конфигурации Office 2019 Enterprise для канала Volume License. Рассмотрим структуру XML файла:
<Configuration>
<Add OfficeClientEdition="64" Channel="PerpetualVL2019">
<Product ID="ProPlus2019Volume">
<Language ID="en-us" />
</Product>
<Product ID="VisioPro2019Volume">
<Language ID="en-us" />
</Product>
<Product ID="ProjectPro2019Volume">
<Language ID="en-us" />
</Product>
</Add>
<!-- <RemoveMSI All="True" /> -->
<!-- <Display Level="None" AcceptEULA="TRUE" /> -->
<!-- <Property Name="AUTOACTIVATE" Value="1" /> -->
</Configuration>
Рассмотрим основные параметры:
-
OfficeClientEdition="64"
– установка 64 битной версии Office 2019; -
Channel="PerpetualVL2019
– установка Office 2019 по системе корпоративного лицензирования (Volume License); -
<Language ID="en-us" />
— установка английской редакции Office. Для формирования и установки русской версии нужно указать ru-ru; -
<!-- <RemoveMSI All="True" /> -->
— перед установкой Office 2019 необходимо удалить все старые версии Office, установленные через Windows MSI. Данный параметр закомментирован, но для перед развёртыванием Office 2019 его нужно включить, иначе вы столкнетесь с ошибками при развертывании; -
<Product ID="ProPlus2019Volume" PIDKEY="" >
— вы можете указать компоненты пакета Office (ProPlus2019Volume, Standard2019Volume, ProjectPro2019Volume, ProjectStd2019Volume, VisioPro2019Volume, VisioStd2019Volume), которые нужно установить. В параметре PIDKEY=»» можно указать ваш корпоративный ключ (обычно это MAK ключ); - С помощью директивы вид <ExcludeApp ID=»PowerPoint» /> вы можете устанавливать только выбранные приложения Office (по умолчанию C2R установщик ставит все приложения пакета Office).
После того, как вы сформировали XML файл, вы можете скачать дистрибутив для установки Office 2019. Для этого выполите команду:
Setup.exe /download configuration-Office2019Enterprise.xml
Загрузка дистрибутива выполняется в тихом режиме. Для загрузки нужен доступ в Интернет, файлы загружаются из сети CDN Office.
После окончания загрузки в каталоге Microsoft Office Deployment Tool появится каталог Office (содержит cab и dat файлы для установки Office 2019) размером около 2 Гб.
Полученный пакет можно использовать для установки Office 2019 на компьютеры пользователей. Но, чтобы каждый компьютер не загружал установочные файлы Office 2019 из сети CDN, а пользовался локальной копией, нужно в XML файле указать путь к каталогу с файлами установки Office. Проще всего их разместить в общей сетевой папке. Например:
<Add SourcePath="\\srv1\Distr\Apps\Office2019" OfficeClientEdition="64" Channel="PerpetualVL2019">
Для генерации XML файла для Office 2019 выберите:
- Office Suites: Office Standard 2019 – Volume License
- Update channel: Office 2019 Perpetual Enterprise
Так же вы можете указать, что установочный файлы Office нужно получать не из CDN сети Microsoft, а из сетевой папки внутри локальной сети.
После того, как вы заполнили все формы, нажмите Export, скачайте XML файл и поместите его в каталог с Office Deployment Tool.
Теперь вы можете скопировать каталог Microsoft Office Deployment Tool с xml файлами и дистрибутивом Office 2019 в сетевой каталог или на SCCM сервер.
Для начала установки Office2019 вам достаточно выполнить команду:
Setup.exe /configure configuration-Office2019Enterprise.xml
После окончания установки Office 2019 Enterprise или любого его пакета, вы можете активировать продукт с помощью MAK ключа многократной установки, если вы не указали его в XML файле (Файл -> Учетная запись -> Сведениями о продукте -> Изменить ключ продукта) или с помощь KMS сервера (как установить KMS сервер для активации Office 2019).
Для дальнейшей настройки параметров Office на компьютерах пользователей вы можете использовать административные шаблоны GPO.
Как обновлять? 🙂 Особенно через WSUS?
Click-to-Run через WSUS не обновляется, насколько мне известно 🙁
Могу предположить, что в корпоративной среде есть возможность создания сетевой папки, в которую либо вручную, либо по скрипту выкачивать новую версию дистриба. И с помощью групповых политик указать путь к этой папке. По крайней мере, так работает обновление пакета Office 365. Ну либо доступ в интернет, и каждый комп выкачивает обновления сам)
И да, на примере Office 365 — видимо, WSUS не поддерживается.
Все верно вы не сможете обновлять Office 2019 через WSUS.
Вот немного инфы к размышлению:
При скачивании и установке Office 2019 из сети доставки содержимого Office всегда устанавливается обновленная версия. После установки Office 2019 нет необходимости скачивать и применять обновления или пакеты обновления.
Обновления являются накопительными и входят в состав последней версии Office 2019, доступной в сети доставки содержимого Office, поэтому для обновления Office 2019 не используется центр обновления Майкрософт и службы Windows Server Updates Services (WSUS).
Можно настроить обновление из сетевой папки через GPO: Computer Configuration\Policies\Administrative Templates\Microsoft Office 2016 (Machine)\ Updates. См. параметр Update path и другие. Сетевой каталог с версий Office нужно периодически (или по расписанию) обновлять актуальной версией как описано в статье командой ODT setup.exe /download
Мда, и еще нужно как-то распространять новую версию на тестирование. А то поставил для пробы на несколько машин 2019-ый, а косяки уже повылазили, пока в основном с интерфейсом.
Можете как пример показать свой xml файл которые используете для установки на предприятии или в продакшен
Может есть у кого что добавить для разворачивания через AD
Для начала, создаёшь сетевую папку, в неё закидываешь скачанный дистриб, файл .xml с нужными настройками и setup.exe. Далее, создаёшь сверхгениальный батник, в котором указываешь путь к файлу setup.exe и .xml. И далее, с помощью групповых политик, добавляешь его в логон-скрипт на компы. Это если крайне сокращённо. Вариаций данного способа масса:
— проверка, установлен ли Office ил нет. И в случае если установлен — завершение работы скрипта
— базовое логирование (имя компа, время начала установки, без подробностей)
— в случае разных версий (стандарт или про) — создание нескольких папок, нескольких .xml
И так далее
# Обновление до OFFICE 2016 на Windows 7 x64 и OFFICE 2021 на Windows 10 x64 (Visio и Project при необходимости)
# Можете адаптировать под Вашу инфраструктуру. Скрипт как есть, тестовая версия (Адаптировано для Powershell 2.0 для работы на Windows 7)
# powershell.exe -ExecutionPolicy Bypass -File \\server\OFFICE\Office.ps1
$DebugPreference = 'Continue'
# Константы
$ConfigFilePath2016 = "\\server\OFFICE\Office2016ProPlus\"; $SetupExePath2016 = "\\server\OFFICE\Office2016ProPlus\setup2016.exe"
$ConfigFilePath2021 = "\\server\OFFICE\Office2021ProPlus\"; $SetupExePath2021 = "\\server\OFFICE\Office2021ProPlus\setup2021.exe"
$ConfigFilePath_o_XML = "conf_o.xml"; $ConfigFilePath_ov_XML = "conf_ov.xml"; $ConfigFilePath_op_XML = "conf_op.xml"; $ConfigFilePath_ovp_XML = "conf_ovp.xml"; $kms = "kms";
$logfilePath = "\\server\OFFICE\L"
function Start-Logging {
param(
[string]$logfilePath
)
$computerName = $env:COMPUTERNAME
$logFilePath = "$logfilePath\$computerName.log"
if (Test-Path -Path $logFilePath) { $content = Get-Content -Path $logFilePath; $content = $content + "`r`n`r`n`r`n"; Set-Content -Path $logFilePath -Value $content -Encoding Unicode }
Start-Transcript -Path $logFilePath -Append
}
function Stop-Logging {
Stop-Transcript
}
# Функция для получения битности системы
function Get-SystemBit {
try {
return "$([IntPtr]::size * 8)"
} catch {
Write-Host "Ошибка при определении битности системы: $($_.Exception.Message)"
exit
}
}
# Функция для получения версии ОС
function Get-SystemOSVersion {
try {
$system_osver = [System.Environment]::OSVersion.Version
if ($system_osver.build -lt 7601) {
Write-Host "ВЕРСИЯ ОС неподходящая"
exit
}
return $system_osver
} catch {
Write-Host "Ошибка при определении версии ОС: $($_.Exception.Message)"
exit
}
}
# Функция для получения названия продукта
function Get-ProductName {
try {
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
$productName = Get-ItemProperty -Path $regPath -Name ProductName -ErrorAction Stop
if ($productName) {
$productName = $productName.ProductName
} else {
exit
}
if ($productName -match "Server") {
Write-Host "РЕДАКЦИЯ ОС неподходящая"
exit
}
return $productName
} catch {
Write-Host "Ошибка при получении точной версии Windows: $($_.Exception.Message)"
exit
}
}
# Функция для получения списка установленных продуктов Office
function Get-OfficeProducts {
try {
try {$OFFICEp64 = @(Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.GetValue("DisplayName") -match "Microsoft Office" } | Where-Object { $_.Name -match ".*office.*" -or $_.Name -match ".*ProPlus.*" })} catch {Write-Host "Office_Uninstall_patch_unaccessible: $($_.Exception.Message)";$OFFICEp64 = $null};try {$OFFICEp86 = @(Get-ChildItem "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.GetValue("DisplayName") -match "Microsoft Office" } | Where-Object { $_.Name -match ".*office.*" -or $_.Name -match ".*ProPlus.*" })}catch {Write-Host "Office_WOW6432Node_Uninstall_patch_unaccessible: $($_.Exception.Message)";$OFFICEp86 = $null}
if ($OFFICEp64 -ne $null -and $OFFICEp86 -ne $null) {Write-Host "Office_х64_Uninstall_patch"; return $OFFICEp64 + $OFFICEp86} elseif ($OFFICEp64 -ne $null) {Write-Host "Office_Uninstall_patch"; return $OFFICEp64} elseif ($OFFICEp86 -ne $null) {Write-Host "Office_х86_Uninstall_patch"; return $OFFICEp86} else {return $false}
} catch {
Write-Host "Ошибка при получении списка установленных продуктов Office: $($_.Exception.Message)"
exit
}
}
# Функция для проверки компонентов Office
function Check-OfficeComponents {
param(
[string]$officeVersion,
[string]$officeV
)
$components = @("Access", "Excel", "Outlook", "PowerPoint", "Word")
foreach ($component in $components) {
$registryPath = "HKLM:\SOFTWARE\Microsoft\Office\$officeVersion.0\$component"
try {
$subKeys = Get-ChildItem -Path $registryPath 2>&1
if ($subKeys.Count -ge 1) {
Write-Host "MS_OFFICE_${officeV}: установлен $component"
}
} catch { Write-Host "" }
}
}
# Функция для вывода деталей продукта Office
function Print-OfficeProductDetails {
param(
[PSObject]$product
)
$officeProduct_dn = $product.GetValue("DisplayName")
$officeProduct_v = $product.GetValue("DisplayVersion")
$officeProduct_il = $product.GetValue("InstallLocation")
Write-Host "Найден продукт: $officeProduct_dn, Версия: $officeProduct_v, Расположение: $officeProduct_il"
if ($product.GetValue("ModifyPath") -match "setup.exe"){
Write-Warning "${officeProduct_dn}: установлен методом MSI"
} elseif ($product.GetValue("ModifyPath") -match "OfficeClickToRun.exe"){
Write-Warning "${officeProduct_dn}: установлен методом Click-to-Run"
}
Write-Host "==="
return $officeProduct_il
}
# Дополнительная проверка наличия Visio
function Check-Visio {
$visioPath = "HKLM:\SOFTWARE\Microsoft\Office\16.0\Visio\InstallRoot"
if (Test-Path $visioPath) {
$visioVersion = Get-ItemProperty -Path $visioPath -Name "Path" -ErrorAction SilentlyContinue
if ($visioVersion) {
Write-Host "Установлен Microsoft Visio $($visioVersion.Path)"
return $true
}
} else {
Write-Host "Microsoft Visio не установлен"
return $false
}
}
# Дополнительная проверка наличия Project
function Check-Project {
$projectPath = "HKLM:\SOFTWARE\Microsoft\Office\16.0\Project\InstallRoot"
if (Test-Path $projectPath) {
$projectVersion = Get-ItemProperty -Path $projectPath -Name "Path" -ErrorAction SilentlyContinue
if ($projectVersion) {
Write-Host "Установлен Microsoft Project $($projectVersion.Path)"
return $true
}
} else {
Write-Host "Microsoft Project не установлен"
return $false
}
}
# Дополнительная проверка метода установки (MSI или C2R)
function Check-OfficeInstallMethod {
$officeC2RPath = "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun";$officeMSI = $false; $officeC2R = $false; $officeReinstall = $false;
try { if ($officeC2RIPath = Get-ItemProperty -Path $officeC2RPath -Name "InstallPath" -ErrorAction SilentlyContinue) {Write-Debug "debug_C2R_InstallPath" } else {$officeC2RPath = "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\NOT_CORRECT"} } catch { Write-Host "" }
$officeMSIPath = "HKLM:\SOFTWARE\Microsoft\Office"
if (Test-Path $officeC2RPath) {
if ($officeC2RIPath -ne $null) {
$officeC2R = $true
$officeMSI = $false
Write-Host "Microsoft Office установлен методом Click-to-Run"
}
} elseif (Test-Path $officeMSIPath) {
$officeC2R = $false
$officeMSI = $true
$officeReinstall = $true
Write-Host "Microsoft Office установлен методом MSI"
} else {
$officeC2R = $false
$officeMSI = $false
$officeReinstall = $true
Write-Host "Microsoft Office не установлен"
}
return $officeMSI, $officeC2R, $officeReinstall
}
# Функция для определения пути установки Office в зависимости от версии
function Get-OfficeInstallPath {
param(
[string]$officeVersion,
[string]$officeV
)
if ($officeV -match "2010|2013|2016") {
return "Office$officeVersion"
} elseif ($officeV -match "2019|2021") {
return "\\root\\Office$officeVersion"
}
}
# Проверяем версии исполняемых файлов
function Check-OfficeAppVersions {
param(
[string]$officeVersion,
[string]$officeV,
[string]$officeInstallLocation
)
$officeApps = @("WINWORD", "EXCEL", "OUTLOOK")
$versions = @()
try {
$OfficeInstallPath = Get-OfficeInstallPath -officeVersion $officeVersion -officeV $officeV
$officePath = Join-Path $officeInstallLocation $OfficeInstallPath
foreach ($app in $officeApps) {
try {
$appPath = Join-Path $officePath "$app.exe"
if (Test-Path $appPath) {
$versionInfo = (Get-ItemProperty -Path $appPath).VersionInfo
$version = $versionInfo.ProductVersion
$versions += $version
Write-Host "Установлен $app, версия: $version"
}
} catch { Write-Host "" }
}
} catch { Write-Host "" }
return $versions
}
# Функция для обработки Office 2013
function Process-Office2013 {
param(
[bool]$office2013_ms,
[bool]$office2013_c2r,
[string]$officeVersion,
[string]$officeV
)
if ($office2013_ms) {
Write-Host "MS_OFFICE_2013: метод MSI не должен мешать установки новой версии"
$officeReinstall = $true
}
if ($office2013_c2r) {
$officeReinstall = $true
}
return $officeReinstall
}
# Функция для обработки Office 2016
function Process-Office2016 {
param(
[bool]$office2016_ms,
[bool]$office2016_c2r,
[string]$officeVersion,
[string]$officeV
)
if ($office2016_ms) {
$officeReinstall = $true
Write-Host "MS_OFFICE_2016: требуется переустановка методом C2R"
}
if ($office2016_c2r) {
if ($productName -notmatch "Windows 7" -or $productName -notmatch "Windows 8") {
$officeReinstall = $true
Write-Host "MS_OFFICE_2016: требуется обновление OFFICE методом C2R"
} else {
$officeReinstall = $false
Write-Host "Установлен максимально возможный MS_OFFICE_2016 методом C2R. ОС не поддерживает обновление штатными методами!"
exit
}
}
return $officeReinstall
}
# Функция для обработки Office 2019
function Process-Office2019 {
param(
[bool]$office2019_c2r,
[string]$officeVersion,
[string]$officeV
)
if ($office2019_c2r) {
if ($productName -notmatch "Windows 7" -or $productName -notmatch "Windows 8") {
$officeReinstall = $true
Write-Host "MS_OFFICE_2019: требуется обновление OFFICE методом C2R"
} else {
$officeReinstall = $false
Write-Host "Установлен максимально возможный MS_OFFICE_2019 не штатным методом C2R. ОС не поддерживает обновление!"
exit
}
}
return $officeReinstall
}
# Функция для обработки Office 2021
function Process-Office2021 {
param(
[bool]$office2021_c2r,
[string]$officeVersion,
[string]$officeV
)
if ($office2021_c2r) {
if ($productName -notmatch "Windows 7" -or $productName -notmatch "Windows 8") {
$officeReinstall = $false
#$officeReinstall = $true
#Write-Host "MS_OFFICE_2021: требуется обновление OFFICE методом C2R"
} else {
$officeReinstall = $false
exit
}
}
return $officeReinstall
}
# Функция для обработки версий Office
function Process-OfficeVersions {
param(
[array]$versions
)
$sortedVersions = $versions | Sort-Object {[Version]$_} -Descending
$latestVersion = $sortedVersions[0]
Write-Host "Самая старшая версия: $latestVersion"
if ($latestVersion -match "15.0") {
$officeReinstall = $true
Write-Warning "Самая старшая установленная версия приложения соответствует Office 2013"
}
if ($latestVersion -match "16.0.54") {
if (($productName -notmatch "Windows 7") -or ($productName -notmatch "Windows 8")){$officeReinstall = $true}else{$officeReinstall = $false}
Write-Warning "Самая старшая установленная версия приложения соответствует Office 2016"
}
if (($latestVersion -match "16.0.104") -or ($latestVersion -match "16.0.11126")) {
if (($productName -notmatch "Windows 7") -or ($productName -notmatch "Windows 8")){$officeReinstall = $true}else{$officeReinstall = $false}
Write-Warning "Самая старшая установленная версия приложения соответствует Office 2019"
}
if ($latestVersion -match "16.0.14332") {
Write-Warning "Самая старшая установленная версия приложения соответствует Office 2021 LTSC"
$officeReinstall = $false
}
return $officeReinstall
}
# Функция для обработки логики установки Microsoft Office
function Process-OfficeInstallation {
param(
[string]$productName,
[bool]$officeReinstall,
[string]$system_osbit,
[string]$office2013_il,
[string]$office2016_il,
[string]$office2019_il,
[string]$latestVersion,
[string]$ConfigFilePath2016,
[string]$SetupExePath2016,
[string]$ConfigFilePath2021,
[string]$SetupExePath2021,
[bool]$reinstallvisio,
[bool]$reinstallproject
)
if (($productName -match "Windows 7") -or ($productName -match "Windows 8")){
Write-Host "Версия ОС: $productName"
if ($officeReinstall){
Write-Host "Требуется переустановка Microsoft Office на версию 2016"
Write-Host "Битность системы x$system_osbit"; if ($system_osbit -eq "32") {Write-Warning "НИКАКИХ ДЕЙСТВИЙ НЕ ТРЕБУЕТСЯ x32"; exit}
if ($office2013_il -match "Program Files (x86)"){Write-Host "Битность Microsoft Office x86"} else {Write-Host "Битность Microsoft Office x64"}
Write-Warning "!!! Запускаем установку Microsoft Office 2016 C2R x64 !!!"
if ($reinstallvisio -eq $false -and $reinstallproject -eq $false) {$ConfigFilePath2016 = ${ConfigFilePath2016} + ${ConfigFilePath_o_XML}; Write-Warning "ONLY OFFICE: ${ConfigFilePath2016}"} elseif ($reinstallvisio -eq $true -and $reinstallproject -eq $false) {$ConfigFilePath2016 = ${ConfigFilePath2016} + ${ConfigFilePath_ov_XML}; Write-Warning "ONLY OFFICE + VISIO: ${ConfigFilePath2016}"} elseif ($reinstallvisio -eq $false -and $reinstallproject -eq $true) {$ConfigFilePath2016 = ${ConfigFilePath2016} + ${ConfigFilePath_op_XML}; Write-Warning "ONLY OFFICE + PROJECT: ${ConfigFilePath2016}"} elseif ($reinstallvisio -eq $true -and $reinstallproject -eq $true) {$ConfigFilePath2016 = ${ConfigFilePath2016} + ${ConfigFilePath_ovp_XML}; Write-Warning "ONLY OFFICE + VISIO + PROJECT: ${ConfigFilePath2016}"}
# Установка Office 2016
Install-Office2016 -ConfigFilePath $ConfigFilePath2016 -SetupExePath $SetupExePath2016 -reinstallvisio $reinstallvisio -reinstallproject $reinstallproject
}
} else {
Write-Host "Версия ОС: $productName"
if ($officeReinstall){
Write-Host "Требуется переустановка Microsoft Office на версию 2021"; if ($system_osbit -eq "32") {Write-Warning "НИКАКИХ ДЕЙСТВИЙ НЕ ТРЕБУЕТСЯ x32"; exit}
try{ if ($office2016_il -match "Program Files (x86)"){Write-Host "Битность Microsoft Office x86"} elseif ($office2016_il -match "Program Files") {Write-Host "Битность Microsoft Office x64"} } catch { Write-Host "" }
try{ if ($office2019_il -match "Program Files (x86)"){Write-Host "Битность Microsoft Office x86"} elseif ($office2019_il -match "Program Files") {Write-Host "Битность Microsoft Office x64"} } catch { Write-Host "" }
try{ if ($office2021_il -match "Program Files (x86)"){Write-Host "Битность Microsoft Office x86"} elseif ($office2021_il -match "Program Files") {Write-Host "Битность Microsoft Office x64"} } catch { Write-Host "" }
if ($latestVersion -match "16.0.14332") { Write-Warning "Возможно требуется переустановить Microsoft Office 2021 LTSC C2R x64! Необходимо решение Администратора!!!"
} else {
Write-Warning "!!! Запускаем установку Microsoft Office 2021 LTSC C2R x64 !!!"
if ($reinstallvisio -eq $false -and $reinstallproject -eq $false) {$ConfigFilePath2021 = ${ConfigFilePath2021} + ${ConfigFilePath_o_XML}; Write-Warning "ONLY OFFICE: ${ConfigFilePath2021}"} elseif ($reinstallvisio -eq $true -and $reinstallproject -eq $false) {$ConfigFilePath2021 = ${ConfigFilePath2021} + ${ConfigFilePath_ov_XML}; Write-Warning "ONLY OFFICE + VISIO: ${ConfigFilePath2021}"} elseif ($reinstallvisio -eq $false -and $reinstallproject -eq $true) {$ConfigFilePath2021 = ${ConfigFilePath2021} + ${ConfigFilePath_op_XML}; Write-Warning "ONLY OFFICE + PROJECT: ${ConfigFilePath2021}"} elseif ($reinstallvisio -eq $true -and $reinstallproject -eq $true) {$ConfigFilePath2021 = ${ConfigFilePath2021} + ${ConfigFilePath_ovp_XML}; Write-Warning "ONLY OFFICE + VISIO + PROJECT: ${ConfigFilePath2021}"};
# Установка Office 2021 LTSC
Install-Office2021 -ConfigFilePath $ConfigFilePath2021 -SetupExePath $SetupExePath2021 -reinstallvisio $reinstallvisio -reinstallproject $reinstallproject
}
}
}
if (!$officeReinstall){Write-Warning "НИКАКИХ ДЕЙСТВИЙ НЕ ТРЕБУЕТСЯ"; exit}
}
# Функция для установки Office 2021
function Install-Office2021 {
param(
[string]$ConfigFilePath,
[string]$SetupExePath,
[bool]$reinstallvisio,
[bool]$reinstallproject
)
try {
$officeInstall = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'ProductReleaseIds' 2>&1).ProductReleaseIds
if($officeInstall -eq "ProPlus2021Volume"){
Write-Host "Office 2021 уже установлен."
return
}
} catch { Write-Host "Дополнительная проверка 2021 LTSC не удалась: $($_.Exception.Message)" }
try {
Write-Host "Установка Office 2021..."
Start-Process -FilePath $SetupExePath -ArgumentList "/configure $ConfigFilePath" -Wait
Start-Sleep -Seconds 10
} catch { Write-Host "Не удалось запустить установку Office 2021 LTSC: $($_.Exception.Message)" }
}
# Функция для установки Office 2016
function Install-Office2016 {
param(
[string]$ConfigFilePath,
[string]$SetupExePath,
[bool]$reinstallvisio,
[bool]$reinstallproject
)
try {
$officeInstall = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'ProductReleaseIds' 2>&1).ProductReleaseIds
if(($officeInstall -eq "ProPlus2016Volume") -or ($officeInstall -eq "Office16.PROPLUS")){
Write-Host "Office 2016 уже установлен."
return
}
} catch { Write-Host "Дополнительная проверка 2016 C2R не удалась: $($_.Exception.Message)" }
try {
Write-Host "Установка Office 2016..."
Start-Process -FilePath $SetupExePath -ArgumentList "/configure $ConfigFilePath" -Wait
Start-Sleep -Seconds 10
} catch { Write-Host "Не удалось запустить установку Office 2016 C2R: $($_.Exception.Message)" }
}
# Логируем !
Start-Logging -logfilePath $logfilePath
$date = [DateTime]::Now
Write-Host $date
# Запускаем скрипт
Write-Host "Запускаем скрипт..."; Write-Host "==="
$system_osbit = Get-SystemBit
$system_osver = Get-SystemOSVersion
$productName = Get-ProductName
$officeProducts = Get-OfficeProducts
$versions = @()
$officeReinstall = $false #if ($officeProducts -eq $false){ $officeReinstall = $true } else { $officeReinstall = $false }
$reinstallvisio = $false
$reinstallproject = $false
foreach ($product in $officeProducts) {
if ($($product.GetValue("DisplayName")) -match "Update") {continue}
if ($($product.GetValue("DisplayName")) -match "proof") {continue}
Write-Debug "debug_$($product.Name)"
if (($($product.Name) -match "Office14.STANDARD")){$officeVersion = "14";$officeV = "2010"; $officeInstallLocation = Print-OfficeProductDetails -product $product ; $versions += Check-OfficeAppVersions -officeVersion $officeVersion -officeV $officeV -officeInstallLocation $officeInstallLocation ; $officeReinstall = $true ; $office2013_il = $officeInstallLocation}
if (($($product.Name) -match "Office15.PROPLUS") -or ($($product.Name) -match "Office15.STANDARD")){
$officeVersion = "15"
$officeV = "2013"
Check-OfficeComponents -officeVersion $officeVersion -officeV $officeV
$officeInstallLocation = Print-OfficeProductDetails -product $product # $officeProduct_il
$OfficeInstallMethod = Check-OfficeInstallMethod # $officeMSI, $officeC2R, $officeReinstall
Write-Debug "debug2013_OfficeInstallMethod $OfficeInstallMethod"
$versions += Check-OfficeAppVersions -officeVersion $officeVersion -officeV $officeV -officeInstallLocation $officeInstallLocation # versions_array
if ($OfficeInstallMethod[2] -eq $true) {$officeReinstall = $true}
$ProcessOffice = Process-Office2013 -office2013_ms $OfficeInstallMethod[0] -office2013_c2r $OfficeInstallMethod[1] -officeVersion $officeVersion -officeV $officeV # $officeReinstall
Write-Debug "debug2013_ProcessOffice $ProcessOffice"
if ($ProcessOffice -eq $true) {$officeReinstall = $true}
$office2013_il = $officeInstallLocation
}
if ($($product.Name) -match "Office16.PROPLUS"){
$officeVersion = "16"
$officeV = "2016"
Check-OfficeComponents -officeVersion $officeVersion -officeV $officeV
$officeInstallLocation = Print-OfficeProductDetails -product $product # $officeProduct_il
$OfficeInstallMethod = Check-OfficeInstallMethod # $officeMSI, $officeC2R, $officeReinstall
Write-Debug "debug2016_OfficeInstallMethod $OfficeInstallMethod"
$versions += Check-OfficeAppVersions -officeVersion $officeVersion -officeV $officeV -officeInstallLocation $officeInstallLocation # versions_array
if ($OfficeInstallMethod[2] -eq $true) {$officeReinstall = $true}
$ProcessOffice = Process-Office2016 -office2016_ms $OfficeInstallMethod[0] -office2016_c2r $OfficeInstallMethod[1] -officeVersion $officeVersion -officeV $officeV # $officeReinstall
Write-Debug "debug2016_ProcessOffice $ProcessOffice"
if ($ProcessOffice -eq $true) {$officeReinstall = $true}
$office2016_il = $officeInstallLocation
}
if (($($product.Name) -match "ProPlus2019Volume") -or ($($product.Name) -match "ProPlus2019Retail")){
$officeVersion = "16"
$officeV = "2019"
Check-OfficeComponents -officeVersion $officeVersion -officeV $officeV
$officeInstallLocation = Print-OfficeProductDetails -product $product # $officeProduct_il
$OfficeInstallMethod = Check-OfficeInstallMethod # $officeMSI, $officeC2R, $officeReinstall
Write-Debug "debug2019_OfficeInstallMethod $OfficeInstallMethod"
$versions += Check-OfficeAppVersions -officeVersion $officeVersion -officeV $officeV -officeInstallLocation $officeInstallLocation # versions_array
#if ($OfficeInstallMethod[2] -eq $true) {$officeReinstall = $true}
$ProcessOffice = Process-Office2019 -office2019_c2r $OfficeInstallMethod[1] -officeVersion $officeVersion -officeV $officeV # $officeReinstall
Write-Debug "debug2019_ProcessOffice $ProcessOffice"
if ($ProcessOffice -eq $true) {$officeReinstall = $true} else { $officeReinstall = $false }
$office2019_il = $officeInstallLocation
}
if ($($product.Name) -match "ProPlus2021Volume"){
$officeVersion = "16"
$officeV = "2021"
Check-OfficeComponents -officeVersion $officeVersion -officeV $officeV
$officeInstallLocation = Print-OfficeProductDetails -product $product # $officeProduct_il
$OfficeInstallMethod = Check-OfficeInstallMethod # $officeMSI, $officeC2R, $officeReinstall
Write-Debug "debug2021_OfficeInstallMethod $OfficeInstallMethod"
$versions += Check-OfficeAppVersions -officeVersion $officeVersion -officeV $officeV -officeInstallLocation $officeInstallLocation # versions_array
#if ($OfficeInstallMethod[2] -eq $true) {$officeReinstall = $true}
$ProcessOffice = Process-Office2021 -office2021_c2r $OfficeInstallMethod[1] -officeVersion $officeVersion -officeV $officeV # $officeReinstall
Write-Debug "debug2021_ProcessOffice $ProcessOffice"
if ($ProcessOffice -eq $true) {$officeReinstall = $true} else { $officeReinstall = $false }
$office2021_il = $officeInstallLocation
}
if ($($product.Name) -match "VISSTD"){
$reinstallvisio = $true
Write-Host "установлен VISIO STD"
}
if ($($product.Name) -match "PRJSTD"){
$reinstallproject = $true
Write-Host "установлен PROJECT STD"
}
if ($($product.Name) -match "VisioPro"){
$reinstallvisio = $true
Write-Host "установлен VISIO PRO"
}
if ($($product.Name) -match "ProjectPro"){
$reinstallproject = $true
Write-Host "установлен PROJECT PRO"
}
if (Check-Visio) {$reinstallvisio = $true}
if (Check-Project) {$reinstallproject = $true}
}
Write-Debug "debug_reinstallvisio $reinstallvisio"
Write-Debug "debug_reinstallproject $reinstallproject"
# Сортировка версий и выбор самой старшей
$check = Process-OfficeVersions -versions $versions
Write-Debug "debug_Process-OfficeVersions $check"
if ($check -eq $false) {$officeReinstall = $false}elseif ($check -eq $true) {$officeReinstall = $true}
# Информация о лицензии (тест!)
function Get-MSOfficeProductKey { $product = @(); $path = "HKLM:\SOFTWARE\Microsoft\Office\"; try { if (-not (Test-Path $path -ErrorAction Stop)) { throw "The registry path $path does not exist." } } catch { Write-Host $_.Exception.Message; return }; $subkeys1 = Get-ChildItem -Path $path; foreach ($subkey1 in $subkeys1) { $subkeys2 = Get-ChildItem -Path $subkey1.PSPath; foreach ($subkey2 in $subkeys2) { try { $subkeys3 = Get-ChildItem -Path $subkey2.PSPath } catch { break }; foreach ($subkey3 in $subkeys3) { try { if ($subkey3 -notmatch "Registration") { break }; $properties = Get-ItemProperty -Path $subkey3.PSPath -ErrorAction Stop; try { if ($digitalProductID = Get-ItemProperty -Path $subkey3.PSPath -Name "DigitalProductID" -ErrorAction SilentlyContinue) { $digitalProductID = $true } else { $digitalProductID = $false } } catch { $digitalProductID = $false; Write-Host "" -NoNewline } ;if ($digitalProductID) { $temp = New-Object PSObject -Property @{ ComputerName = $env:COMPUTERNAME; ProductName = $null; ProductKey = $null }; $productName = Get-ItemProperty -Path $subkey3.PSPath -Name "ProductNameNonQualified"; $temp.ProductName = $productName.ProductNameNonQualified; $data = Get-ItemProperty -Path $subkey3.PSPath -Name "digitalproductid"; $valueData = ($data.digitalproductid)[52..66]; $productKey = ""; $chars = "BCDFGHJKMPQRTVWXY2346789"; for ($i = 24; $i -ge 0; $i--) { $r = 0; for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $valueData[$j]; $valueData[$j] = [math]::Truncate($r / 24); $r = $r % 24 }; $productKey = $chars[$r] + $productKey; if (($i % 5) -eq 0 -and $i -ne 0) { $productKey = "-" + $productKey } }; $temp.ProductKey = $productKey; $product += $temp } } catch { Write-Warning "Error accessing registry key: $_" } } } }; return $product }; $lic = Get-MSOfficeProductKey; Write-Host $lic; Write-Host ""; $osppPaths = @("%SystemDrive%\Program Files (x86)\Microsoft Office\Office15","%SystemDrive%\Program Files\Microsoft Office\Office15","%SystemDrive%\Program Files (x86)\Microsoft Office\Office16","%SystemDrive%\Program Files\Microsoft Office\Office16","%SystemDrive%\Program Files (x86)\Microsoft Office\root\Office16","%SystemDrive%\Program Files\Microsoft Office\root\Office16"); try { if (-not $officeInstallLocation -or -not (Test-Path "$officeInstallLocation\ospp.vbs")) { foreach ($path in $osppPaths) { $osppPath = [Environment]::ExpandEnvironmentVariables($path); if (Test-Path "$osppPath\ospp.vbs") { $officeInstallLocation = $osppPath; break } } } if ($officeInstallLocation) { $dstatusOutput = & cscript "$officeInstallLocation\ospp.vbs" /dstatus; $dstatusLines = $dstatusOutput -split "`n"; $dstatusLines = $dstatusLines[4..($dstatusLines.Length - 3)]; $dstatus = $dstatusLines -join "`n"; Write-Host $dstatus } else { Write-Host "ospp.vbs not found." } } catch { Write-Host "Error: $_" }
#if ($officeInstallLocation) { $activation_kms_host_Output = & cscript "$officeInstallLocation\ospp.vbs" /sethst:${kms}; $activation_Output = & cscript "$officeInstallLocation\ospp.vbs" /act; Write-Host "ACT: ${activation_kms_host_Output} ${activation_Output}"}
# Обработка логики установки Microsoft Office
try { Process-OfficeInstallation -productName $productName -officeReinstall $officeReinstall -system_osbit $system_osbit -office2013_il $office2013_il -office2016_il $office2016_il -office2019_il $office2019_il -latestVersion $latestVersion -ConfigFilePath2016 $ConfigFilePath2016 -SetupExePath2016 $SetupExePath2016 -ConfigFilePath2021 $ConfigFilePath2021 -SetupExePath2021 $SetupExePath2021 -reinstallvisio $reinstallvisio -reinstallproject $reinstallproject
} catch { Write-Host "ERROR: $($_.Exception.Message)" }
Stop-Logging
Куда установщик пишет лог ?
Пробую создать установку из сети, с первой попытки он удалил предыдущие версии, а ничего не установил. При повторном запуске, сразу завершается.
О, все не нада. Получилося !)
пришлите пожалуйста ваш батник на установку с логированием.
Вам нужно включить логирование в XML файле конфигурации, которую вы создали. В нем указывается путь к каталогу, в который нужно писать логи установки Office:
Типа такого:
Здравствуйте!
Купили 2019 офис стандард, насколько я понял, в нем нет Визио и Прожекта. В XML файле есть ключи для установки этих продуктов. Что с ними делать? Планирую изменить язык для основных компонентов на русский, а у визио и прожекта тоже менять или их удалить из списка?
Спасибо!
У вас volume (корпоративная) редакция Office 2019? ODT используется для развертывания только volume редакций. Вы сами решаете какие продукты ставить, если не нужны- удаляйте параметры для project и visio. Язык тоже меняйте. Лучше всего формировать xml файл с параметрами установки на сайте Microsoft по ссылке в статье.
День добрый.
подскажите в чем разница офиса 365 и офиса 2019?
API — офиса 365 и офиса 2019 одинаковые или нет?
По сути отличия в модели распространения — по подписке или разово. Ну и office 365 быстрее развивается, апгрейд фич идет постоянно.
по api скорее всего не будет отличий
Здравствуйте. А где мне взять сам дистрибутив Office VOL. Любую версию. Потестить бы.?
А подскажите, когда я сформировал xml через https://config.office.com/deploymentsettings то у меня автоматически подставился какой то KMS ключ, что это за ключ? при этом я вижу что офис не активирован, просит активацию — это типа пробного периода или как?
офис выбрал я стандартный 2019 — корпоративная лицензия
Думаю там у вас указан GVLK ключ (общедоступный ключ), который предполагает, что данный продукт будет активироваться на KMS серере.
Подробнее об этом:
https://winitpro.ru/index.php/2019/08/14/kms-aktivaciya-ms-office-volume-license/
https://winitpro.ru/index.php/2015/03/13/faq-po-kms-aktivacii-produktov-microsoft/
Добрый вечер!
Сейчас скачать не получится? Майкрософт гаечки закрутил?
только через VPN
Спасибо
setup.exe версии 16.0.14729.20228 загружает без vpn
Напомните, что за канал Perpetual Enterprise ?
Нигде не могу найти информацию
Он только для активации по KMS (Volume)?
Помогите настроить xml
если я указываю
то после установки у меня в сведениях о продукте говорится что установлено Windows 365 и Office ProPlus2021
Это так и должно быть? или файл конфигурации неправильный?
Смотрите в XML файле что у вас в Product ID.
Для установки 2019 офиса должно быть ProPlus2019Volume
Из России доступен еще этот сервис?
Работает, но санкции действуют. для обхода перед запуском нужно выполнять несколько команд:
#Получить текущее значение GeoId
$oldGeoID=(Get-WinHomeLocation).GeoId
#Сменить GeoID на USA
Set-WinHomeLocation -GeoId 244
#Удалить несколько разделов в реестре
Remove-Item -Path HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\Experiment -Recurse -Force -ErrorAction Ignore
Remove-Item -Path HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\ExperimentConfigs -Recurse -Force -ErrorAction Ignore
Remove-Item -Path HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\ExperimentEcs -Recurse -Force -ErrorAction Ignore
После окончания установки, вернуть предыдущий GeoID:
Set-WinHomeLocation -GeoId $oldGeoID
https://winitpro.ru/index.php/2020/01/27/kak-vyborochno-ustanovit-prilozheniya-v-office/
Спасибо, сработало. А не подскажете, эти танцы только при скачивания файлов установки с CDN? При последующей установки на пользовательские ПК из сетевой шары не надо будет каждый раз проделывать?
Вроде было нормально, это будет локальная установка.
Здравствуйте, столкнулся с такой проблемой. При установки skype для бизнеса выдается ошибка:
«Во время работы установщика Microsoft Office возникла проблема, так как на компьютере используются программы Office, установленные с помощью технологии «нажми и работай». А именно:
Microsoft Office для дома и бизнеса 2021 — ru-ru
Версии программ Office, установленные с помощью установщика Windows и технологии «нажми и работай», несовместимы — на компьютере можно установить только один тип приложений. Попробуйте установить набор Office версии «нажми и работай» или удалите программы Office, установленные с помощью этой технологии, и повторите попытку.»
Прошу помощи в установке skype для бизнеса.
На одной машине нельзя одновременно работать с версиями Office, установленными с помощью технологии «нажми и работай» и с помощью MSI-пакета. Надо отметить, что начиная с версии 2019, не существует MSI-установщика для MS Office. Скайп для бизнеса, по сути, считается частью MS Office и он на MSI-установщике. Входил, если не ошибаюсь, в пакет 2016-го. К слову, заменен Teams. Поправьте меня, если вдруг ошибаюсь.
Да, все верно. Тоже уже нашел такую информацию((
всем привет . чет не получается у меня установить с компа. постоянно ломится в сеть для скачивания офиса. прописывал (<Add SourcePath="С:\Office_21\Office_21_vl" OfficeClientEdition="64" Channel="PerpetualVL2021")
все равно ломится качать, будто команда и не прописана . кто-то покажите как у вас в xml описано чтоб не ломился на внешку при установке, ато уже голову сломал . с сменой геопозиции все ставится но так не-интересно постоянно скачивать.
SourcePath пропиши сетевой, а не локальный.
SourcePath для того и нужен, чтобы сетевое расположение указывать. Если локально, то параметр лишний.
Всеравно пытается скачать с CDN. А ключь ( /configure) корректный при установке с локального источника?
Ключ Configure — для установки. Откуда установить, если расположение сетевое, указывается через SourcePath. Если локально — SourcePath не нужен. Вот мой конфиг для установки.
Работает это следующем образом. В cmd от админа переходишь в папку где лежат Setup и Config
1. setup.exe /download Configuration.xml - Скачиваешь (займет определенное время, рядом с Install.exe появится папка Office с установочными файлами)
2. setup.exe /configure Configuration.xml - устанавливаешь
Если это все целиком скопировать на другой пк, флешку и тд, просто запускаешь setup.exe /configure Configuration.xml (никуда ходить не будет, можешь даже ради эксперимента вырубить инет)
Если хочешь по локалке устанавливать, добавляешь в конфиг SourcePath с путем в виде сетевого пути.
Надеюсь ответил)
Ответил спасибо за помощь. В моем odt все уже по несколько раз переделывалось. И все вырезал дополнительно чтоб исключить ракс обновления висио и тд. . Есть предположение что антивирус что-то снёс. Скачаю новый и сверю с тем что есть. Потому что как-то странно в трех сосна заблудиться.
а с локального не взлетит ?
Похоже, Microsoft удалил у себя дистрибутив Office 2019 Standard MAK. Программа развёртывания не может найти файл для скачивания.
Может есть у кого архив дистрибутива или ISO образ для Office 2019 Standard MAK? Поделитесь.
Ребят! Подскажите пожалуйста, а еще есть возможность установки 2019 Enterprise? А то еще в январе ставили и все работало. Сейчас пытаемся и выдает ошибку. Хотя и места и всего достаточно. Что не так?
Возможно CDN Microsoft блокирует доступ из ru и by сегментов.
Как обойти — описано тут:
https://winitpro.ru/index.php/2020/01/27/kak-vyborochno-ustanovit-prilozheniya-v-office/
Ребята помогите. Кому-нибудь удалось установить свежий office 2019 VL через odt (setup.exe /configure)? Скачал через odt последнюю версию 2019 VL (setup.exe /download), но setup не хочет ее ставить: тупит минуту где то и потом в окошке после надписи Get Ready жалуется на отсутствие подключения к Интернету. Ключи реестра удалял перед попыткой установки по мануалу о смене региона — не помогло. Может в виндах с русским регионом/или выбранным при загрузке Office русским языком блокируется установка?
Пробовал эти же файлы через office plus tool установить и все норм, но в ней только граф интерфейс, а нужно «по тихому». Ну и если кто знает как свой setup.exe собрать, киньте статью/инфу.
*Заметил, что при развертывании через office plus tool выводится сообщение об отсутствии цифр подписи в файле setup.exe