Сегодня речь пойдёт об одной из самых мощных и недооценённых функций Windows — Features on Demand (FoD). Если ты системный администратор, занимаешься корпоративным развёртыванием Windows на 100+ компьютерах, DevOps-инженер, который оптимизирует образы Windows для облака, или опытный пользователь, который хочет сэкономить 2-5 ГБ дискового пространства и ускорить загрузку системы, эта статья для тебя.
Features on Demand позволяет устанавливать дополнительные компоненты (NET Framework, RSAT инструменты, Media Pack, Hyper-V) без полной переустановки Windows, и самое главное — автоматизировать этот процесс через PowerShell и групповые политики. В этой статье я разберу механику FoD, покажу, как использовать Features on Demand для оптимизации системы, дам готовые PowerShell-скрипты для автоматического управления, расскажу о корпоративном развёртывании через WSUS и групповые политики, и объясню, почему правильное управление FoD может сэкономить тебе недели на администрировании сотен компьютеров. 💻
Что такое Features on Demand (FoD)? Архитектура 🏗️
Features on Demand — это архитектура в Windows, которая позволяет устанавливать дополнительные компоненты и функции без необходимости полной переустановки ОС. Вместо того, чтобы включать все компоненты в базовый образ Windows (что увеличивает размер до 20-30 ГБ), FoD позволяет загружать только то, что нужно. Это особенно важно для облачных сервисов, где каждый ГБ образа = дополнительные затраты на хранилище. ✨
Механика Features on Demand
Источники FoD: Microsoft хранит FoD компоненты на нескольких серверах и может доставлять их через интернет, Windows Update, WSUS, или локальный серверный ресурс (для корпоративных сетей без интернета).
Процесс установки FoD: Когда ты запрашиваешь установку компонента через DISM, PowerShell или графический интерфейс, система скачивает только необходимые файлы (обычно 50-500 МБ вместо гигабайтов), устанавливает их в правильные директории ОС, регистрирует в реестре и не требует перезагрузки в большинстве случаев. 🔌
Версии и требования FoD
Windows 10 (версия 2004+): Поддержка FoD расширена, доступны сотни компонентов.
Windows 11: Полная поддержка FoD, более оптимизированы источники загрузки.
Windows Server 2019/2022: Серверные компоненты доступны через FoD, включая RSAT, Hyper-V.
Требования: Интернет-соединение для загрузки компонентов (можно использовать локальные источники), 50 МБ - 5 ГБ свободного места в зависимости от компонента.
Архитектура доставки FoD
Метод 1: Через Windows Update — Windows автоматически скачивает компоненты через WSUS или Microsoft серверы. Медленнее, но надёжно.
Метод 2: Через локальный источник — Администратор подготавливает FoD пакеты на локальном сервере, машины скачивают оттуда. Самый быстрый для корпоративных сетей.
Метод 3: Через WSUS (Windows Server Update Services) — WSUS сервер кеширует FoD пакеты и раздаёт клиентам. Оптимально для больших сетей.
Метод 4: Через PowerShell и DISM — Прямое указание источника пакетов. Максимальный контроль.
Топовые Features on Demand для разных сценариев ⭐
FoD 1: NET Framework (все версии)
Назначение: Поддержка legacy приложений, которые используют .NET 3.5, 4.5, 4.7.
Размер: 150-300 МБ в зависимости от версии.
Когда нужен: Для старого ПО, которое не портировано на .NET Core/.NET 5+.
Команда установки:
# Установить NET Framework 3.5
Add-WindowsCapability -Online -Name "NetFx3~~~~"
# Установить NET Framework 4.8
Add-WindowsCapability -Online -Name "NetFx4.8~~~~"
Параметр NetFx3~~~~ означает установку NET Framework 3.5 через FoD из интернета.
Параметр NetFx4.8~~~~ означает установку NET Framework 4.8.
Тильды ~~~~ — это символ подстановки, означающий "любая версия" (система найдёт последнюю доступную).
─────────────────────────────
FoD 2: RSAT (Remote Server Administration Tools)
Назначение: Инструменты удалённого администрирования для управления Active Directory, DNS, DHCP, Group Policy с рабочей станции.
Размер: 200-500 МБ в зависимости от набора инструментов.
Когда нужен: Для администраторов сетей, которые управляют серверами с локального ПК.
Команда установки:
# Установить полный RSAT
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~"
Add-WindowsCapability -Online -Name "Rsat.GroupPolicy.Management.Tools~~~~"
Add-WindowsCapability -Online -Name "Rsat.Dns.Tools~~~~"
Add-WindowsCapability -Online -Name "Rsat.ServerManager.Tools~~~~"
Каждая команда установит отдельный компонент RSAT.
Для установки всех RSAT сразу через PowerShell создай скрипт, который перебирает все компоненты.
─────────────────────────────
FoD 3: Media Feature Pack
Назначение: Поддержка медиа-форматов (MP3, MPEG-4, H.264, H.265 codec). Без этого Windows не может воспроизводить видео и музыку.
Размер: 200-400 МБ.
Когда нужен: На домашних ПК и рабочих станциях для просмотра видео.
Важно: Windows Server и N-версии Windows (Windows N, Windows Pro N) поставляются без Media Feature Pack по причинам лицензирования. На них нужно устанавливать FoD для видео.
Команда установки:
# Установить Media Feature Pack
Add-WindowsCapability -Online -Name "MediaFeatures~~~~"
После установки требуется перезагрузка для активации кодеков.
─────────────────────────────
FoD 4: Hyper-V Guest Integration Components
Назначение: Интеграция гостевой ОС с хозяйской машиной Hyper-V (улучшенная видеокарта, интернет, обмен файлами).
Размер: 50-100 МБ.
Когда нужен: На виртуальных машинах, работающих на Hyper-V для оптимальной производительности.
Команда установки:
# Установить Hyper-V Integration Components
Add-WindowsCapability -Online -Name "Hyper-V-Guest-Integration-Components~~~~"
Требуется перезагрузка.
─────────────────────────────
FoD 5: Language Support (язык, раскладка, шрифты)
Назначение: Поддержка дополнительных языков: русский, китайский, арабский, и т.д. с раскладками и шрифтами.
Размер: 100-300 МБ на каждый язык.
Когда нужен: На международных компьютерах или для пользователей, которые работают на нескольких языках.
Команда установки:
# Установить русский язык
Add-WindowsCapability -Online -Name "Language.Basic~~~ru-RU~"
Add-WindowsCapability -Online -Name "Language.Fonts.Arab~~~"
Add-WindowsCapability -Online -Name "Language.Fonts.Cyrl~~~"
# Установить китайский язык
Add-WindowsCapability -Online -Name "Language.Basic~~~zh-CN~"
Тильды и язычные коды (ru-RU, zh-CN) указывают, какой язык устанавливается.
─────────────────────────────
FoD 6: Sandbox (Windows Sandbox)
Назначение: Лёгкая виртуализация для изоляции приложений. Запусти любое приложение в изолированной среде, и при закрытии Sandbox всё удалится, включая вирусы.
Размер: 100-200 МБ.
Когда нужен: На ПК разработчиков и тестировщиков для безопасного тестирования неизвестного ПО.
Требования: Windows 10 Pro/Enterprise или выше, процессор с виртуализацией (Hyper-V).
Команда установки:
# Установить Windows Sandbox
Add-WindowsCapability -Online -Name "Containers.GameRuntime~~~~"
# или
Enable-WindowsOptionalFeature -Online -FeatureName "Containers-DisposableRuntime" -All -NoRestart
Требуется перезагрузка для активации.
─────────────────────────────
FoD 7: PowerShell ISE (Integrated Scripting Environment)
Назначение: IDE для написания и отладки PowerShell скриптов. В Windows 11 предпочитают VSCode, но ISE всё ещё используется.
Размер: 50-100 МБ.
Когда нужен: Для администраторов, которые пишут PowerShell скрипты.
Команда установки:
# Установить PowerShell ISE
Add-WindowsCapability -Online -Name "Rsat.Powershell.Ise~~~~"
─────────────────────────────
FoD 8: OLE DB Provider (для старых баз данных)
Назначение: Поддержка старых баз данных (MS Access, старых версий SQL Server) через OLE DB.
Размер: 20-50 МБ.
Когда нужен: На ПК, где используется legacy ПО с доступом к базам через OLE DB.
Команда установки:
# Установить OLE DB Provider
Add-WindowsCapability -Online -Name "OLEDB.Provider~~~~"
🔖Дорогие гости и подписчики канала. Если наши материалы приносят вам пользу, вы всегда можете поддержать команду символическим переводом. Любая помощь мотивирует писать для Вас больше полезного и качественного контента безо всяких подписок.🙏🤝🙏🤝🙏
💰ПОДДЕРЖАТЬ КАНАЛ МОЖНО ТУТ ( ОТ 50 РУБЛЕЙ )💰
Или сделать любой перевод по QR-коду через СБП. Быстро, безопасно и без комиссии.(Александр Г.)
С уважением, Команда "Т.Е.Х.Н.О Windows & Linux".
Управление FoD через PowerShell: полный гайд 🔧
Команда 1: Получить список всех доступных FoD
# Получить список всех доступных FoD компонентов
Get-WindowsCapability -Online | Select-Object Name, State | Format-Table
# Получить только установленные FoD
Get-WindowsCapability -Online | Where-Object {$_.State -eq "Installed"} | Select-Object Name
# Получить только доступные (но не установленные) FoD
Get-WindowsCapability -Online | Where-Object {$_.State -eq "NotPresent"} | Select-Object Name
# Получить FoD, которые содержат слово "NET" (для поиска NET Framework)
Get-WindowsCapability -Online | Where-Object {$_.Name -like "*NET*"} | Select-Object Name, State
Параметр Online означает, что мы работаем с текущей системой. Можно также использовать Offline -Path для работы с образом на диске.
Параметр State может быть: "Installed" (установлено), "NotPresent" (доступно, но не установлено), "Retired" (больше не поддерживается).
─────────────────────────────
Команда 2: Установить конкретный FoD
# Базовая установка NET Framework 3.5
Add-WindowsCapability -Online -Name "NetFx3~~~~"
# Установка с указанием источника (локальный путь)
Add-WindowsCapability -Online -Name "NetFx3~~~~" -Source "E:\FoD"
# Установка с указанием источника через WSUS сервер (для корпоративных сетей)
Add-WindowsCapability -Online -Name "NetFx3~~~~" -Source "\\wsus-server\FoD"
# Установка с подавлением запроса на перезагрузку
Add-WindowsCapability -Online -Name "NetFx3~~~~" -NoRestart
Параметр Source критически важен для корпоративных сетей без интернета. Указываешь путь, где хранятся FoD пакеты.
Параметр NoRestart не требует перезагрузки (хотя для некоторых компонентов она нужна).
─────────────────────────────
Команда 3: Удалить FoD
# Удалить NET Framework 3.5
Remove-WindowsCapability -Online -Name "NetFx3~~~~"
# Удалить RSAT
Remove-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~"
# Удалить с подавлением запроса на перезагрузку
Remove-WindowsCapability -Online -Name "NetFx3~~~~" -NoRestart
Команда 4: Проверить статус установки FoD
# Проверить статус конкретного FoD
Get-WindowsCapability -Online -Name "NetFx3~~~~" | Select-Object Name, State, Description
# Получить информацию о размере FoD
Get-WindowsCapability -Online -Name "NetFx3~~~~" | Select-Object Name, @{Name="Size";Expression={$_.Size}}
PowerShell-скрипт для автоматического управления FoD 🚀
Вот универсальный скрипт, который устанавливает, удаляет или проверяет статус FoD компонентов:
# manage-fod.ps1
# Автоматическое управление Features on Demand в Windows
param(
[Parameter(Mandatory=$false)]
[ValidateSet("Install", "Remove", "List", "Report")]
[string]$Action = "List",
[Parameter(Mandatory=$false)]
[array]$Components = @(),
[Parameter(Mandatory=$false)]
[string]$Source = $null,
[Parameter(Mandatory=$false)]
[switch]$NoRestart
)
# Проверка прав администратора
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) {
Write-Host "Ошибка: требуются права администратора!" -ForegroundColor Red
exit 1
}
# Определение стандартных компонентов для разных сценариев
$presetComponents = @{
"Developer" = @(
"NetFx3~~~~",
"NetFx4.8~~~~",
"Rsat.Powershell.Ise~~~~",
"Containers-DisposableRuntime~~~~"
)
"Administrator" = @(
"Rsat.ActiveDirectory.DS-LDS.Tools~~~~",
"Rsat.GroupPolicy.Management.Tools~~~~",
"Rsat.Dns.Tools~~~~",
"Rsat.ServerManager.Tools~~~~"
)
"Multimedia" = @(
"MediaFeatures~~~~",
"DirectX.Tools~~~~"
)
"Legacy" = @(
"NetFx3~~~~",
"OLEDB.Provider~~~~"
)
}
function Install-FoD {
param(
[array]$Components,
[string]$Source,
[bool]$NoRestart
)
Write-Host "=== Установка FoD компонентов ===" -ForegroundColor Cyan
foreach ($component in $Components) {
Write-Host "`nУстанавливаю $component..." -ForegroundColor Yellow
try {
$params = @{
Online = $true
Name = $component
}
if ($Source) {
$params['Source'] = $Source
Write-Host "Источник: $Source" -ForegroundColor Gray
}
if ($NoRestart) {
$params['NoRestart'] = $true
}
$result = Add-WindowsCapability @params
if ($result.State -eq "Installed") {
Write-Host "✓ $component успешно установлен" -ForegroundColor Green
} else {
Write-Host "⚠ $component установлен, но требуется перезагрузка" -ForegroundColor Yellow
}
}
catch {
Write-Host "✗ Ошибка при установке $component : $_" -ForegroundColor Red
}
}
}
function Remove-FoD {
param(
[array]$Components,
[bool]$NoRestart
)
Write-Host "=== Удаление FoD компонентов ===" -ForegroundColor Cyan
foreach ($component in $Components) {
Write-Host "`nУдаляю $component..." -ForegroundColor Yellow
try {
$params = @{
Online = $true
Name = $component
}
if ($NoRestart) {
$params['NoRestart'] = $true
}
Remove-WindowsCapability @params
Write-Host "✓ $component успешно удалён" -ForegroundColor Green
}
catch {
Write-Host "✗ Ошибка при удалении $component : $_" -ForegroundColor Red
}
}
}
function List-FoD {
Write-Host "=== Доступные FoD компоненты ===" -ForegroundColor Cyan
$allCapabilities = Get-WindowsCapability -Online
Write-Host "`nУстановленные:" -ForegroundColor Green
$allCapabilities | Where-Object {$_.State -eq "Installed"} | ForEach-Object {
Write-Host " ✓ $($_.Name)" -ForegroundColor Green
}
Write-Host "`nДоступные для установки:" -ForegroundColor Yellow
$allCapabilities | Where-Object {$_.State -eq "NotPresent"} | ForEach-Object {
Write-Host " - $($_.Name)" -ForegroundColor Yellow
}
}
function Generate-Report {
Write-Host "=== Отчёт о FoD в системе ===" -ForegroundColor Cyan
$allCapabilities = Get-WindowsCapability -Online
$installed = $allCapabilities | Where-Object {$_.State -eq "Installed"}
$available = $allCapabilities | Where-Object {$_.State -eq "NotPresent"}
Write-Host "`nОбщая информация:" -ForegroundColor Cyan
Write-Host " Всего компонентов: $($allCapabilities.Count)"
Write-Host " Установлено: $($installed.Count)"
Write-Host " Доступно: $($available.Count)"
Write-Host "`nУстановленные компоненты:" -ForegroundColor Green
$installed | ForEach-Object {
Write-Host " - $($_.Name)" -ForegroundColor Green
}
# Экспорт отчёта в файл
$reportPath = "$env:USERPROFILE\Desktop\FoD-Report-$(Get-Date -Format 'yyyy-MM-dd-HHmm').txt"
"=== FoD Report ===" | Out-File $reportPath
"Generated: $(Get-Date)" | Out-File $reportPath -Append
"`n=== Installed Components ===" | Out-File $reportPath -Append
$installed.Name | Out-File $reportPath -Append
"`n=== Available Components ===" | Out-File $reportPath -Append
$available.Name | Out-File $reportPath -Append
Write-Host "`nОтчёт сохранён: $reportPath" -ForegroundColor Cyan
}
# Основная логика скрипта
switch ($Action) {
"List" {
List-FoD
}
"Install" {
if ($Components.Count -eq 0) {
Write-Host "Предустановленные наборы:" -ForegroundColor Cyan
$presetComponents.Keys | ForEach-Object {
Write-Host " - $_"
}
Write-Host "`nПример: .\manage-fod.ps1 -Action Install -Components 'Developer'" -ForegroundColor Yellow
} else {
Install-FoD -Components $Components -Source $Source -NoRestart $NoRestart.IsPresent
}
}
"Remove" {
if ($Components.Count -eq 0) {
Write-Host "Укажи компоненты для удаления через -Components" -ForegroundColor Yellow
} else {
Remove-FoD -Components $Components -NoRestart $NoRestart.IsPresent
}
}
"Report" {
Generate-Report
}
}
Write-Host "`n=== Завершено ===" -ForegroundColor Green
Как использовать скрипт:
# Показать все доступные FoD
.\manage-fod.ps1 -Action List
# Установить NET Framework 3.5
.\manage-fod.ps1 -Action Install -Components @("NetFx3~~~~")
# Установить полный набор для администратора
.\manage-fod.ps1 -Action Install -Components @("Rsat.ActiveDirectory.DS-LDS.Tools~~~~", "Rsat.GroupPolicy.Management.Tools~~~~") -NoRestart
# Удалить компонент
.\manage-fod.ps1 -Action Remove -Components @("NetFx3~~~~")
# Генерировать отчёт
.\manage-fod.ps1 -Action Report
Канал «Каморка Программиста» — это простые разборы программирования, языков, фреймворков и веб-дизайна. Всё для новичков и практиков.
Присоединяйся прямо сейчас.
Оптимизация Windows образа через FoD для облака ☁️
При создании оптимизированного образа Windows для Azure, AWS или Hyper-V важно минимизировать размер, но оставить возможность установки компонентов позже.
Рецепт: Минимальный образ для облака
Параметр Windows Media Creation Tool: Выбери Windows 11 Pro N (версия без медиа для экономии 500 МБ).
Параметр установки в образе: Установи только базовые компоненты, уберись NET Framework, RSAT, Media Pack.
Параметр оптимизации диска: Удали временные файлы, логи, кеш Windows Update.
Параметр FoD кеширования: Скачай все необходимые FoD пакеты в образ для быстрой установки позже без интернета.
PowerShell скрипт для подготовки образа:
# prepare-minimal-image.ps1
# Подготовка минимального образа Windows для облака
Write-Host "=== Подготовка минимального образа ===" -ForegroundColor Cyan
# 1. Удалить предустановленные приложения (bloatware)
Write-Host "`n1. Удаление bloatware..." -ForegroundColor Yellow
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "Microsoft.BingSports" -or $_.Name -like "Microsoft.GetHelp"} | Remove-AppxPackage
# 2. Отключить неиспользуемые сервисы
Write-Host "`n2. Отключение сервисов..." -ForegroundColor Yellow
@(
"DiagTrack", # Diagnostic Tracking Service
"dmwappushservice", # dmwappushservice
"McpManagementService" # Mixed Reality Portal Service
) | ForEach-Object {
Stop-Service $_ -ErrorAction SilentlyContinue
Set-Service $_ -StartupType Disabled -ErrorAction SilentlyContinue
Write-Host " ✓ $_ отключен" -ForegroundColor Green
}
# 3. Очистить временные файлы
Write-Host "`n3. Очистка временных файлов..." -ForegroundColor Yellow
Remove-Item -Path "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "C:\Windows\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "C:\Windows\SoftwareDistribution\Download\*" -Recurse -Force -ErrorAction SilentlyContinue
Write-Host " ✓ Временные файлы удалены" -ForegroundColor Green
# 4. Запустить очистку диска (cleanmgr)
Write-Host "`n4. Запуск Disk Cleanup..." -ForegroundColor Yellow
cleanmgr /sageset:1
cleanmgr /sagerun:1
# 5. Отключить Hibernation (экономия 4 ГБ)
Write-Host "`n5. Отключение Hibernation..." -ForegroundColor Yellow
powercfg /h off
Write-Host " ✓ Hibernation отключена (экономия ~4 ГБ)" -ForegroundColor Green
# 6. Сжать образ системного диска (если NTFS)
Write-Host "`n6. Сжатие образа диска..." -ForegroundColor Yellow
Compact /CompactOS:always
Write-Host " ✓ Образ сжат" -ForegroundColor Green
Write-Host "`n=== Образ готов к упаковке ===" -ForegroundColor Green
Управление FoD через групповые политики в корпоративной сети 🏢
Если у тебя сеть с 100+ компьютерами, управлять FoD индивидуально невозможно. Используй групповые политики и WSUS.
Способ 1: Установка FoD через групповую политику
На контроллере домена откройте Group Policy Management Editor:
Откройте: Computer Configuration → Policies → Administrative Templates → System
Найди: "Allow installation of features on demand using Windows Update"
Установи: Enabled (разрешить автоматическую установку через Windows Update)
Способ 2: Развёртывание FoD через PowerShell Group Policy Preferences
На контроллере домена создайте новый GPO:
# На контроллере домена
New-GPO -Name "FoD-Installation-Policy"
Привяжите к нужной OU (Organizational Unit).
В GPO добавьте скрипт запуска (Computer Configuration → Policies → Windows Settings → Scripts → Startup):
Создайте PowerShell скрипт install-fod.ps1 на сетевом ресурсе:
# \\domain.com\sysvol\policies\scripts\install-fod.ps1
Write-Host "Запуск установки FoD..." -ForegroundColor Cyan
# Установить NET Framework 3.5 для всех компьютеров
Add-WindowsCapability -Online -Name "NetFx3~~~~" -Source "\\wsus-server\FoD" -NoRestart
# Установить RSAT для рабочих станций администраторов
if ((whoami /groups) -like "*Domain Admins*") {
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~" -NoRestart
Add-WindowsCapability -Online -Name "Rsat.GroupPolicy.Management.Tools~~~~" -NoRestart
}
Write-Host "FoD установлены" -ForegroundColor Green
Способ 3: Использование WSUS для распределения FoD
На WSUS сервере:
Откройте WSUS Management Console.
Перейди в Options → Update Files and Languages.
В разделе "Updates" включи "Download FoD updates".
Выбери языки и компоненты, которые нужно кешировать на сервере.
WSUS начнёт скачивать FoD пакеты. Все клиенты получат обновления с локального сервера WSUS вместо интернета.
Таблица параметров групповой политики для FoD:
Политика: "Allow installation of features on demand using Windows Update"
Путь в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
Имя параметра: NoUpdateWindowsUpdate
Тип: REG_DWORD
Значение: 0 (разрешить) или 1 (запретить)
Действие: Create/Replace
Назначение: Разрешить или запретить установку FoD компонентов через Windows Update
─────────────────────────────
Политика: "Specify intranet Microsoft update service location"
Путь в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
Имя параметра: WUServer
Тип: REG_SZ (текстовая строка)
Значение: http://wsus-server:8530 (адрес WSUS сервера)
Действие: Create/Replace
Назначение: Указать локальный WSUS сервер для загрузки обновлений и FoD вместо интернета
─────────────────────────────
Политика: "Prevent use of media features on demand"
Путь в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows
Имя параметра: MediaFeaturePackOptOut
Тип: REG_DWORD
Значение: 0 (разрешить Media Pack) или 1 (запретить)
Действие: Create/Replace
Назначение: Запретить установку Media Feature Pack в корпоративной сети (например, для безопасности)
Реальные примеры использования FoD 💡
Пример 1: DevOps-инженер создаёт минимальный образ для Azure
DevOps-инженер создаёт базовый образ Windows Server 2022 для развёртывания в Azure. Нужно минимизировать размер (каждый ГБ = доп. стоимость) и время загрузки.
Решение:
- Скачал Windows Server 2022 (1.4 ГБ базовый)
- Удалил все FoD компоненты кроме NET Framework 4.8 (для legacy приложений)
- Применил скрипт prepare-minimal-image.ps1 для удаления bloatware и очистки
- Отключил Hibernation (сэкономил 4 ГБ)
- Сжал образ через Compact.exe (ещё 300 МБ)
- Результат: Образ сократился с 5.8 ГБ до 2.1 ГБ, время загрузки в облаке сократилось на 40%
PowerShell команды:
# Проверить размер образа до оптимизации
Get-Disk | Measure-Object -Property Size
# После оптимизации перезагрузись и проверь размер
fsutil volume diskfree C:
Пример 2: Администратор корпоративной сети устанавливает RSAT через групповую политику
В корпоративной сети 250 рабочих станций Windows 10. Администраторам нужны инструменты для управления Active Directory, DNS, DHCP с их рабочих мест.
Решение:
- На WSUS сервере включил кеширование RSAT пакетов
- Создал GPO "RSAT-Installation" и привязал её к OU "IT-Administrators"
- В GPO добавил скрипт запуска PowerShell:
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~" -Source "\\wsus-server\FoD"
Add-WindowsCapability -Online -Name "Rsat.GroupPolicy.Management.Tools~~~~" -Source "\\wsus-server\FoD"
- Результат: На всех 60 ПК администраторов RSAT установился автоматически за 2 часа, без ручного вмешательства. WSUS кешировал пакеты, поэтому загрузка шла с локального сервера, а не из интернета.
Пример 3: Разработчик удаляет NET Framework 3.5 для оптимизации
Разработчик работает с современным стеком (.NET 6+) и не использует legacy приложения. Он хочет сэкономить место и ускорить загрузку ОС.
Решение:
# Проверить, какие NET Framework установлены
Get-WindowsCapability -Online | Where-Object {$_.Name -like "*NET*"} | Select-Object Name, State
# Удалить NET Framework 3.5, 4.5, 4.7 (оставить только 4.8)
Remove-WindowsCapability -Online -Name "NetFx3~~~~" -NoRestart
Remove-WindowsCapability -Online -Name "NetFx4.5~~~~" -NoRestart
Remove-WindowsCapability -Online -Name "NetFx4.7~~~~" -NoRestart
# Результат: Освобождено ~800 МБ дискового пространства
Типичные ошибки при работе с FoD 🚨
Ошибка 1: "Add-WindowsCapability: The system cannot find the specified path"
Возможная причина: FoD компонент не найден на указанном источнике, или интернета нет, и система не может скачать из Microsoft.
Решение: Указать локальный источник через параметр -Source, например -Source "E:\FoD". Для корпоративных сетей использовать WSUS сервер.
Приоритет: Высокий
─────────────────────────────
Ошибка 2: "The operation completed successfully, but some files were not found"
Возможная причина: Неполный FoD пакет или повреждённые файлы.
Решение: Переиндексировать базу компонентов: DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
Приоритет: Средний
─────────────────────────────
Ошибка 3: "Pending Restart Required"
Возможная причина: Компонент требует перезагрузки, но ты используешь -NoRestart.
Решение: Перезагрузи систему: Restart-Computer -Force. Компонент будет активирован после перезагрузки.
Приоритет: Высокий
─────────────────────────────
Ошибка 4: "The requested resource does not exist in Windows Sandbox"
Возможная причина: Windows Sandbox требует FoD Containers-DisposableRuntime, но она не установлена.
Решение: Установи компонент:
Enable-WindowsOptionalFeature -Online -FeatureName "Containers-DisposableRuntime" -All
Приоритет: Средний
─────────────────────────────
Ошибка 5: "Cannot access network path \wsus-server\FoD"
Возможная причина: Проблемы с доступом к сетевому ресурсу WSUS, неверный путь или отсутствие разрешений.
Решение: Проверить доступ: Test-Path "\\wsus-server\FoD". Убедиться, что пользователь имеет права на чтение. Проверить путь в WSUS настройках.
Приоритет: Высокий
Чек-лист для администраторов при развёртывании FoD ✅
Пункт 1: Проверил ли ты список доступных FoD для твоей версии Windows?
Важность: Критическая
Зачем: Некоторые компоненты доступны только для конкретных версий Windows
Как проверить: Get-WindowsCapability -Online | Select-Object Name, State | Format-Table -AutoSize | Out-GridView
─────────────────────────────
Пункт 2: Определил ли ты источник FoD (интернет, WSUS, локальный)?
Важность: Критическая
Зачем: Без источника установка FoD не будет работать
Как проверить: Проверить интернет-соединение, статус WSUS сервера, наличие локального хранилища FoD
─────────────────────────────
Пункт 3: Настроил ли ты WSUS для кеширования FoD, если это корпоративная сеть?
Важность: Высокая
Зачем: Для ускорения установки и экономии интернета
Как проверить: Открыть WSUS Management Console → Options → Update Files and Languages
─────────────────────────────
Пункт 4: Создал ли ты PowerShell скрипты для автоматизации установки FoD?
Важность: Высокая
Зачем: На 100+ компьютерах ручная установка невозможна
Как сделать: Используй скрипт manage-fod.ps1 из раздела выше
─────────────────────────────
Пункт 5: Настроил ли ты групповые политики для автоматической установки FoD?
Важность: Высокая (для корпоративных сетей)
Зачем: Обновления и установка FoD будут происходить автоматически
Как сделать: Создать GPO с параметром NoUpdateWindowsUpdate = 0 и скриптом запуска
─────────────────────────────
Пункт 6: Протестировал ли ты установку FoD на тестовой машине перед развёртыванием?
Важность: Критическая
Зачем: Убедиться, что компонент устанавливается корректно и не ломает систему
Как проверить: Установить на одной машине, проверить работоспособность, затем развертывать на остальных
─────────────────────────────
Пункт 7: Учёл ли ты требования к перезагрузке?
Важность: Средняя
Зачем: Некоторые FoD требуют перезагрузки, нужно спланировать это
Как проверить: Проверить документацию каждого компонента или использовать -NoRestart и перезагрузить позже
─────────────────────────────
Пункт 8: Создал ли ты резервную копию образа перед оптимизацией?
Важность: Критическая
Зачем: На случай, если что-то пойдёт не так
Как сделать: Backup-Computer или создать снимок VM перед началом работы
─────────────────────────────
Пункт 9: Документировал ли ты какие FoD компоненты установлены на каждом ПК?
Важность: Высокая
Зачем: Для аудита и поддержки
Как сделать: Запустить скрипт manage-fod.ps1 -Action Report на каждом ПК, сохранить результаты
─────────────────────────────
Пункт 10: Настроил ли ты мониторинг установки FoD в логах?
Важность: Средняя
Зачем: Отловить проблемы при установке FoD на 100+ машинах
Как сделать: Использовать Event Viewer → Windows Logs → System, фильтр по источнику "Windows Update"
Таблица сравнения FoD компонентов и их использования 📊
Компонент: NET Framework 3.5
Размер: 150-200 МБ
Время установки: 5-10 минут
Требует перезагрузку: Нет
Назначение: Поддержка legacy приложений, которые используют старый .NET
Когда устанавливать: На ПК с "боевым" ПО, которое не портировано на .NET 5+
─────────────────────────────
Компонент: RSAT (все инструменты)
Размер: 400-500 МБ (полный набор)
Время установки: 10-15 минут
Требует перезагрузку: Нет
Назначение: Управление Active Directory, DNS, DHCP, Group Policy с рабочей станции
Когда устанавливать: На ПК сетевых администраторов
─────────────────────────────
Компонент: Media Feature Pack
Размер: 200-400 МБ
Время установки: 5 минут
Требует перезагрузку: Да (для активации кодеков)
Назначение: Поддержка MP3, MPEG-4, H.264 кодеков для видео и аудио
Когда устанавливать: На домашних ПК и рабочих станциях для просмотра видео
─────────────────────────────
Компонент: Windows Sandbox
Размер: 100-200 МБ
Время установки: 10 минут
Требует перезагрузку: Да (для активации Hyper-V)
Назначение: Лёгкая виртуализация для изоляции приложений
Когда устанавливать: На ПК разработчиков для тестирования неизвестного ПО
─────────────────────────────
Компонент: Hyper-V Integration Components
Размер: 50-100 МБ
Время установки: 5 минут
Требует перезагрузку: Да
Назначение: Оптимизация гостевой ОС на Hyper-V (видео, сеть, память)
Когда устанавливать: На виртуальных машинах в Hyper-V среде
─────────────────────────────
Компонент: PowerShell ISE
Размер: 50-100 МБ
Время установки: 5 минут
Требует перезагрузку: Нет
Назначение: IDE для написания и отладки PowerShell скриптов
Когда устанавливать: На ПК администраторов и разработчиков скриптов
─────────────────────────────
Компонент: OLE DB Provider
Размер: 20-50 МБ
Время установки: 2-3 минуты
Требует перезагрузку: Нет
Назначение: Поддержка legacy баз данных (MS Access, старый SQL Server)
Когда устанавливать: На ПК, где используется очень старое ПО с Access
─────────────────────────────
Компонент: Language Support (язык)
Размер: 100-300 МБ на язык
Время установки: 5-10 минут на язык
Требует перезагрузку: Нет
Назначение: Поддержка дополнительных языков и раскладок
Когда устанавливать: На многоязычных ПК или для пользователей, работающих на разных языках
Вывод 🎯
Features on Demand (FoD) — это мощная система управления компонентами Windows, которая позволяет:
- Экономить место: Минимизировать размер образа на 30-50% путём установки только необходимых компонентов
- Автоматизировать установку: PowerShell скрипты и групповые политики делают развёртывание на 100+ машинах автоматическим
- Управлять корпоративно: WSUS и GPO позволяют контролировать FoD установку на сотнях ПК централизованно
- Оптимизировать облачные образы: Для Azure, AWS, Hyper-V минимальный образ = минимальные затраты
- Устанавливать компоненты по запросу: Без полной переустановки Windows
Для администраторов и DevOps-инженеров правильное управление FoD может сэкономить недели на администрировании и миллионы рублей на облачных услугах.
Основной инструмент — PowerShell командлет Add-WindowsCapability и Remove-WindowsCapability. Для корпоративного управления используй групповые политики, WSUS и готовые PowerShell скрипты из этой статьи. 💪
Подпишись на канал T.E.X.H.O Windows & Linux, чтобы не пропустить гайды по системному администрированию, автоматизации на PowerShell, оптимизации Windows и Linux серверов, облачным решениям и корпоративному управлению. Каждая статья проверена на реальном оборудовании и боевых задачах. 🚀
#Windows #FeaturesOnDemand #PowerShell #Администрирование #SystemAdmin #DevOps #WSUS #GroupPolicy #Оптимизация #CloudComputing #Azure #AWS #Hyper-V #NET-Framework #RSAT #Automation #Scripts #Batch #Windows-Update #Enterprise #ItManagement #Server #Deployment #образ #дискоёёвое-пространство #Performance #Скрипты 🏆