PowerShell DSC и Мастер очистки диска (cleanmgr) на win2k8r2

За время функционирования ОС windows в систему устанавливается большое количество обновлений, частично более поздние обновления заменяют более ранние, которые можно было бы и удалить (или сжать), чтобы они не занимали места на диске. Как известно, функционал очистки системы от ненужных обновлений для Win2k8r2/Win7 был почему-то интегрирован в мастер “Очистки диска” (хотя в более старших версиях ОС этот функционал интегрирован в DISM). Для того, чтобы воспользоваться мастером очистки диска для очистки от ненужных обновлений необходимо установить обновление kb2852386, если это еще не было сделано ранее, затем, вызвав мастер “Очистка диска”, “взвести галку” “Очистка обновлений windows” и произвести очистку. Вот тут нас и ожидает сюрприз: мастер “Очистка диска” по умолчанию не установлен в системе. Официально для его установки требуется доустановить компонент Desktop experience, К сожалению этот компонент содержит не только мастера “Очистки диска”, но и много других программ, которые не очень то и нужны на сервере. Существует и другой неофициальный способ установки: нужно скопировать пару файлов из папки WinSxS.

Скопировать эти файлы можно было бы и при помощи обычного startup-скрипта или GPP, но мы не ищем легких путей так же можем воспользоваться технологией Desired State Configuration   (DSС), которая позволяет нам описать желаемую конфигурацию, применить ее к серверу(серверам) и контролировать соответствие сервера заданной конфигурации.

И так, приступим:

1) Опишем желаемую конфигурацию

Configuration CleanMgr {
    param ($NodeName)
    Node $NodeName {
        File CleanMgrExe {
            Ensure = "Present"
            Type = "File"
            SourcePath = "C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.1.7600.16385_none_c9392808773cd7da\cleanmgr.exe"
            DestinationPath ="C:\Windows\System32"
        }
        File CleanMgrMUI {
            Ensure = "Present"
            Type = "File"
            SourcePath = "C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.1.7600.16385_ru-ru_02ec7949035cc80a\cleanmgr.exe.mui"
            DestinationPath ="$env:windir\System32\ru-ru"
        }
    }
}

2) Озаботимся папкой, в которую у нас попадут результаты компиляции конфигурации для каждого сервера. А попадут они в ту папку, в которой мы будем находиться на момент запуска компиляции конфигурации. Поэтому подготовим эту папку и перейдем в нее прежде чем запускать компиляцию.

#Зададим текущую папку, именно в ней буду создаваться mof-файлы при копиляции функции-конфигурации
$ConfigDir="C:\Scripts"
#если заданная папка не существует, создадим ее
if (!(Test-Path -LiteralPath "$ConfigDir")) {"Папка $ConfigDir не существует, создадим ее"; md "$ConfigDir"}
#переходим в заданную папку
cd $ConfigDir

 

3) В случае успешного перехода в заданную папку, выберем из AD все компьютеры, на которых установлена ОС Win2k8R2, и скомпилируем для каждого такого компьютера MOF-файл конфигурации.

#если переход был успешным, выполним компиляцию конфигурации для каждого Win2k8R2 сервера
if ($?) {
    #Получаем список серверов Win2k8R2
    Get-QADComputer -OSName "*Windows Server 2008 R2*"|%{
        $Compname=$_.Name
        #Если сервер пингуется, компилируем для него конфигурацию
        if (Test-Connection $Compname -Quiet -Count 1) {
            CleanMgr -NodeName $Compname
        }
    }

 

4) Последнее действие – запуск скомпилированных конфигураций на целевых компьютерах:

#Запускаем распространение всех скомпилированных конфигураций 
Start-DscConfiguration -Path C:\Scripts\CleanMgr -Wait -Verbose

 

Ну, а теперь весь скрипт целиком:

<#Конфигурация CleanMgr для win2k8r2
 Менеджер очистки диска после установки обновления kb2852386 получает возможность очищать систему от ненужных обновлений.
 Для того, чтобы получить возможность пользоваться менеджером обновлений в Win2k8R2 необходимо либо установить на него,
 либо скопировать пару файлов из папки winsxs. 
 Данная конфигурация как раз копирует два файла, необходимые для работы менеджера очистки диска из папки WinSxS в те папки,
 где они должны находится.
#>
Configuration CleanMgr {
    param ($NodeName)
    Node $NodeName {
        File CleanMgrExe {
            Ensure = "Present"
            Type = "File"
            SourcePath = "C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.1.7600.16385_none_c9392808773cd7da\cleanmgr.exe"
            DestinationPath ="C:\Windows\System32"
        }
        File CleanMgrMUI {
            Ensure = "Present"
            Type = "File"
            SourcePath = "C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.1.7600.16385_ru-ru_02ec7949035cc80a\cleanmgr.exe.mui"
            DestinationPath ="$env:windir\System32\ru-ru"
        }
    }
}
#Зададим текущую папку, именно в ней буду создаваться mof-файлы при копиляции функции-конфигурации
$ConfigDir="C:\Scripts"
#если заданная папка не существует, создадим ее
if (!(Test-Path -LiteralPath "$ConfigDir")) {"Папка $ConfigDir не существует, создадим ее"; md "$ConfigDir"}
#переходим в заданную папку
cd $ConfigDir
#если переход был успешным, выполним компиляцию конфигурации для каждого Win2k8R2 сервера
if ($?) {
    #Получаем список серверов Win2k8R2
    Get-QADComputer -OSName "*Windows Server 2008 R2*"|%{
        $Compname=$_.Name
        #Если сервер пингуется, компилируем для него конфигурацию
        if (Test-Connection $Compname -Quiet -Count 1) {
            CleanMgr -NodeName $Compname
        }
    }
#Запускаем распространение всех скомпилированных конфигураций 
Start-DscConfiguration -Path C:\Scripts\CleanMgr -Wait -Verbose
}

3 Comments

  1. Занятно, только лучше заменить квестовский командлет на родной:
    Get-ADComputer -Filter {OperatingSystem -Like “*Windows Server 2008 R2*”}

      • если использовать стандартные командлеты от MS из модуля ActiveDirectory, то надо заменить
        Get-QADComputer -OSName “*Windows Server 2008 R2*”
        на
        Get-ADComputer -Filter “OperatingSystem -like ‘*Windows Server 2008 R2*'”

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.