>
 
Темы, разрешение экрана, PowerShell и GPO
3-09-2012, 18:48 Категория: Windows 7 / Администрирование / Просмотров: 3 195

Буквально на днях мне в Windows Live Messenger задали, как мне показалось, довольно интересный вопрос. Полностью цитировать вопрос не буду, а передам вам саму суть.

В компании есть около 300 компьютеров, на которых, естественно, разное расширение экрана. У компании есть оригинальное лого, которое должно красоваться в качестве фонового изображения рабочего стола пользователей, причем, невзирая на разрешение экрана, выглядеть оно должно одинаково. То есть, под каждое расширение экрана сделана отдельная картинка. Помимо этого, под каждое разрешение экрана компанией была разработана не просто отдельная картинка, а тема под Windows 7.

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

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

Отвечу просто, много. Поэтому следует прибегнуть к такому мощнейшему инструменту, как PowerShell, чему, по большому счету, и посвящена в основном эта статья. Но, обо всем по порядку…

 

Изменение темы. Начало

Прежде всего, для того чтобы применять тему, нужно ее создать. В этом небольшом разделе, перед тем как будет создаваться скрипт и распространяться объект групповой политики, я расскажу о том, каким образом самостоятельно можно создать тему Windows.

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

  1. Откройте изображение в любом графическом редакторе и измените его размер. Так как на виртуальной машине, на которой в конце статьи будут тестироваться выполненные действия, установлено разрешение экрана 1024*768, картинка будет подогнана именно под этот размер. Я порекомендовал бы создать картинки (и темы, соответственно) для любых возможных разрешений экранов. Перечень разрешений вы можете посмотреть по следующей ссылке;
  2. После этого, для того чтобы задать фоновый рисунок рабочего стола, откройте в панели управления окно «Персонализация» и перейдите по ссылке «Фон рабочего стола». Локализуйте папку, в которой расположено измененное вами изображение и выберите само изображение и требуемое размещение. Окно фоновый рисунок рабочего стола будет выглядеть следующим образом:
    Темы, разрешение экрана, PowerShell и GPO

    Рис. 1. Фоновое изображение для новой темы

  3. Теперь для изменения цвета окон в том же окне персонализации перейдите по ссылке «Цвет окна» и в отобразившемся окне «Цвет и внешний вид окна»выберите необходимый цвет. Например, в моем случае, это «Графит». При желании можно настроить интенсивность цвета;
  4. Вернувшись в окно персонализации, нажмите правой кнопкой мыши на несохраненной теме и из контекстного меню выберите команду «Сохранить тему для общего доступа». Формат получившегося файла должен быть *.themepack (в операционной системе Windows 8 это будет формат *.deskthemepack).

После того как вы сохраните тему, ее следует скопировать в общедоступное расположение. Например, на файловый сервер.

Немного магии PowerShell

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

$desktops = Get-WmiObject -Class Win32_DesktopMonitor

$i=1

foreach ($desktop in $desktops) {

"Desktop {0}: {1}" -f $i++, $Desktop.Caption

"Screen Height : {0}" -f $desktop.ScreenHeight

"Screen Width : {0}" -f $desktop.ScreenWidth

""

}

if (($desktop.ScreenWidth -eq 1280) –and ($desktop.ScreenHeight -eq 768)) {Copy-Item \\Server04\Themepackes\Corp_theme_1280_768.themepack -Destination $env:userprofile\Documents\currenttheme.themepack}

elseif (($desktop.ScreenWidth -eq 1600) –and ($desktop.ScreenHeight -eq 900)) {Copy-Item \\Server04\Themepackes\Corp_theme_1600_900.themepack -Destination $env:userprofile\Documents\currenttheme.themepack}

elseif (($desktop.ScreenWidth -eq 1366) –and ($desktop.ScreenHeight -eq 768)) {Copy-Item \\Server04\Themepackes\Corp_theme_1366_768.themepack -Destination $env:userprofile\Documents\currenttheme.themepack}

Invoke-Item $env:userprofile\Documents\currenttheme.themepack

Рассмотрим постепенно строки этого скрипта:

В первой строке указывается переменная, которая извлекает данные из класса, отвечающего за разрешение экрана.

Вторая строка позволяет вам подсчитывать мониторы в том случае, если у пользователей установлено более одного монитора.

При помощи цикла foreach мы получаем ширину и высоту пользовательского экрана.

Благодаря условию if копируется тема, согласно разрешению экрана в папку %UserProfile%\Documents и переименовывается в currenttheme.themepack.

Ну а последняя строка, в свою очередь, запускает скопированный на компьютер файл темы.

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

После того как скрипт будет написан, сохраните его в общедоступное место.

Распространение скрипта и установка тем для пользователей

Осталось всего лишь распространить написанный ранее скрипт на компьютеры пользователей. Для этого следует выполнить следующие действия:

  1. Откройте оснастку «Управление групповой политики» и создайте новый объект групповой политики, например, «Темы пользователей». Свяжите объект групповой политики с подразделением, в которое входят учетные записи ваших пользователей. В моем случае, объект привязывается ко всему домену. Выберите только что созданный объект групповой политики, нажмите на нем правой кнопкой мыши и из контекстного меню выберите команду «Изменить»;
  2. В дереве оснастки редактора разверните узел Конфигурация пользователя\Политики\Конфигурация Windows и выберите узел «Сценарии (вход\выход из системы)». В области сведений теперь следует выбрать параметр политики«Вход в систему» и дважды щелкнуть на нем;
  3. Перед тем как вы укажите скрипт, локализуйте его в проводнике и скопируйте в буфер обмена. После этого, чтобы корректно добавить файл в сценарий входа в систему, в диалоговом окне «Свойства: Вход в систему» перейдите на вкладку «Сценарии PowerShell». Нажмите на кнопку «Добавить». В диалоговом окне добавления сценария нажмите на кнопку «Обзор»Откроется папка объекта групповой политики из SYSVOL. Теперь, так как требуемый файл уже находится в буфере обмена, просто в отобразившемся диалоговом окне вставьте его из буфера в нужную папку и выберите его, соответственно. Процесс добавления сценария изображен на следующей иллюстрации:
    Темы, разрешение экрана, PowerShell и GPO

    Рис. 2. Создание сценария входа в систему

  4. Нажмите на кнопку «ОК», а после этого закройте окно оснастки «Редактор управления групповыми политиками».

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

Темы, разрешение экрана, PowerShell и GPO

Рис. 3. Рабочий стол пользователя после применения изменений в объекте групповой политике

Однако, в этом написанном мной скрипте есть существенный недостаток. В том случае, если на пользовательском компьютере при выполнении командлета Get-WmiObject –Class Win32_DesktopMonitor не будут возвращены значения параметров ScreenHeight и ScreenWidth, сценарий попросту не выполнится и никакая тема у пользователя не будет изменена. Как только я найду, как можно решить эту проблему, я сразу обновлю данную запись.

P.S.

А вот и решение проблемы. Вместо предыдущего скрипта лучше использовать указанный ниже сценарий, т.к. он отработает даже в том случае, если вывод командлета Get-WmiObject –Class Win32_DesktopMonitor вернет пустые параметры ScreenHeight и ScreenWidth. Проверено на нескольких хостах и виртуальных машинах.

Перед выполнением скрипта нужно выполнить некоторые предварительные действия:

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

      function GetMonitorData { 
      [void][Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
      foreach ($i in [Windows.Forms.Screen]::AllScreens) { 
      “Устройство : {0}” -f $i.DeviceName 
      $a = $i.Bounds | Select-Object Width, Height 
      “Разрешение : {0}” -f $a.Width + “x” + $a.Height 
      $a = $i.WorkingArea | Select-Object Width, Height 
      “Используемая область : {0}” -f $a.Width + “x” + $a.Height 
      “Основной экран : {0}” -f $i.Primary 

      “” 

      GetMonitorData

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

       

    2. Далее, на основании используемых областей экранов ваших компьютеров, подготавливаем следующий скрипт:

  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
  foreach ($i in [Windows.Forms.Screen]::AllScreens) { 
    $a = $i.WorkingArea | Select-Object Width, Height 
    if (($a.Height -eq 768) -and ($a.Width -eq 1366)) {Copy-Item d:\Theme1.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
    elseif (($a.Height -eq 728) -and ($a.Width -eq 1366)) {Copy-Item d:\Theme2.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
    elseif (($a.Height -eq 664) -and ($a.Width -eq 1366)) {Copy-Item d:\Theme3.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
  }  
Invoke-Item $env:userprofile\Documents\currenttheme.themepack

  1. Выполняем сценарий и следим за результатом.

В том случае, если вы хотите вносить изменения не с используемой областью, а непосредственно с разрешениями экранов, следует в третьей строке заменить $a = $i.WorkingArea | Select-Object Width, Height на $a = $i.Bounds | Select-Object Width, Height. Скрипт должен правильно отработать как в случае с используемой областью, так и в случае с самим разрешением экрана.

Ну а если вы хотите распространять только 3 темы (для экранов 4:3, 16:10 и 16:9), я предлагаю воспользоваться следующим скриптом:

  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
  foreach ($i in [Windows.Forms.Screen]::AllScreens) { 
    $a = $i.Bounds | Select-Object Width, Height 
    $b = $a.Width 
    $c = $a.Height 
    $d = $b / $c 
   if ($d -lt 1.5) {Copy-Item D:\Forests.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
   elseif (($d -gt 1.55) -and ($d -lt 1.7)) {Copy-Item D:\Forests.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
   elseif ($d -gt 1.73) {Copy-Item D:\Forests.themepack -Destination $env:userprofile\Documents\currenttheme.themepack} 
    
  }  
Invoke-Item $env:userprofile\Documents\currenttheme.themepack

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

Заключение

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

источник

 

Добавить коммент
КОММЕНТАРИИ
  • smilelaughing
    wink
    angry

Вопрос:

2 + _ = 23 ( допишите недостающие число )

Ответ: