Продолжаю серию статей по администрированию операционной системы Windows. В предыдущей статье работа велась с пакетами обновлений, а в этой с компонентами системы. Дополнительные компоненты расширяют функциональные возможности ОС, но многие из них попросту бесполезны для большинства пользователей. Я предлагаю удобный скрипт отключающий «ненужные» компоненты. Команды скрипта обращаются к средствам DISM и могут быть применимы как к установленной системе, так и к автономному образу. Скрипт определяет версию утилиты dism.exe и подставляет нужные команды. Реализовано ветвление по версии целевой ОС, таким образом что в одном скрипте можно указать отключаемые компоненты для разных версий Windows.

Отключение компонентов данным скриптом обратимо. Я делаю это главным образом для того, чтобы убрать из меню Пуск ссылки на ненужные мне программы. Здесь для примера указано по два компонента для каждой версии Windows, которые будут отключены. Тем, кто будет использовать данный скрипт в своей работе, необходимо дополнить его. Определите компоненты, которые вам не понадобятся и добавьте их отключение в скрипт. Путём нехитрых изменений, можно наоборот — включать компоненты. Для своих нужд Я оставляю только Internet Explorer, Media Player, Windows Search и .NET Framework 3.5.1. Последний отключён производителем в новых версиях Windows, с удалением файлов, и чтобы его включить у меня есть отдельный скрипт, о котором Я напишу позже.

Скрипт


@echo off
title Disabling features in Windows image

set _file=install.wim
set _img=Online
set _mnt=mount
set _tool=7
set _word=Wim

dism /English /LogLevel:1 /Get-Help | find "Version: 6.1" > nul || set _tool=8
if %_tool% GTR 7 set _word=Image

:pre_menu
cls
if not exist %_file% goto :version
dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file%
echo -------------------------------------------------------------------------------
if %ERRORLEVEL% NEQ 0 pause & exit
set /p _ind=Input index or press [Enter] for quit: || exit
if %_ind% EQU 0 goto :version
if %_ind% GTR 0 if %_ind% LEQ 24 goto :ind_menu
goto :pre_menu

:ind_menu
cls
dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file% /Index:%_ind%
echo -------------------------------------------------------------------------------
if %ERRORLEVEL% NEQ 0 pause & goto :pre_menu
choice /c abcdefghijklmnopqrstuvwxyz /n /m "Mount selected image? [m] "
if %ERRORLEVEL% EQU 13 goto :mount
goto :pre_menu

:version
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 6.1" > nul && goto :disable-7
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 6.3" > nul && goto :disable-9
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 10" > nul && goto :disable-A
goto :unmount

:disable-7
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: WindowsGadgetPlatform
call :state WindowsGadgetPlatform &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:WindowsGadgetPlatform /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: MediaCenter
call :state MediaCenter &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:MediaCenter /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount

:disable-9
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: Printing-Foundation-Features
call :state Printing-Foundation-Features &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:Printing-Foundation-Features /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: Windows-Defender-Default-Definitions
call :state Windows-Defender-Default-Definitions &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:Windows-Defender-Default-Definitions /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount

:disable-A
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: MicrosoftWindowsPowerShellV2Root
call :state MicrosoftWindowsPowerShellV2Root &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:MicrosoftWindowsPowerShellV2Root /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: NetFx4-AdvSrvs
call :state NetFx4-AdvSrvs &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:NetFx4-AdvSrvs /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount

:state
findstr %1 %TEMP%\features.txt | find "Enable" > nul
exit /b

:mount
cls
md %_mnt%
dism /English /LogLevel:1 /Mount-%_word% /%_word%File:%_file% /Index:%_ind% /MountDir:%_mnt%
if %ERRORLEVEL% NEQ 0 rd %_mnt% & pause & exit
set _img=Image:%_mnt%
goto :version

:unmount
cls
if not %_img%==Online (
dism /English /LogLevel:1 /Unmount-%_word% /MountDir:%_mnt% /Commit
rd %_mnt%
)
set _img=Online
goto :pre_menu

Использование


Данный скрипт может отключать компоненты как в онлайн системе так и в автономном образе. Если в папке запуска отсутствует файл образа — install.wim, то скрипт выполняет отключение компонентов в полностью автоматическом режиме. Если в папке запуска присутствует файл образа — install.wim, то скрипт выполняет считывание из него информацию об имеющихся «индексах» и предлагает ввести номер. После этого отображается расширенная информация о выбранном «индексе» выдаётся запрос на монтирование. Нажатие любой клавиши приводит к возврату, а нажатие клавиши [m] запускает следующую цепочку действий: монтирование образа, отключение компонентов, размонтирование образа, возврат в меню выбора «индеска». После чего можно выбрать другой «индекс» для отключения компонентов. Выбор «индекса» под номером 0 запускает отключение компонентов на «живой» ОС.

Разбор кода


Вначале командой set происходит установка переменных. Можно изменить предполагаемое имя файла образа install.wim (например, на install.esd). Можно изменить имя папки монтирования или задать путь, если папка монтирования должна находится за пределами папки запуска. От установки «уровня» логирования, как в предыдущем скрипте по пакетам обновления, решил отказаться и напрямую прописал во всех командах информирование только об ошибках — /LogLevel:1. Также во всех командах добавил ключ /English чтобы все сообщения отображались на английском языке.

Скрипт может быть запущен на разных версиях ОС, и таким образом обращаться к разным версиям системы DISM, которые отличаются набором команд. Так, в версиях после 6.1 во всех командах, слово Wim заменено на Image, хотя и оставлены старые «наименования» команд для обратной совместимости. В самом начале работы скрипта определяется версия утилиты dism.exe и в дальнейшем во все команды подставляется нужное слово. Без определения версии можно было бы и обойтись, но данный функционал Я использую в своём скрипте по получению информации из образа Windows, поэтому просто не стал переписывать код.

:pre_menu


Предварительное меню. Получение основной информации о wim-файле с контролем ошибок. Если отсутствует файл образа, то запуск в режиме Online. Не нашел информацию о максимальном количестве «индексов» в одном образе и установил значение 24.

:ind_menu


Индексное меню. Получение расширенной информации о выбранном «индексе» в wim-файле с контролем ошибок. Предложение смонтировать «индекс».

:version


Определение версии целевой системы. Если находится необходимая строка, то осуществляется переход к указанной метке. Если строка не обнаруживается, то происходит размонтирование.

:disable-7 :disable-9 :disable-A


Метки целевых систем обслуживания. Я называю Windows 8.1 — девяткой, а Windows 10 — Windows A (кто в теме тот поймёт), поэтому такие имена у меток. Вначале данного блока происходит запрос состояния всех компонентов с сохранением в файл features.txt. В дальнейшем, чтобы ускорить процесс отключения и не пытаться отключить то, что и так отключено, происходит предварительная проверка состояния каждого компонента. В конце блока — удаление временных файлов и размонтирование.

:state


Проверка состояния компонента. Псевдо-функция, возвращающая результат по коду ошибки в глобальную переменную %ERRORLEVEL%. Строка с именем компонента ищется в файле features.txt и если находится и также обнаруживается слово «Enable», то сигнал к отключению.

:mount


Монтирование образа. Предварительно создаётся папка монтирования. Контроль ошибок. Изменяется переменная определяющая спецификацию образа, теперь указывает на путь к автономному образу.

:unmount


Размонтирование образа. Если выполнялось интерактивное обслуживание (/Online), то размонтировать не нужно. Возвращение переменных к исходным значениям.

Возможные проблемы


При обслуживании образа вышестоящей версии на системе нижестоящей версии возможны зависания и ошибки. То есть, не нужно пытаться на Windows 7 обрабатывать файл образа Windows 8.1 или 10. Также для успешного выполнения всех команд требуется отключить Контроль учётных записей — параметр EnableLUA установить в значение 0.

Вопрос


Отключаю все компоненты связанные с печатью и при этом мой принтер продолжает печатать, а сканер — сканировать. Предполагаю, что компоненты печати (например Printing-Foundation-Features и д.р.) используются для расширенных возможностей — например, для установки принтера доступным по сети. Так ли это?

Комментарии (13)


  1. osipov_dv
    25.12.2017 17:49
    -1

    Статья про троллейбус из буханки


  1. andreili
    25.12.2017 19:52

    Добро пожаловать в DISM++, где всё (и даже больше) есть «из коробки». И интерфейс там вполне понятен, вся система настраивается (ну ладно, почти вся).


    1. Ostan Автор
      25.12.2017 21:34

      Я знаю об этой программе. Но! Это стороннее средство, а Я использую инструмент предоставляемый «производителем». Имея готовые скрипты «обработать» автономный образ можно значительно быстрее, чем кликать мышкой по кнопкам. DISM++ больше подходит для тонкой настройки онлайн образа.


  1. akadone
    26.12.2017 01:15

    Я делаю это главным образом для того, чтобы убрать из меню Пуск ссылки на ненужные мне программы

    А не проще установить нормальное меню пуск и больше не париться по этой проблеме вообще?


    1. maxzhurkin
      26.12.2017 03:45

      Вы упустили те моменты, что статья не именно про меню пуск и что речь идёт не о модификации установленной системы (хотя и она возможна), а о модификации образа для установки


      1. akadone
        26.12.2017 06:11

        Интегрировать нормальный пуск в дистрибутив — сам Билл Гейтс велел. В том-же win 10 целый квест бывает запустить какую-то недавно установленную программу.


        1. maxzhurkin
          26.12.2017 19:22

          Билл Гейтс!? Не он ли в том числе приложил руку к тому, что его дезинтегрировали?


  1. rbobot
    26.12.2017 08:21
    -1

    Писать в 2к17 на batch, вместо прекрасного Powershell — моветон.


    1. Ostan Автор
      26.12.2017 08:30

      Я себе поставил задачу и решил её доступным мне способом. Мне лично PS не понравился — монстрообразный инструмент с огромным количеством команд (командлетов), запомнить которые нереально, а запуск с повышением прав это вообще изощрение. Поэтому Я не гонюсь за модой.


  1. citleon1
    26.12.2017 18:59

    Прикольный скрипт. А на Windows Server 2016 Вы его пробовали запускать?


    1. Ostan Автор
      26.12.2017 19:00

      Нет, но проблем быть не должно. Попробуйте и напишите о результате.


    1. dr_martins
      28.12.2017 09:06

      DISM++, упомянутый выше, работает норм на Windows Server 2016. В любом из вариантов ОБЯЗАТЕЛЬНО делай бэкап, например Acronis'ом


  1. perlestius
    27.12.2017 18:32

    Почему у Вас в статье местоимение "я" везде с заглавной буквы?