Совет недели (2014-04-1): Резервное копирование данных персонализации пользователей

Не так давно в комментариях к посту, посвященному международному женскому дню 8 марта, ко мне обратились с вопросом, который имел отношение к сохранению пользовательских настроек персонализации. К таким настройкам можно отнести тему рабочего стола, фоновые изображения, настройки начального экрана операционных систем Windows 8.1, которые включают в себя как макет проинсталлированных приложений, так и фон начального экрана с его элементами, а также ярлыки, которые расположены у пользователя на рабочем столе.

В принципе, эту задачу можно решить, используя перемещаемые профили, но если таковые не были реализованы, то приходится искать обходные пути. Об одном из таких обходных путей вы и узнаете сегодня.

Далее в этой статье будут рассмотрены варианты бэкапов:

  • Тем оформления и обоев рабочего стола;
  • Компонентов и макета начального экрана;
  • Резервного копирования ярлыков.

Сразу хочу отметить, что практически все выполняемые далее действия будут происходить в консоли Windows PowerShell (некоторые параметры и настройки, естественно, будут рассматриваться со стороны функциональных возможностей групповой политики). Сейчас мы с вами пройдемся по всем этим компонентам по порядку и начнем с

Создания резервной копии тем оформления и обоев рабочего стола

Для начала следует создать папку, в которую будут помещаться рассматриваемые компоненты. Для этого в Windows PowerShell нужно проверить, присутствует ли интересующая нас папка на компьютере. В том случае, если таковая не существует, следует при помощи командлета New-Item ее создать. Выглядеть это будет следующим образом:

#Создаем папку для экспортируемых данных, если ее не существует 
if(!(Test-Path -Path 'C:\ExportProfileFiles')) { 
  New-Item -ItemType directory -Path 'C:\ExportProfileFiles' 
} 

Теперь рассмотрим процесс резервного копирования темы. Что для этого нужно сделать? Прежде всего, нужно знать, какая именно тема установлена на данный момент у пользователя. За это отвечает специальный параметр системного реестра CurrentTheme, который можно найти в разделе HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes. Как вы знаете, в комплектацию командлетов Windows PowerShell входит командлет Get-ItemProperty, при помощи которого вы можете узнать значение того или иного параметра реестра. Однако, если вы хотите скопировать полученное значение в буфер обмена без лишней информации, этот командлет здесь не поможет. По этой причине правильным выходом будет написание своей простенькой функции, позволяющей возвращать значение параметров реестра таким образом, чтобы можно было без проблем скопировать полученный путь или значение. Функция будет выглядеть следующим образом:

###Темы и обои###

#Получение наименования текущей темы Windows
Function Get-RegistryValue($key, $value) {
  Get-ItemProperty "Registry::$key" $value | Select-Object -expandProperty $value
}
$currenttheme = Get-RegistryValue 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes' -value CurrentTheme 

Здесь выполняется создание нового командлета Get-RegistryValue, благодаря которому вы сможете в качестве значений указать раздел системного реестра с наименованием параметра, а командлет вам выдаст только одно значение. В данном случае это значение будет представлять собой путь к интересующей нас теме пользователя.

Следующим этапом будет процесс копирования файла найденной темы в созданную ранее папку. Это очень просто: нужно воспользоваться командлетом Copy-Item, где нужно в качестве копируемого файла указать переменную $currenttheme, а в качестве целевого пути – созданную на первом этапе папку и, в случае присутствия такого файла в папке, нужно указать параметр, позволяющий форсировано перезаписывать файл. Как это выглядит:

#Копируем файл с темой в отдельную папку (с заменой) и все обои для этой темы
Copy-Item $currenttheme C:\ExportProfileFiles\$env:Username.theme -Force

Тема скопирована – часть дела сделана. Теперь необходимо скопировать обои рабочего стола. Это также весьма простая задача. Прежде всего следует вспомнить, где размещаются изображения рабочего стола в случае применения темы оформления. Естественно, они находятся в той же папке, что и файл темы, но в дополнительной папке DesktopBackground. Получается, чтобы попасть к такой папке, необходимо вырезать из полученного в переменной $currenttheme пути имя файла и перейти к указанной выше папке. Для этого создается новая переменная $DskBkgr и выполняется следующая команда:

$DskBkgr = Get-Item $currenttheme\..\DesktopBackground\* 

Теперь нужно проверить, присутствует ли в нашей экспортируемой папке папка DesktopBackround, в которую будут копироваться обои и, если такой нет – нужно создать ее. После этого нужно лишь скопировать все содержимое папки с обоями в новое расположение. Это будет выглядеть так:

if(!(Test-Path -Path 'C:\ExportProfileFiles\DesktopBackground')) {
  New-Item -ItemType directory -Path 'C:\ExportProfileFiles\DesktopBackground'
}
Copy-Item -Path $DskBkgr -Destination C:\ExportProfileFiles\DesktopBackground\ 

Следует еще рассмотреть вариант, когда папки с обоями в исходном расположении просто не существует. Что тогда можно сделать? Тогда следует посмотреть в системном реестре на значение параметра Wallpaper из раздела HKEY_CURRENT_USER\Control Panel\Desktop. В этом значении будет указан путь к обоям, которые размещены на рабочем столе в данный момент. Это можно сделать при помощи созданного ранее командлета Get-RegistryValue. После этого следует указать условие, при котором файл из найденного только что расположения будет скопирован в случае, если папка DesktopBackground не была найдена. Следующим этапом будет само копирование файла. Это будет выглядеть следующим образом:

#Если нет папки с обоями, копируем обоину из параметра Wallpaper
$Wallpaper = Get-RegistryValue 'HKEY_CURRENT_USER\Control Panel\Desktop' -value Wallpaper
if(!(Test-Path -Path $DskBkgr)) {
Write-Host 'Наши обои живут здесь: ' $Wallpaper
Copy-Item -Path $Wallpaper -Destination 'C:\ExportProfileFiles\' -Force
} 

Резервное копирование компонентов и макета начального экрана

Переходим к следующему этапу, а именно к резервному копированию компонентов начального экрана. Этот можно условно разделить на три части:

  • Копирование параметров реестра, отвечающих за цвет фона и элементов начального экрана;
  • Копирование параметра реестра, отвечающего за фон начального экрана;
  • Копирование параметров, отвечающих за макет начального экрана пользователя.

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

    Для изменения этих значений в редакторе управления групповыми политиками нужно всего лишь перейти к узлу Конфигурация компьютера\Политики\Административные шаблоны\Панель управления\Персонализация (Computer Configuration\Policies\Administrative Templates\Control Panel\Personalization) и открыть диалоговое окно свойств параметра политики «Принудительно задать цвет фона и элементов» (Force a specific background and accent color). В отобразившемся диалоговом окне следует установить переключатель на опцию «Включено» (Enabled), а затем указать в текстовых полях «Цвет фона главного меню» и «Цвет элементов» (Start background color и Accent color) соответствующие цвета в шестнадцатеричной системе счисления RGB. В данном случае рекомендую руководствоваться следующей таблицей цветов. Например, если вы хотите указать темно-красный цвет для фона и красный цвет для элементов, введите такие значения, как показано на следующей иллюстрации:

    Рис. 1. Определение цвета фона и элементов начального экрана средствами групповой политики

    Теперь можно переходить к экспорту интересующих параметров. В этом случае значения искомых параметров будут немного отличаться от значений, используемых в редакторе групповой политики. Для того чтобы изменить цвета начального экрана, вам нужно перейти к разделу системного реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent, где необходимо найти параметры StartColor и AccentColor, отвечающие за цвет фона и элементов соответственно. Зная значения этих параметров в шестнадцатеричной системе счисления, вы сможете определить требуемые параметры. В PowerShell нужно будет сделать следующее:

    ###Начальный экран###
    
    #Находим параметр с цветом элементов начального экрана
    $AccentColor = Get-RegistryValue 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent' -Value AccentColor
    #Конвертируем его в HEX
    $AccentColorHEX =  [Convert]::ToString($AccentColor, 16)
    #Параметр с оформлением фона начального экрана
    $StartColor = Get-RegistryValue 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent' -value StartColor
    #Конвертируем его в HEX
    $StartColorHEX =  [Convert]::ToString($StartColor, 16) 
    

    Здесь мы создаем для параметра переменную и при помощи командлета Get-RegistryValue получаем требуемое значение. Чтобы такое значение перевести в шестнадцатеричную систему счисления, полученное значение просто конвертируется.

    Следующий элемент начального экрана включает в себя само изображение, которое выбирает пользователь. Опять же, чтобы выбрать за пользователя, следует воспользоваться возможностями групповой политики.

    Находясь в том же разделе реестра, о котором шла речь несколько выше, следует открыть параметр политики «Принудительно задать фон начального экрана» (Force a specific Start background). Для изменения фона устанавливается переключатель на опцию «Включено» (Enabled), а затем в контроле идентификатора фона указывается специальный идентификатор, значение которого колеблется от 1 до 20. На следующей иллюстрации изображено диалоговое окно свойств данного параметра политики:

    Рис. 2. Диалоговое окно свойств определения фона начального экрана

    И снова перейдем к пользовательским параметрам и PowerShell. В случае с пользовательским интерфейсом, за значение этого фона отвечает параметр MotionAccentId_v1.00 из уже известного раздела реестра. Например, за установленную в качестве фона непонятной формы рыбу отвечает значение 204 в десятеричном формате или значение CC в шестнадцатеричном. Для локализации этого параметра используются практически такие же команды, как и выше:

    #Находим параметр с изображением начального экрана
    $MotionAccentId_v1 = Get-RegistryValue 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent' -value MotionAccentId_v1.00
    #Конвертируем его в HEX
    $MotionAccentId_v1HEX =  [Convert]::ToString($MotionAccentId_v1, 16) 
    

    Следующим делом будет экспорт найденных параметров в reg-файл для этого выполняется такая команда:

    #Экспортируем раздел реестра (с заменой):
    REG export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent C:\ExportProfileFiles\$env:Username-Accent.reg /y 
    

    Чтобы вы могли посмотреть на все рассмотренные выше параметры прямо из PowerShell, можно вывести все полученные значения на экран. Для этого следует воспользоваться командлетом Write-Host:

    #Выводим всю полученную информацию на экран консоли
    Write-Host '**********' -ForegroundColor Red
    Write-Host ""
    Write-Host 'Наша тема хранится в' $currenttheme
    Write-Host "Параметры цвета начального экрана (Значения в HEX):"
    Write-Host "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent"
    Write-Host "AccentColor: Тип: REG_DWORD  Значение:  " $AccentColorHEX
    Write-Host "MotionAccentId_v1.00: Тип: REG_DWORD  Значение:  " $MotionAccentId_v1HEX
    Write-Host "StartColor: Тип: REG_DWORD  Значение:  " $StartColorHEX
    Write-Host ""
    
    Write-Host '**********' -ForegroundColor Red 
    

    Нерассмотренным остался макет установленных через Windows Store приложений на начальный экран. Для сохранения таких параметров можно воспользоваться специально разработанным командлетом от Microsoft, который называется Export-StartLayout. Он используется для экспорта значений в XML-файл, которые затем можно восстановить при помощи функциональных возможностей групповой политики. Выглядит использование такого командлета следующим образом:

    #Экспортируем макет начального экрана
    Export-StartLayout –As XML –Path 'C:\ExportProfileFiles\StartScreen.xml' 
    

    Теперь перейдем к моменту, связанному с восстановлением и возможностями групповой политики. Для восстановления макета начального экрана вы должны перейти к разделу Конфигурация пользователя\Политики\Административные шаблоны\Меню «Пуск» и панель задач (User Configuration \ Policies \ Administrator Templates \ Start Menu and Taskbar) и выбрать параметр политики «Макет начального экрана» (Start Screen Layout). В диалоговом окне свойств этого параметра политики устанавливается переключатель на опцию «Включено» (Enabled), а затем в соответствующем текстовом поле указывается путь к XML, как показано ниже:

    Рис. 3. Управление макетом начального экрана

    Резервное копирование ярлыков рабочего стола

    Идеальным вариантом резервного копирования ярлыков рабочего стола было бы не обычное копирование файлов, а еще и расчет координат каждого ярлыка, в зависимости от разрешения рабочего стола. К сожалению, реализовать такую задачу на данном этапе у меня не получилось, однако в следующей части скрипта я вам покажу, как можно скопировать размещенные на рабочем столе ярлыки в созданное ранее расположение. Чтобы запоминать положение каждого ярлыка, вы можете воспользоваться сторонней библиотекой, о которой речь идет в этой статье.

    Для выполнения поставленной задачи создается переменная, которая включает в себя расположение ярлыков, устанавливаемых для всех пользователей компьютера. После этого все найденные ярлыки копируются в новую папку (в том случае, если такой папки не существует, она создается). Точно такие же действия выполняются для ярлыков выполнившего вход в систему пользователя. Следовательно, мы получаем следующее:

    ###Ярлыки (иконки)###
    $AllUsrsIcons = Get-Item -Path $env:PUBLIC\Desktop\*
    if(!(Test-Path -Path 'C:\ExportProfileFiles\AllUsrProfileIcons')) {
      New-Item -ItemType directory -Path 'C:\ExportProfileFiles\AllUsrProfileIcons'
    }
    Copy-Item -Path $AllUsrsIcons -Destination C:\ExportProfileFiles\AllUsrProfileIcons -Force
    $CurrentUsrIcons = Get-Item -Path $env:HomeDrive\Users\$env:UserName\Desktop\*
    if(!(Test-Path -Path C:\ExportProfileFiles\$env:UserName-ProfileIcons)) {
      New-Item -ItemType directory -Path C:\ExportProfileFiles\$env:UserName-ProfileIcons
    }
    
    Copy-Item -Path $CurrentUsrIcons -Destination C:\ExportProfileFiles\$env:UserName-ProfileIcons\ -Force 
    

    Заключение

    В этой статье я рассказал о том, как можно создать резервные копии некоторых пользовательских данных, с которыми чаще всего сталкиваются при включении компьютера. К таким данным относятся тема оформления и обои рабочего стола, настройки начального экрана операционной системы Windows 8.1, а также выведенные на рабочий стол ярлыки. Весь процесс резервного копирования реализован при помощи возможностей PowerShell с выводом информации о некоторых копируемых компонентах на консоль. Естественно, это не единственный вариант решения данной задачи (существуют, в конце концов, перемещаемые профили, о которых я уже успел упомянуть выше), да и, по большому счету, для большего удобства можно еще такой скрипт обернуть GUI, чтобы дать возможность пользователю выбирать компоненты, которые будут подлежать резервному копированию, и предоставить возможность форсированного восстановления, но это уже немного другая задача.

    Что еще осталось? Осталась панель задач (она же таскбар), о которой я не сказал ни одного слова за всю статью. Возможности переопределения закрепленных на панели задач компонентов будут рассматриваться в одном из советов недели отдельно и подробно, так как с ними также связано несколько интересных моментов. На этом данная статья подходит к концу. Если у вас возникли идеи по оптимизации скрипта – пожалуйста, напишите об этом в комментариях 🙂

    А если вас интересует решение какой-либо задачи, потенциально связанной с изменением системного реестра или с возможностями групповой политики, – напишите о них через форму обратной связи, а я постараюсь вам помочь в одном из следующих советов недели. До встреч!

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *