Назад | Перейти на главную страницу

Использование переменных среды для предоставления ярлыков для нескольких версий ОС и архитектур

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

Я столкнулся со средой, в которой XP, 7,10 присутствует как в 32-битной (x86), так и в 64-битной (x64) архитектурах и на нескольких языках.

Итак, как эффективно создавать ярлыки для более чем 60 автоматически распространяемых приложений?

Проблема

Использование хорошо известных переменных среды, таких как %programfiles%, programfiles(x86) больше не тренируется, потому что:

  • XP не знает programfiles(x86) переменная
  • programfiles относится к папке x86 или x64 в зависимости от архитектуры машины. (Или более конкретно: к архитектуре процесса, вызывающего переменную)
  • Для XP имя 32-битной папки локализовано (т.е. C:\Programme (x86) для немецкого XP, работающего x64)

Предполагая, что существует 2 языка, 2 типа ОС (7,10 ведут себя одинаково в отношении «типа») и 2 типа архитектуры, следующие параметры возможны с «родными» инструментами, но это уже неуклюже:

Чтобы создать ярлык для «высшей» версии, вам необходимо развернуть 3 «правила» ярлыка:

Shortcut |Target                           | Purpose
App      |%programfiles%\App\app.exe       | x86-app on a x86-xp-7-10 or
         |                                 | x64-app on a x64-xp-7-10
App      |%programfiles(x86)%\App\app.exe  | x86-app on a x64-7-10
App      |C:\Programme (x86)\App\app.xe    | x86-app on a x64-xp (german)

Предполагая, что вы также хотите включить возможность того, что каждое приложение будет одновременно доступно как x86 и x64, это станет еще хуже, потому что: %programfiles% приведет к неправильным результатам (это может быть x86 или x64) .Таким образом, вам нужны WMI-фильтры на каждом «ярлыке», созданном для решения этой проблемы.

Правило вроде этого:

Shortcut |Target                           | Purpose
App 64   |%programfiles%\app\app.exe       | x64-app on a x64-7-10

случайно свяжет 32 bit version на 32-bit-systems с именем x64 - без какого-либо WMI-фильтра, деактивирующего правило.

Итак, было бы 4 правила, 2 с WMI-фильтрами:

Shortcut |Target                           | Purpose
App 64   |%programfiles%\App\app.exe       | x64-app on a x64-xp-7-10 + wmi-filter
App 32   |%programfiles%\App\app.exe       | x86-app on a x86-xp-7-10 + wmi_filter
App 32   |%programfiles(x86)%\App\app.exe  | x86-app on a x64-7-10 
App 32   |C:\Programme (x86)\App\app.xe    | x86-app on a x64-xp (german) 

Итак - 240 ярлыков правил, если есть только один "иностранный язык" - А там где их 5 -> 480 правил быстрого доступа, подверженных ошибкам. -> Нет!

Цель

Я хотел сократить объем необходимой работы. Просто создайте (в худшем случае) 2 записи для каждого ярлыка, указав:

  • Это приложение может быть доступно где угодно, как 32-битная версия.
  • Это приложение может быть доступно только на 64-битных машинах в 64-битной версии.

Пользовательские переменные среды с помощью GPO с использованием фильтров WMI

В качестве решения этого вопроса я создал 1 объект групповой политики для создания необходимых настраиваемых переменных среды:

Variable | Purpose           
%pf_x86% | Program Files x86 on any system 
%pf_x64% | Program Files x64 on any system (if existing)

Итак, этот (один GPO) сводится к 6 правилам (+1 для каждого дополнительного языка XP):

Variable | Value               | OS     | WMI Filter (Item-Level-Targeting): 
%pf_x86% | %programfiles%      |7 x86   | select * from Win32_OperatingSystem
                                          WHERE Version like "6.%" AND  
                                          ProductType="1" AND 
                                          NOT OSArchitecture = "64-bit"
%pf_x86% | %programfiles(x86)% |7,10 x64| select * from Win32_OperatingSystem
                                          WHERE  (Version like "6.%" OR 
                                          Version like "10.%") AND
                                          ProductType="1" AND 
                                          OSArchitecture = "64-bit"
%pf_x86% | %programfiles%      |XP x86  | select * from Win32_OperatingSystem 
                                          WHERE (Version like "5.1%") AND 
                                          ProductType="1"
%pf_x86% | C:\Programme (x86)  |XP x64  | select * from Win32_OperatingSystem 
                                          WHERE (Version like "5.2%") AND 
                                          ProductType="1" AND OSLanguage=1031
%pf_x64% | %programfiles%      |7,10 x64| select * from Win32_OperatingSystem
                                          WHERE Version like (Version like "6.%" OR 
                                          Version like "10.%") AND 
                                          ProductType="1" AND 
                                          OSArchitecture = "64-bit"
%pf_x64% | %programfiles%      |XP x64  | select * from Win32_OperatingSystem 
                                          WHERE (Version like "5.2%") AND 
                                          ProductType="1"

(Языки ОС указаны здесь: https://www.autoitscript.com/autoit3/docs/appendix/OSLangCodes.htm)

Результат

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

Shortcut |Target               | Purpose
App 64   |%pf_x64%\App\app.exe | x64-app on any environment.
App 32   |%pf_x86%\App\app.exe | x86-app on any environment.

А если есть оба - будут развернуты оба ярлыка.

Windows 7, 64-разрядная, ML

Windows 7, 32-разрядная, ML

Windows XP, 32-разрядная версия, ger

и др. стр.