Русский
Русский
English
Статистика
Реклама

Блог компании кварта технологии

Обновление и продление поддержки Windows на банкоматах, платежных киосках и кассах

10.03.2021 12:22:46 | Автор: admin

Почему в 2020 году многие банки и торговые сети начали массово обновлять устройства самообслуживания, ККМ и операционные системы? Как сориентироваться в многообразии ОС и вариантах обновлений? Как сэкономить на обновлении и не платить дважды? Кто и как должен обновить программное обеспечение на банкоматах и прочих устройствах? Что делать, если ОС обновить невозможно технически? На эти и другие вопросы отвечаютВалерий Дробышевский, директор департамента IoT компании Кварта Технологии, иДмитрий Ахтанин, руководитель направления по развитию ПО и решений по безопасности, ЛАН АТМсервис (входит в группу ЛАНИТ).

В начале 2020 года произошло важное событие, отразившееся на функционировании устройств как в банковском, так и в других секторах, окончание поддержки Windows 7 корпорацией Microsoft. Оно породило волну задач, связанных с обновлением не только операционной системы, но и зачастую всего парка устаревших устройств самообслуживания и ККМ. Таким образом, окончание поддержки Windows 7 подтолкнуло процессы естественной модернизации оборудования.

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

В чем польза обновлений?

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

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

Кроме безопасности, есть еще три важных момента соответствие регламентам, поддержка новейшего оборудования и новых функциональных возможностей оборудования.
Регламенты у каждой индустрии свои. В банковской сфере это, например, Стандарт безопасности данных в индустрии платежных карт (PSI DSS):На все системы должны быть установлены все надлежащие обновления ПО, чтобы защититься от эксплуатации уязвимостей и от компрометации данных о держателях карт (Требование 6 стандарта PCI DSS). Также есть требования Международной платежной системы VISA, чтобы все обновляемые или устанавливаемые в России после 18 апреля 2020 года банкоматы принимали бесконтактные карты и устройства.

В отраслях, работающих с персональными данными, применяется Закон о безопасности персональных данных 152-ФЗ:Контроль установки обновлений программного обеспечения, включая обновление программного обеспечения средств защиты информации (Приказ ФСТЭК России 21 от 18.02.2013, раздел VIII Контроль (анализ) защищенности персональных данных).

В госсекторе есть риск несоответствия требованиям для подключения к государственным информационным системам: При анализе уязвимостей информационной системы проверяется отсутствие известных уязвимостей средств защиты информации, технических средств и программного обеспечения, в том числе с учетом информации, имеющейся у разработчиков и полученной из других общедоступных источников (п. 16.6 Требований о защите информации. Приказ ФСТЭК России от 11.02.2013 17).

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

Прекращение поддержки Windows 7: на кого повлияло и что делать?

Итак, необходимость наличия поддерживаемой операционной системы очевидна, но ни один производитель не поддерживает свои ОС бесконечно. Выходят новые версии, а старые уходят в прошлое. Microsoft, как правило, поддерживает продукты в течение 10 лет с даты релиза (так было до выхода Windows 10), иногда незначительно увеличивая этот срок по разным причинам. В январе 2020 года закончился срок продленной поддержки самой популярной в прошлом операционной системы Microsoft Windows 7, таким образом, никакие исправления, обновления, заплатки и антивирусные базы более не поступают на устройства, делая их все более уязвимыми с каждым днем. А ведь на этой ОС работают сотни тысяч устройств по всему миру! Среди специализированных устройств на базе Windows 7 лидируют банкоматы, киоски и кассы.

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

Самыми распространенными ОС на банкоматах и киосках являются Windows XP Professional for Embedded Systems и Windows 7 Professional for Embedded Systems, а также производные от них Windows Embedded POSReady 2009 и Windows Embedded POSReady 7. Решения на Windows 10 только начинают появляться, и пока их выход сдерживается инертностью производителей как оборудования, так и приложений.

Для выбора варианта решения проблемы с поддержкой разделим устройства на три группы, по степени их готовности к обновлению.

  • Группа 1. Устаревшие устройства на Windows XP

    с оборудованием, не поддерживающим современные процессоры, которые невозможно или экономически невыгодно переводить на Windows 7 или Windows 10.

  • Группа 2. Не очень старые устройства, работающие на Windows 7

    которые невозможно (или дорого) обновить до Windows 10 в силу аппаратной несовместимости и неготовности управляющего ПО устройств работать на Windows 10 в настоящее время. А иногда просто не хочется трогать хорошо отлаженный механизм. Это самая массовая группа устройств в настоящее время.

  • Группа 3. Относительно современные устройства, пока работающие на Windows 7

    но технически поддерживающие апгрейд до Windows 10. Как правило, это устройства 34-летней давности.

Далее рассмотрим возможные пути для устройств каждой группы.

  • Группа 1: Пора на покой

    Судьба таких устройств полная замена. Можно попробовать защитить их сторонними средствами, например Kaspersky Embedded Systems Security, если это устроит регуляторов и службу информационной безопасности. Обновлять их железо, как правило, смысла нет, это дорого и в целом неоправданно, хотя иногда такие попытки предпринимаются. Поскольку наша статья посвящена вопросам обновления ОС Windows, эту группу мы подробно рассматривать не будем.

  • Группа 2: Еще послужим!

    Группу 2 характеризует невозможность перехода на поддерживаемую Windows 10 при одновременном приемлемом состоянии для продолжения работы еще в течение нескольких лет. Задача обеспечить доставку обновлений безопасности для Windows 7, установленной на этих устройствах.

Для такого сценария Microsoft предлагает очень удобный продукт под названиемExtended Security Updates, или сокращенно ESU.

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

Таб. 1. Обновления и циклы поддержки ПО MicrosoftТаб. 1. Обновления и циклы поддержки ПО Microsoft

Купить ESU можно только на определенный период. В таб. 2 указаны эти периоды. Например, для Windows 7 for Embedded Systems максимальная дата окончания платной поддержки 10 января 2023 года. При этом вы можете купить ESU и до января 2022 года, если вам не потребуется такой долгий срок поддержки. Разумеется, это будет стоить дешевле.

Таб. 2. Даты начала и окончания ESU для Embedded-продуктовТаб. 2. Даты начала и окончания ESU для Embedded-продуктов

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

Обновления ESU будут доступны для подключенных к интернету устройств через Windows Update (WU), а также могут быть загружены для автономной установки черезUpdate Catalogежемесячно или по мере надобности.

Ваш партнер, который осуществит поставку, поможет в случае каких-либо проблем с активацией ESU.

Важно! Лицензии ESU для операционных систем Windows Embedded приобретаются только через производителя устройства или сервисную компанию, по OEM-каналу (IoT)! Мы встречали случаи, когда опция ESU была приобретена, по незнанию, через корпоративный канал CSP, предназначенный для офисных ПК, и ключ просто не работал.

Что имеем в итоге? Не прекращая работы, минимальными затратами мы обеспечили безопасную работу существующих киосков, банкоматов и касс до января 2023 года и сохранили соответствие регламентам. А за это время можно начать постепенную замену устройств на более современные.

  • Группа 3: Бодры и веселы!

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

Здесь необходимо сказать несколько слов об особенностях лицензирования Microsoft.

У Microsoft есть три основных канала ритейл (поставки физлицам ключей или коробочных продуктов), корпоративное лицензирование (оптимизирован для поставки ПО организациям) и OEM (от Original Equipment Manufacturer поставка ПО производителям оборудования, в т. ч. обсуждаемых в этой статье устройств).

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

Стандартным путем для обновления подобных устройств является обращение к производителю либо к сервисной компании. Дело в том, что по лицензионному соглашению OEM (а именно по этому каналу поставляются операционные системы для специализированных устройств) поддержку устройств должен выполнять сам производитель либо его уполномоченный подрядчик. Это обусловлено сложностью и специфичностью таких устройств, часто требующих предварительной подготовки и тестирования каждого образа обновления, для гарантии его работоспособности. Приобретая обновления по корпоративному каналу (Open Value, Enterprise Agreement, Select и т. п.), заказчик будет вынужден решать вопросы установки этих обновлений самостоятельно либо платить за решение проблем сторонней компании. Также лицензия на такое обновление обойдется существенно дороже.

Часто мы слышим примерно такое утверждение: Я куплю именную корпоративную лицензию Windows на банкоматы, так как если в дальнейшем мне нужно будет заменить это оборудование, я сохраню лицензию за компанией, и мне не придется платить еще раз. Однако давайте посмотрим, к чему это приведет.

Представим ситуацию банк приобрел лицензию обновления Windows 10 Upgrade для устройств на Windows 7 в корпоративном канале, заплатив существенные средства (лицензия в корпоративном канале самая дорогая!). Всем известно, что лицензия Windows 10 Upgrade подразумевает обязательное наличие предыдущей версии и без нее не является легитимной нельзя купить Upgrade на пустое устройство.

Далее банк списал этот банкомат, лицензия Windows Upgrade действительно осталась за банком. Однако базовая лицензия Windows 7 оказывается списанной вместе с устройством, поскольку ОЕМ-лицензия не может быть оторвана от устройства и утилизируется вместе с ним! Следовательно, такой Upgrade перестает быть легальным. Выход один покупать Windows 10 вместе с новым устройством (полную версию иначе не приобрести), фактически второй раз! То есть смысла в такой привязке к компании изначально не было, и этот шаг привел к дополнительным расходам вместо ожидаемой экономии.

Правильным путем было бы обратиться к производителю, интегратору или сервисной компании за обновлениемWindows 10 IoT EnterpriseField Upgrade специальной лицензией для обновления существующих устройств. Эта лицензия будет гарантированно дешевле (иногда в разы!), чем Windows 10 Upgrade в корпоративном канале, из-за особенностей лицензирования.

Другой минус покупки обновления для банкоматов и киосков в корпоративном канале это цикл обновлений, который вы получаете. Поскольку в 99% случаев покупают более дешевую версию Windows 10 Professional Upgrade, вы (и ваше устройство) получите цикл поддержки SAC (Semi-Annual Channel), который: а) печально известен своими спонтанными обновлениями (именно SAC-версии так достают постоянными просьбами обновиться и перезагрузками), б) поддерживается только полтора года, а далее либо обновляйся, либо теряй поддержку со всеми описанными выше последствиями.

В отличие от корпоративного канала, в канале IoT вы приобретаете Windows 10 IoT Enterprise самую полную на сегодня версию Windows 10, имеющую цикл обновления LTSC (Long-Term Servicing Channel), гарантированно обеспечивающую 10-летнюю поддержку и не беспокоящую ваше устройство просьбами обновиться. И при этом наиболее выгодную по стоимости.

Таким образом, для устройств группы 3, которые поддерживают Upgrade до Windows 10, оптимальным вариантом будет приобретение лицензии Windows 10 IoT Enterprise Field Upgrade, которую могут поставить производители устройств, интеграторы и обслуживающие компании.

P. S.

В настоящей статье мы рассмотрели самые распространенные варианты сохранения защищенности соответствия регламентам ваших устройств:Extended Security Updates (ESU) платное продление поддержки для устаревших банкоматов, касс и киосков на базе Windows 7 до 2023 года и лицензиюWindows 10 IoT Enterprise Field Upgradeдля тех устройств, которые поддерживают Windows 10. Однако сценариев в реальной жизни гораздо больше. Обращайтесь к нам, мы готовы рассмотреть ваш конкретный случай и предложить оптимальное решение!

По вопросам приобретения Extended Security Updates и Windows 10 IoT Enterprise Field Upgrade обращайтесь к производителю устройства, обслуживающей компании или интегратору, либо напишите нам.

Подробнее..

Azure RTOS. Часть 1 обзор и запуск (STM32 CubeIDE HAL)

06.08.2020 16:13:59 | Автор: admin

На недавно прошедшем Microsoft Build 2020 многократно упоминалась Azure RTOS как специализированная ОС жесткого реального времени для микроконтроллеров.


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


Кому не интересен обзор, а нужна практическая часть переходите сразу к ней.


Что это вообще такое?


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


Как правило, микроконтроллер не имеет MMU (хотя есть и исключения, но это именно исключения, которые правильнее будет уже отнести к совершенно другой категории систем-на-кристалле), то есть отсутствует аппаратная поддержка механизма виртуальной памяти, что не позволяет использовать "полновесные" ОС даже при расширении объема встроенной памяти внешними микросхемами.


В связи с перечисленным, код под микроконтроллеры разрабатывается особым образом, в специализированных IDE, а операционные системы вообще выделены в особый класс. Основной функцией ОС для микроконтроллера является реализация многозадачности, а бонусом обычно идут разные стеки сети, файловых систем и т.д. Ни о каком окружении и вспомогательных утилитах, как в настольных ОС, здесь речи не идет. Так, например, в ОС для микроконтроллеров нет процессов, есть только задачи = нити = потоки, а сама ОС, как правило, компонуется с пользовательским кодом в единую микропрограмму ("прошивку"). Для понимания особенностей таких ОС рекомендуем статью. Отметим, что в ThreadX, несмотря на прямое отсутствие процессов, есть их аналог модули.


Впрочем, ограниченные объемы ресурсов никак не мешают использовать микроконтроллеры для решения узкоспециализированных задач. Более того, по меркам микроконтроллера, 128 КБ ROM и 64 КБ RAM уже довольно внушительные цифры. Микроконтроллер, несмотря на отсутствие "большой" ОС, успешно может записывать файлы на USB флешку, обмениваться данными по сети, а некоторые реализации содержат специальные инструкции для цифровой обработки сигналов, то есть могут решать достаточно "тяжелые" задачи.


Зачем вообще нужна ОС в микроконтроллере, ведь есть альтернативные варианты архитектуры типа "суперцикла"? Вопрос не очень простой и до сих пор вызывающий что-то типа религиозных войн. Достаточно подробный ответ на него дан в этой статье. Если совсем вкратце, то это упрощение кода в целом, что позволяет не только разработать, но и успешно модифицировать уже написанный код. Конечно, есть и минусы в виде потребления ресурсов "железа" на саму ОС и необходимости понимания основ написания потокобезопасного кода.


Все изложенное описывает картину достаточно укрупненно, так как везде есть исключения и оговорки. Например, на микроконтроллерах без MMU можно запустить ucLinux порт "большого" Linux специально для микроконтроллеров без MMU (без защиты памяти, естественно, со всеми вытекающими последствиями). Как правило, для этого потребуются дополнительные микросхемы памяти, так как встроенной хватит только для загрузчика этой самой ucLinux.


Что есть у Microsoft?


Microsoft традиционно занимается "большими" ОС, среди которых тоже есть специализированные решения в виде Windows 10 IoT Enterprise LTSC, значительно дешевле настольных систем и со специальными возможностями встраивания. Windows 10 IoT Enterprise требует практически полноценного (хоть и промышленного и малогабаритного) компьютера для запуска. Впрочем, есть редакция Windows 10 IoT Core, ориентированная только на приложения UWP, где требования к системе ниже: она успешно запускается на Raspberry Pi 2.


Здесь же нельзя не упомянуть класс операционных систем Windows Embedded Compact, которые могут работать на системах, по вычислительным возможностям находящимся где-то между полноценными компьютерами и микроконтроллерами. Compact отдельный класс ОС, не совместимых с "настольной" Windows, требующих особых средств разработки. Последний выпуск датируется 2013-м годом, далее ОС развития не получила, но все еще продается и поддерживается, как и несколько предыдущих версий.


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


Первым таким решением был .Net Micro Framework, который позволял разрабатывать для микроконтроллеров на языке C#. Вводную информацию можно найти в статье, а репозитории проекта по ссылке. К сожалению, на всех репозиториях стоит метка "Archive", а последние изменения датируются 2018-м годом. .Net Micro Framework достаточно интересен именно реализацией C#, что позволяет применить все преимущества данного языка на таких ограниченных системах, как микроконтроллеры. Реализация C# с его механизмами управления памятью представляет собой значительный "оверхед" для систем с ограниченными ресурсами, хотя из личного опыта работает достаточно хорошо и надежно (несмотря на часто встречающиеся едкие комментарии к тематическим статьям). Существуют и коммерческие проекты на .Net Micro Framework.


На данный момент доступны и сторонние реализации среды выполнения для C#: https://www.nanoframework.net/, https://www.wildernesslabs.co/. Отметим, что последняя аппаратная платформа вполне подходит и для запуска ucLinux, так что к выбору ОС следует относиться, как к выбору инструмента для решения задачи: что удобнее, то и применяем.


В 2019 году Microsoft поглощает Express Logic, и среди решений для микроконтроллеров от Microsoft появляется Azure RTOS, которая раньше называлась X-WARE IoT Platform. В Azure RTOS входит ядро ThreadX вместе с дополнительными компонентами, а также добавлены средства подключения к Azure IoT Hub и Azure IoT Central. Само название Azure RTOS подчеркивает применение совместно с сервисами Azure для устройств Интернета вещей.


В состав Azure RTOS входят:


  • сама ОС ThreadX, а именно, ядро, планировщик, реализующий многозадачность и синхронизацию задач;
  • стек TCP/IP NetX/NetX Duo;
  • стек FAT FileX;
  • стек USB Host/Device/OTG USBX;
  • реализация графического интерфейса GUI: GUIX и инструмент разработки (GUIX Studio);
  • реализация равномерного износа флеш-памяти для FileX: LevelX;
  • система трассировки событий TraceX;
  • SDK для Azure IoT поверх NetX Duo готовые средства для подключения устройства к службам Azure.

Нельзя не отметить одно из специализированных решений высокой готовности: Azure Sphere. Это безопасная платформа для приложений интернета вещей со встроенными механизмами коммуникаций и безопасности. Она представляет собой микроконтроллер (скорее даже SoC) с установленным ядром Linux, а также готовыми облачными сервисом для доставки обновлений безопасности.


Реальное время


Этот термин используется повсеместно, без уточнения, в нашем же случае важно разобраться, что это такое.


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


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


Среди всех перечисленных продуктов к системам жесткого реального времени относятся:


  • Все семейство Windows Embedded Compact ориентировано на промышленные компьютеры;
  • Azure RTOS/ThreadX ориентирована на микроконтроллеры;
  • Azure Sphere специализированное решение, в котором операционная система (Azure Sphere OS) не является системой реального времени, но тем не менее предоставляются механизмы запуска пользовательских приложений реального времени.

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


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


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


Что делает ThreadX системой реального времени? Время реакции на внешние события в ThreadX строго определено: поток с высоким приоритетом начинает обработку внешнего события за гарантированное время. Например, время переключение контекста всегда гарантированно меньше 100 циклов.


Таким образом, для микроконтоллеров на данный момент Azure RTOS единственное решение жесткого реального времени от Microsoft. В принципе, сюда же (с некоторыми оговорками) можно было бы отнести и Azure Sphere, но это уникальный продукт с уникальными возможностями, поэтому его мы обсудим в отдельной статье.


Чем уникальна Azure RTOS


Исследование показывает, что данная ОС является одной из наиболее часто применяемых (более 6 миллионов инсталляций). В основном она используется в специализированном оборудовании, таком, как устройства беспроводной связи, принтеры, модемы, устройства хранения данных, медицинские устройства, интеллектуальные датчики.


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


  • Малый размер. Минимальная система занимает 2 КБ ROM. Размер увеличивается автоматически по мере использования возможностей ОС.
  • Поддерживаются различные методы реализации многопоточности, как вытесняющая, так и кооперативная многопоточность.
  • Детерминированное время переключения контекста (меньше 100 циклов), быстрая загрузка (меньше 120 циклов), опциональная проверка ошибок, пикоядро без "слоев".
  • Поддержка большого количества микроконтоллеров и IDE для разработки.
  • Порог вытеснения (Preemption threshold) порог вытеснения N означает, что данный поток может быть вытеснен только потоками с приоритетом выше N, т.е. от 0 до (N 1) включительно, а потоки с приоритетом ниже N (т.е. больше N включительно) не могут вытеснять данный поток. Правильное использование данной возможности уменьшает количество переключений контекста, а также уменьшает время реакции на внешние события. Подробную информацию можно найти в статье.
  • Сцепление событий (Event chaining) позволяет объединить несколько событий в единый сигнал синхронизации для потока, что позволяет синхронизироваться сразу по нескольким событиям, причем в разных комбинациях (И, ИЛИ).
  • Наследование приоритета (Priority inheritance) позволяет избежать негативных последствий ситуации инверсии приоритетов. Описание ситуации инверсии приоритетов тема для целой статьи, отдельно с данной проблемой многозадачных систем можно ознакомиться здесь.
  • Оптимизированная обработка прерываний от аппаратных таймеров;
  • Модули (Modules). ThreadX позволяет "обернуть" один или несколько потоков приложения в "модуль", который может быть динамически загружен и запущен на целевом устройстве. Модули позволяют производить обновление "в полях" с целью исправления ошибок. Также при помощи модулей можно разбить микропрограмму на сегменты и динамически определять набор выполняемых потоков, чтобы сэкономить память.
  • Встроенная трассировка событий и аналитика стека. Подбор размера стека потока является одной из самых важных задач при разработке с использованием ОС для микроконтроллера. Нельзя сделать слишком маленький стек, т.к. в отсутствие защиты памяти при переполнении стека произойдет порча областей памяти других задач. Слишком большой стек также недопустим, т.к. приведет к излишнему расходованию памяти, а она ограничена.

Также рекомендуем интересное сравнение ThreadX с FreeRTOS от инженера, работающего с обеими ОС, а также данную книгу.


Лицензирование


Azure RTOS коммерческая ОС с соответствующими требованиями к применению в производстве. Однако в ряде случаев платить за ее использование не понадобится.


  • Вам не требуется лицензия, если вы используете код не для производства, а для изучения, разработки, тестирования, портирования, адаптации системы для вашего решения;
  • Лицензия на использование в производстве включена автоматически при развертывании ОС на любой из микроконтроллеров из данного списка. На август 2020 года список еще не заполнен в связи с тем, что процедуры лицензирования еще не завершены, но уже есть соответствующий issue, в котором упомянуты микросхемы Microchip, NXP, Renesas, ST, и Qualcomm;
  • В ином случае вам нужно приобрести платную лицензию.

Во всех случаях ОС поставляется с исходным кодом.


Запуск ThreadX на STM32


Для понимания зависимостей между компонентами Azure RTOS приводим соответствующий рисунок из документации:



Как видим, ThreadX является основой для всего остального. Ядро ThreadX обеспечивает многопоточность, переключение контекста, синхронизацию потоков. Поддерживаются таймеры, очереди сообщений, семафоры, мьютексы, флаги событий, пулы байтов и блоков (в каком-то смысле аналог кучи в C++, но с потокобезопасным управлением).


В практической части данной статьи мы будем рассматривать именно ThreadX, чтобы понять, с чего начать работу с ним. И хотя разработчики предоставляют большое количество примеров для готовых средств разработки, интерес представляет именно настройка "с нуля" на каком-то микроконтроллере, для которого нет примера, ведь к этому при разработке своего устройства мы рано или поздно придем.


Будем использовать относительно недорогую и популярную плату STM32F4Discovery, но весь процесс можно с успехом повторить на любом микроконтроллере, например, на сверхдешевом и доступном STM32F103C8T6.


STM32F4Discovery удобна тем, что уже имеет встроенный отладчик ST-Link, большое количество периферии для экспериментов, а все выводы микроконтроллера (STM32F407VGT6) выведены на контакты.



Инструменты, которые нам понадобятся


Эксперименты будем проводить на Windows 10 (подойдет также любая, начиная с 7).


Будем также использовать STM32 HAL набор универсальных API для микроконтроллеров STM32. Есть много мнений и "за", и "против" использования HAL. На наш взгляд, HAL, внося некоторый "оверхед", все же позволяет получить хорошо читаемый и модифицируемый код. HAL не требует скачивания, все необходимые библиотеки будут загружены автоматически при создании проекта.


  1. Скачиваем и устанавливаем STM32CubeIDE бесплатная IDE от STMicroelectronics на базе открытых инструментов.
  2. Загружаем исходный код ThreadX c GitHub. Существуют, конечно, "правильные" способы использования репозитория с исходным кодом в виде клонирования репозитория или создания форка, но для простоты описания просто скачиваем его как архив: зеленая кнопка "Clone", затем "Download zip".
  3. Подключаем плату STM32F4Discovery через разъем Mini-USB к компьютеру, проверяем наличие устройства "ST Link" в диспетчере устройств. Плата питается по этому же кабелю.


Создание и правка проекта


Запускаем STM32CubeIDE. При запуске нас попросят указать директорию для хранения Workspace можно оставить директорию по умолчанию.


Создаем новый проект, выбрав на главном экране Start New STM32 Project.



В появившемся окне в поле 1 набираем STM32F4DISCOVERY, выбираем плату в списке плат 2 (она там будет одна) и нажимаем Next (3):



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



Далее выбираем "Copy only necessary files..." и нажимаем Finish.



На появляющиеся вопросы отвечаем Yes:




Открывается окно Project Explorer, в нем находится иерархия файлов проекта. Находим файл threadx_test.ioc и переходим к нему (двойной клик):



В открывшемся окне переходим на вкладку Clock Configuration и убеждаемся, что система тактирования настроена следующим образом:



Заметим, что SYSCLK = 168 МГц, это нам понадобится далее для настройки таймера SysTick.


Вернемся на закладку Pinout & Configuration, где развернем пункт Connectivity, выберем USB_OTG_FS (1) и выключим его (2), затем в группе выводов (3) всем выводам выставим состояние Reset_State (4).



Мы отключаем USB OTG, так как в соответствующем коде используется функция HAL_Delay, которая, выполняя задержку, не позволяет планировщику ОС правильно переключать потоки. Код нужно адаптировать для использования с ThreadX, создав отдельный поток и заменив функцию задержки из HAL на функцию задержки из ThreadX, которая на время задержки передает управление другим потокам. Но для простоты примера мы этого не делаем, а просто отключаем USB OTG.


Аналогично в группе System Core перейдите к SYS и выберите таймер TIM7 в качестве Timebase Source для Serial Wire Debug:



SysTick Timer нам понадобится для ядра ThreadX.


Нам также нужно активировать прерывание на выводе PA0, к которому на плате подключена кнопка. Смотрим в User Manual к плате, как подключена кнопка:



Соответственно, нам понадобится прерывание по восходящему фронту. Подтягивающий вниз резистор на плате уже есть, встроенная подтяжка не потребуется. Соответствующие настройки делаем в группе System Core GPIO:



В группе System Core NVIC включаем прерывание EXTI0:



На этой же странице в группе Priority group установите значение "4 bits...":



Там же, но на вкладке Code Generation, отключим генерацию кода для Pendable request for system serivice, System tick timer, так как соответствующий код уже есть в порте ThreadX для ядра Cortex-M4, причем обработчики определены уже с нужными именами:



Сохраним проект и согласимся с появившимся предложением о генерации кода.


Далее распаковываем содержимое скачанного архива в каталог threadx_test\Middlewares нашего workspace. В Project Explorer нажимаем F5 и видим, что все необходимые файлы появились в дереве:



Нажимаем на название проекта threadx_test правой кнопкой мыши и выбираем Properties. Переходим к разделу C/C++ General Paths and Symbols. Нажимаем кнопку Add и добавляем путь


Middlewares/threadx-master/ports/cortex_m4/gnu/inc

Не забыв установить все флажки, как на рисунке:



Если вы делаете эксперименты на микроконтроллере с другим ядром, в вашем случае нужно включить заголовочные файлы для этого ядра, выбирайте путь соответственно (доступны cortex_m0, 3, 4, 7)


Аналогично добавляем путь


Middlewares/threadx-master/common/inc

Нажимаем Apply and Close и соглашаемся с перестроением индекса.


Теперь по пути Middlewares/threadx-master/ports в Project Explorer исключим из сборки:


  • весь каталог cortex_m0
  • весь каталог cortex_m3
  • весь каталог cortex_m7
  • cortex_m4/gnu/src/tx_vector_table_sample.S (таблица векторов прерываний уже есть в нашем стартовом коде)

Для этого кликаем по каждому каталогу/файлу правой кнопкой мыши, выбираем Properties и снимаем галочку Exclude resource from build:



Также исключите из сборки (или можете просто удалить):


  • Middlewares/threadx-master/cmake
  • Middlewares/threadx-master/docs
  • Middlewares/threadx-master/samples

И убедитесь, что следующие каталоги НЕ исключены из сборки:


  • Middlewares/threadx-master/common
  • Middlewares/threadx-master/ports/cortex_m4

Перейдем к скрипту компоновщика STM32F407VGTX_FLASH.ld и найдем строчки


  ._user_heap_stack :  {    . = ALIGN(8);    PROVIDE ( end = . );    PROVIDE ( _end = . );    . = . + _Min_Heap_Size;    . = . + _Min_Stack_Size;    . = ALIGN(8);  } >RAM

и после строки


    . = ALIGN(8);

добавляем строку


    __RAM_segment_used_end__ = .;

Что сообщит ThreadX о первом неиспользуемом участке памяти. В дальнейшем этот участок памяти можно использовать по своему усмотрению.


Если планируете запуск из RAM, можете то же самое сделать в файле STM32F407VGTX_RAM.ld.


Теперь в Project Explorer разворачиваем ветку Middlewares/threadx-master/ports/cortex_m4/gnu/src и открываем файл tx_initialize_low_level_sample.S.


Находим строку


SYSTEM_CLOCK      =   6000000

и меняем значение 6000000 на 168000000 в соответствии с частотой SYSCLK.


В следующей строке


SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1)

меняем значение 100 на 1000. Тем самым мы изменим частоту системных тиков со 100 до 1000 Гц: удобнее будет задавать задержки для соответствующих функций ThreadX, задержка в тиках будет равна задержке в миллисекундах.


Конкретное значение частоты тиков планировщика подбирается в зависимости от решаемой задачи.


В Core/Src/main.c в начале файла включим


/* USER CODE BEGIN Includes */#include "tx_api.h"/* USER CODE END Includes */

а до кода


  /* USER CODE END 2 */  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */

добавим вызов


  tx_kernel_enter();

тем самым передав управление планировщику.


Перейдем к Core/Startup/startup_stm32f407vgtx.s


После


.global  Default_Handler

Добавим


.global _vectors

А после


g_pfnVectors:

Также добавим


_vectors:

Тем самым скомпонуем нашу таблицу векторов с кодом ThreadX.


В Core/Src/ создайте файл demo_threadx.c и скопируйте в него код ниже.


#include "tx_api.h"#include "main.h"/* Размер стека каждого демо-потока в байтах */#define DEMO_STACK_SIZE         1024/* Размер пула памяти, из которого будет выделяться память для демо-потоков, в байтах */#define DEMO_BYTE_POOL_SIZE     10240/* Количество демо-потоков */#define THREAD_COUNT 4/* Массив структур, каждая из которых хранит информацию о потоке (thread control block) */TX_THREAD               thread_x[THREAD_COUNT];/* Структура, хранящая информацию о пуле памяти */TX_BYTE_POOL            byte_pool_0;/* Группа флагов событий */TX_EVENT_FLAGS_GROUP    evt_group;/* Область памяти для пула TX_BYTE_POOL */UCHAR                   memory_area[DEMO_BYTE_POOL_SIZE];/* Флаг события (маска) для потока N */#define EVT_KEYPRESS_THREAD(n) (1 << n)/* Время задержки после переключения режима светодиода */#define LED_PAUSE_AND_DEBOUNCE_TIME_MS 100/* Описание светодиодов для каждого потока */static const struct{    GPIO_TypeDef* GPIOx;    uint16_t GPIO_Pin;    uint32_t blink_delay_ms;    char thread_name[10];} BoardLedsSettings[THREAD_COUNT] ={    { LD3_GPIO_Port, LD3_Pin, 250,  "orange" },    { LD4_GPIO_Port, LD4_Pin, 500,  "green" },    { LD5_GPIO_Port, LD5_Pin, 750,  "red" },    { LD6_GPIO_Port, LD6_Pin, 1000, "blue" }};/* Callback внешнего прерывания (кнопки) */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){    if(GPIO_Pin == GPIO_PIN_0)    {        for (int i = 0; i < THREAD_COUNT; i++) tx_event_flags_set(&evt_group, EVT_KEYPRESS_THREAD(i), TX_OR);    }}/* Функция-worker каждого из 4 потоков */void thread_entry(ULONG thread_input){    /* Поток управления одним светодиодом на плате */    uint8_t led_state = GPIO_PIN_RESET;    uint32_t cur_delay_ms = BoardLedsSettings[thread_input].blink_delay_ms;    ULONG actual_flags_ptr;    while(1)    {        HAL_GPIO_WritePin(BoardLedsSettings[thread_input].GPIOx, BoardLedsSettings[thread_input].GPIO_Pin, led_state);        led_state = !led_state;        if (TX_SUCCESS == tx_event_flags_get(&evt_group, EVT_KEYPRESS_THREAD(thread_input),            TX_AND_CLEAR, &actual_flags_ptr, cur_delay_ms))        {            /* Установлен флаг события "кнопка нажата". Выключаем светодиод */            HAL_GPIO_WritePin(BoardLedsSettings[thread_input].GPIOx, BoardLedsSettings[thread_input].GPIO_Pin, GPIO_PIN_RESET);            /* Пауза, что было видно, что светодиод погас */            tx_thread_sleep(LED_PAUSE_AND_DEBOUNCE_TIME_MS);            /* Дополнительно очистим флаг события, на случай, если оно произошло еще раз за время задержки (антидребезг) */            tx_event_flags_get(&evt_group, EVT_KEYPRESS_THREAD(thread_input), TX_AND_CLEAR, &actual_flags_ptr, TX_NO_WAIT);            /* Светодиод будет включен в следующей итерации цикла */            led_state = GPIO_PIN_SET;            /* Изменяем задержку */            cur_delay_ms = (cur_delay_ms == BoardLedsSettings[thread_input].blink_delay_ms) ?                cur_delay_ms * 2 : BoardLedsSettings[thread_input].blink_delay_ms;        }    }}/* Инициализация приложения */void tx_application_define(void *first_unused_memory){    CHAR    *pointer = TX_NULL;    /* Создаем byte memory pool, из которого будем выделять память для стека каждого потока */    tx_byte_pool_create(&byte_pool_0, "byte pool", memory_area, DEMO_BYTE_POOL_SIZE);    /* Создаем группу событий */    tx_event_flags_create(&evt_group, "event group");    /* Создаем в цикле 4 потока, каждый из которых получает в качестве параметра индекс данных из структуры BoardLedsSettings */    for (int i = 0; i < THREAD_COUNT; i++)    {        /* Выделяем стек для потока i */        tx_byte_allocate(&byte_pool_0, (void **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);        /* Создаем поток i */        tx_thread_create(&thread_x[i], BoardLedsSettings[i].thread_name, thread_entry, i, pointer, DEMO_STACK_SIZE,            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);    }}

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


Выберите Project Build All и убедитесь, что сборка проекта прошла успешно.


После этого выберите Run Debug Configurations, кликните правой кнопкой мыши на STM32 Cortex-M C/C++ и выберите New Configuration:



Оставьте значения по умолчанию (там выбран ST-LINK уже с нужными параметрами) и нажмите кнопку Debug. Согласитесь с переключением перспективы.


Отладка остановится на строке


  HAL_Init();

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


Что происходит в данном примере


Приведенное приложение классический пример "лампочки и кнопочки" для RTOS. На плате распаяно 4 светодиода, и задача приложения мигать ими, причем у каждого из них должна быть своя частота этого мигания. Без RTOS это сделать достаточно сложно и неудобно. Также на плате имеется кнопка, и ее мы используем для демонстрации обработки внешнего прерывания в RTOS. Очень плохой практикой является обработка непосредственно в обработчике прерывания (наша функция-callback HAL_GPIO_EXTI_Callback() выполняется непосредственно в контексте прерывания), поэтому в самом обработчике мы устанавливаем флаг соответствующего события. В дальнейшем по этому флагу оно будет обработано в потоке.


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


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


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


Выделенная область стека передается в функцию tx_thread_create() в виде указателя и размера области памяти в байтах. Обратите внимание, что в нашем примере достаточно было просто объявить массив нужной длины и передать указатель на массив в эту функцию, что означало бы статическое выделение памяти для стека. Но мы пошли более сложным путем, чтобы показать, как в ThreadX устроено динамическое управление памятью. Мы статически создали массив для пула байтов (byte_pool_0), создали сам пул в строке


tx_byte_pool_create(&byte_pool_0, "byte pool", memory_area, DEMO_BYTE_POOL_SIZE);

Затем выделили из этого пула память для стека каждого потока в строке


tx_byte_allocate(&byte_pool_0, (void **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);

И передали соответствующий указатель (pointer) в функцию создания потока:


tx_thread_create(&thread_x[i], BoardLedsSettings[i].thread_name, thread_entry, i, pointer, DEMO_STACK_SIZE,    1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);

Обратим внимание на следующее:


  • Поскольку мы выделяли память динамически, мы также можем ее и освободить, например, после уничтожения потока. Память вернется в пул и может быть в дальнейшем использована повторно. В ThreadX уже решена проблема фрагментации возвращенной в пул памяти, поэтому проблем с повторным выделением не будет.
  • Все созданные потоки запускаются автоматически (параметр TX_AUTO_START).
  • Параметр TX_NO_TIME_SLICE отключает механизм time-slice для создаваемого потока. Это означает, что квант времени на исполнение процесса мы не задаем, а вместо этого полагаемся на планировщик.
  • Данный код не подходит для производства, поскольку для упрощения примера не производится анализ возвращенного значения функций на предмет возникновения ошибок.
  • ThreadX достаточно гибко конфигурируется путем применения директив препроцессора. Для упрощения примера мы их не рассматривали. Подробная информация доступна здесь.

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


Выводы


Мы рассмотрели лишь базовую часть Azure RTOS и (пока) не использовали расширенных функций, а также стеков FileX, NetX и т.д. Это тема следующих статей.


Мы убедились, что работу с ThreadX можно начать достаточно быстро, буквально в пределах рабочего дня. Microsoft также предлагает руководство пользователя к ОС, а если у вас еще остались вопросы по Azure RTOS или другим встраиваемым операционным системам Microsoft обращайтесь к нам в Кварта Технологии.


Автор статьи Сергей Антонович, ведущий инженер Кварта Технологии. Связаться с ним можно по адресу sergant (at) quarta.ru.

Подробнее..

Будни OEMщика (Часть 1)

10.09.2020 10:11:09 | Автор: admin

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


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


Предисловие


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


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


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


С чего же начать изучение вопроса тиражирования? К кому можно обратиться за советом? Ответ очевиден, нужно обратиться к тому, кто заинтересован в продаже Windows, а именно к компании-дистрибьютору. Компания Кварта Технологии занимается продажей и продвижением Windows. Одно из направлений по продвижению это упрощение настройки Windows и информирование о ее специальных возможностях. Для информирования и косвенной поддержки у нас есть:



В Кварте можно купить любую редакцию Windows, но основная специализация компании это продажа Windows 10 IoT Enterprise, ранее известная как Embedded, которая предназначена для устройств фиксированного назначения. Специальные возможности этой системы можно увидеть на этом видео.


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


Начало начал


Берем дистрибутив Windows 10 IoT Enterprise 1809. Если Вас интересует только тиражирование, можете взять любую другую редакцию Windows 10, кроме Windows Core, процесс подготовки и тиражирования для всех редакций будет одинаковым. Иногда бывают вопросы Где взять оригинальный дистрибутив? и Как записать образ на флэшку?.


Коммерческий оригинальный дистрибутив можно скачать на сайте microsoftoem.com. Для загрузки дистрибутивов рекомендую использовать IE. Относительно недавно Майкрософт поменял оболочку сайта, это некоторым образом приводит в замешательство тех, кто им пользуется крайне редко. Убедитесь, что Вы вошли на сайт, для этого подведите курсор мыши к символу учетной записи в правом верхнем углу, после чего в выпадающем сообщении должны отобразиться учетные данные. Для перехода к загрузке образа перейдите по пунктам выпадающего меню Orders > Software Downloads > Software Order Center



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



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



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


И еще небольшое замечание, если Вы устанавливаете систему в UEFI режиме, то разрядность устанавливаемой системы должна соответствовать разрядности, которую поддерживает UEFI BIOS устройства, иначе Вы просто не сможете загрузиться даже для установки системы. Проще говоря, если у Вас не получается загрузиться с флэшки для установки Widows 10 x64, попробуйте установить Widows 10 x32.


Нечистая, нечистая, братцы!


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


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


Так как мы готовим образ для тиражирования, то сразу после установки можно перевести систему в режим аудита. Для перевода системы в режим аудита нужно нажать Ctrl + Shift + F3 на шаге выбора региона.



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


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


А теперь немного углубимся в запечатывание системы и снятие образа. Когда система загрузится в режиме аудита, автоматически запустится утилита Sysprep. Для запечатывания в режиме аудита в разделе System Cleanup Action выберите Enter System Audit Mode. Чтобы система без проблем загрузилась на другом оборудовании, то ее можно отвязать от текущего оборудования, для этого ставим флажок Generalize. В разделе Shutdown Options выбираем Shutdown и нажимаем OK, после чего система выключится. Система запечатана только до тех пор, пока не загружена, не пытайтесь снять образ загруженной системы.



Для снятия образа нам понадобится флэшка с WinPE


Создаем флэшку с WinPE


Используя набор Windows ADK можно собрать WinPE с различным набором компонентов, но можно поступить проще, WinPE есть на установочном диске Windows, можно использовать его, только нужно, чтобы вместо запуска установщика запускался скрипт с помощью которого можно легко снять или развернуть образ системы. Для подготовки флэшки будем использовать скрипт MakeBootMedia из набора скриптов.


Для создания флэшки с WinPE с помощью предлагаемого скрипта необходимо использовать Windows 10 с версией не ранее чем 1703.


Подключите образ установочного диска к системе, подключите флэшку к ПК, которую можно очистить, запустите MakeBootMedia.bat и выберите пункт подготовки загрузочного носителя WinPE. Думаю, что нет смысла пошагово описывать действия т.к. там все интуитивно понятно, но скажу, что сделает скрипт и для чего.


После очистки выбранного диска скрипт создаст два раздела NTFS и FAT32. Т.к. версии Windows до Windows 10 1703 не видят на флэшке более одного раздела, то раздел NTFS будет первым, а FAT32 вторым. Если вдруг у Вас будет дистрибутив Windows 10 1607 и соответствующее WinPE, то WinPE загрузится со второго раздела FAT32, который будет помечен как загрузочный и сможет работать с разделом NTFS. Раздел NTFS нужен для хранения файлов большого объема, а раздел FAT32 нужен для загрузки в UEFI режиме.


После копирования файлов, необходимых для загрузки, скрипт подключит образ с последним индексом, который находится в файле boot.wim и добавит в него файл Winpeshl.ini, в котором будет прописано что нужно запускать при загрузке WinPE. В файле Winpeshl.ini прописан запуск файла Winpeshl.bat, который будет скопирован туда же, рядом с ini файлом. После этого образ будет отключен с сохранением.


В корень тома NTFS будет скопирован файл меню Menu.bat и будет создан файл Serial.txt с серийным номером флэшки, которая была подготовлена как загрузочная.


Создаем образ системы


Загрузитесь с подготовленной флэшки. После загрузки запустится файл Winpeshl.bat, который нужен только для поиска и запуска файла меню Menu.bat, в котором находится основное меню.


При выборе пункта снятия образа системы скрипт автоматически найдет раздел с системой и свернет ее в WIM образ, который будет на томе NTFS в папке Images. Обратите внимание, что будет снят образ только системного раздела. После снятия образа вытащите флэшку из ПК и перезагрузите его. Для перезагрузки достаточно просто закрыть запущенное окно.



Что такое WIM и с чем его едят


В Windows есть штатная утилита для обслуживания системы DISM. Одна из ее возможностей создание образов WIM. С ее помощью можно создать образ раздела или папки, при создании образа системного раздела DISM по умолчанию исключает ненужные файлы, такие, как файл подкачки и файл гибернации. В одном wim файле может быть множество образов, получить к ним доступ можно по индексу (номеру образа). Множество образов лучше хранить в одном wim файле т.к. у него есть дедупликация одинаковых файлов. Но при повреждении такого файла будут потеряны все образа, которые в нем хранились. В едином wim файле я храню архив образов, которые может быть когда-нибудь понадобятся.


Для упрощения работы с wim образами есть множество графических утилит, например GImageX и Dism++


Локализация


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


Способов локализации довольно много, но нас интересуют способы локализации без подключения к интернету, а это значит, что нам нужен языковой пакет, который находится в наборе языковых пакетов. Локализация требуется очень часто, поэтому в наборе скриптов есть скрипт для полной автоматической локализации RU-ru и соответствующий языковой пакет для последней версии LTSC. Если в наборе скриптов нет языкового пакета для вашей системы, то просто подключите образ с языковыми пакетами для вашей системы и скрипт сам найдет языковой пакет.


Запустите скрипт Localization.bat, выберите пункт полной локализации системы и дождитесь завершения локализации, во время локализации система перезагрузится несколько раз, просто не мешайте ей. Если у Вас есть необходимость сделать дистрибутив для установки локализованной системы, то инструкцию по его созданию можно найти здесь.


После локализации запечатайте систему в режиме аудита и снимите образ системы как в прошлый раз. Для запечатывания можно запустить утилиту sysprep или можно запечатать систему с помощью скрипта. Запустите Sysprep.bat, выберите пункт запечатывания в режиме аудита, а затем пункт запечатывания без файла ответов.



Пробуем развернуть систему


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


Маленькая хитрость. Если во время установки системы установщик сообщает, что система не сможет работать на данном оборудовании и прекращает установку, не верьте ему, просто разверните образ системы с помощью DISM'а, не исключено, что она будет работать.


Загрузитесь с ранее подготовленной флэшки c WinPE. Обратите внимание, что для развертывания системы в меню скрипта есть несколько пунктов. В любом случае Вам подойдет вариант с автоматическим определением режима загрузки, это значит, что система будет развернута в том режиме загрузки, в котором она загрузилась с флэшки. С помощью других пунктов развертывания можно развернуть систему для загрузки в режиме UEFI или Legacy. Но учтите, что система не загрузится если ее развернуть в режиме загрузки, который не поддерживает BIOS.


После выбора пункта развертывания, скрипт предложит выбрать один из wim файлов, который находится в папке Images. А если в выбранном файле будет более одного образа, то он предложит выбрать образ. Образ будет развернут на первый найденный диск, который не соответствует серийному номеру в файле Serial.txt. Это нужно, чтобы не удалить данные с загрузочной флэшки, ведь в WinPE у флэшки может быть номер диска 0 или 1. После развертывания образа скрипт инициализирует загрузочный раздел и скопирует на него файлы WindowsRE.


Развертывание по сети


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


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


На подготовленной флэшке, рядом с файлом Menu.bat создайте файл NetConfig.txt и вставьте в него следующие строки:


LanPath=User=Password=MenuFilePath=

Сразу после знака равенства без пробелов укажите для LanPath полный путь к сетевой папке, для User имя пользователя, для Password пароль для подключения к папке. Для MenuFilePath укажите путь к запускаемому файлу меню относительно сетевой папки. Пример:


LanPath=\\desktop\dUser=UserNamePassword=YourPasswordMenuFilePath=Images\WIM\Network\LanMenu.bat

В качестве файла меню можно использовать скрипт LanMenu.bat из папки Menu, которая находится рядом со скриптом подготовки загрузочной флэшки MakeBootMedia.bat. В скрипте LanMenu.bat добавлен пункт перезапуска скрипта. Это нужно на тот случай, если после запуска скрипта LanMenu.bat в WinPE Вы его измените и сразу захотите посмотреть на результат без перезагрузки.


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


А если Вы хотите, чтобы при загрузке с флэшки система автоматически запускала LanMenu.bat, то это тоже сделать очень легко. На флэшке, рядом с файлом Menu.bat создайте файл AutoRun.txt. Все команды, прописанные в этом файле, будут выполнены сразу после загрузки в контексте файла Menu.bat. Т.е. для автоматического выполнения пункта Меню сети нужно добавить в файл одну строчку


goto NetworkMenu

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


Драйверы


Драйверы должны попадать в систему в числе последних, когда уже точно будет известно, на каком оборудовании будет использоваться система. Если у Вас несколько устройств, которые требуют разных драйверов, но на них должна быть система с одинаковыми настройками, то самый простой способ, это на каждом устройстве отдельно установить необходимые драйверы и экспортировать их. А затем импортировать все драйверы в настроенную систему, так можно сделать образ для нескольких устройств. Естественно, так можно сделать только в том случае, если драйверы не конфликтуют друг с другом. В наборе скриптов есть скрипт Drivers.bat для экспорта и импорта драйверов.



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


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


При создании утилит для определения возможности использования драйвера с устройством учтите некоторые моменты. Для сопоставления идентификаторов оборудования и идентификаторов в inf файле можно использовать самый короткий идентификатор inf файла, который совпадает с началом длинных идентификаторов. При сопоставлении идентификаторов можно отбрасывать окончания: &SUBSYS, &REV, &CC вместе со всеми символами после этих окончаний. Пример такого обрезания идентификаторов можно увидеть в скрипте DriverRestrictions, в функции Add-Devices.


Файл ответов Sysprepа


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


Какие параметры можно настроить в файле ответов, можно посмотреть здесь. Наиболее часто используемые параметры находятся в разделе Microsoft-Windows-Shell-Setup. Для добавления новых разделов или создания больших файлов ответов можно использовать WSIM Windows System Image Manager, он находится в наборе Windows ADK. Для правки небольших файлов ответов удобней использовать текстовый редактор. В наборе скриптов, в папке Unattend, есть примеры файлов ответов.


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


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


Для чего нужен скрипт для запечатывания



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


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


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


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


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


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


  • Итоговый образ системы подготовлен на пробной версии
  • Забыли ввести ключ множественной активации ePKEA
  • Ключ ePKEA введен и находится в открытом виде

Исхитрись-ка мне добыть то, чаво не может быть


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


Как создать активированный образ системы?


Активированный образ создать нельзя. Можно только подготовить образ к активации введя ключ многократной активации ePKEA.


Как зашить ePKEA в BIOS?


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


Как сохранить ключ и предотвратить нецелевые активации с ключом?


Если Вы боитесь утечки непосредственно самого ключа, то можно предотвратить его утечку. Ключ ePKEA выдается на компанию, его получает один сотрудник. Сотрудник получивший ключ продукта может лично ввести его в чистую систему стандартным способом и сразу скрыть ключ продукта. Когда ключ будет скрыт его нельзя будет посмотреть, но система сможет активироваться. После этого можно запечатать систему в режиме аудита и сохранить образ системы. Данный образ можно использовать для дальнейших разработок.


Но таким способом можно предотвратить только утечку ключа. А предотвратить нецелевые активации с этим ключом не получится т.к. получившийся образ можно будет развернуть на любом оборудовании и активировать систему.


Послесловие


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


Но если говорить не о Windows 10 в целом, а о Windows 10 IoT Enterprise, то тиражирование это только часть, которую нужно освоить. А вторая часть это ее настройка. Во второй части статьи мы рассмотрим специальные возможности Windows 10 IoT Enterprise показанные на этом видео.


Если у вас остались вопросы относительно настройки и лицензирования Windows 10 IoT Enterprise, обращайтесь по адресу mse@quarta.ru или на сайт quarta-embedded.ru.
Ответы на некоторые вопросы Вы можете найти в нашей вики или на нашем YouTube-канале


Автор статьи: Борисенков Владимир, технический эксперт компании Кварта Технологии.

Подробнее..

Будни OEMщика (Часть 2)

24.09.2020 10:22:34 | Автор: admin

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


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


В этой части мы рассмотрим специализированные настройки, с помощью которых можно настроить устройство фиксированного назначения. К таким устройствам относятся: банкоматы, информационные киоски, рекламные панели, кассы и др. Плюс к этому режим мультикиоска можно настроить для офисного рабочего места, например для оператора колл-центра. При этом лицензия Windows 10 IoT Enterprise позволяет создавать множество учетных записей, а это значит, что на устройстве фиксированного назначения можно создать отдельную учетную запись для отдельного пользователя с индивидуальными настройками.


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


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


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


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


Для каждого, кто тебя знает, ты разный


В первой части статьи речь шла о Windows 10 в целом, а теперь, учитывая, что в данной части будет рассмотрена настройка мультикиоска, речь пойдет именно о Windows 10 IoT Enterprise 2019 т.к. в предыдущих версиях Windows 10 с долгосрочным обслуживанием нет поддержки мультикиоска. Если у Вас нет дистрибутива этой системы, то здесь можно скачать пробную версию. У пробной версии системы есть только одно ограничение она выключается каждый час. Чтобы выключения не были неожиданными, можно добавить уведомление за 5 минут до выключения системы с помощью скрипта TrialShutdownTimeControl.


Различные цифровые обозначения в названии продукта и номере версии часто приводят к путанице. Чтобы избежать путаницы, можно посмотреть версию операционной системы выполнив команду winver, у Вас должна быть версия системы 1809.



Почему многие компании реализуют свои решения именно на IoT Enterprise?


В первую очередь это вопрос цены, стоимость лицензии IoT зависит от процессора, с которым будет использоваться система. Для низкопроизводительных систем цена IoT может быть около 30% от стоимости Windows Pro.


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


  • Различные режимы киоска
  • Блокировка запуска приложений
  • Блокировка устройств
  • Защита диска от записи
  • Блокировка клавиш и ввода символов
  • Поддержка 10 лет с момента выпуска без перехода на следующую версию

Еще одним важным фактором является дополнительный способ активации Windows, который есть только у Windows 10 IoT Enterprise. Это активация с помощью ключа ePKEA. ePKEA это ключ множественной активации, который выдается на компанию. С этим ключом будут активироваться все устройства, выпускаемые компанией. С таким ключом доступны все стандартные способы активации, по интернету или по телефону. Данный ключ нужно ввести в систему перед тиражированием и скрыть его.


Сочетание максимальных возможностей и минимальной цены делает операционную систему Windows 10 IoT Enterprise очень привлекательной, именно поэтому ее выбирают множество компаний для своих устройств.


Пользователи


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


Ограничения для пользователя желательно настраивать не для конкретной учетной записи, а для группы Пользователи. Тогда, для временного снятия ограничений с пользователя достаточно перевести учетную запись из группы Пользователи в группу Администраторы.


Для быстрого создания пользователей можно воспользоваться скриптом Users, который находится в наборе скриптов. Просто введите имена пользователей в столбик в файл CreateUserList.txt и выберите в скрипте пункт меню создания пользователей. Скрипт создаст пользователей, отключит срок действия пароля и переведет пользователей в группу Администраторы. Для перевода пользователя между группами Пользователи и Администраторы достаточно выбрать имя пользователя в меню скрипта.



Безвыходных положений не бывает


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


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


Компания Кварта Технологии подготовила набор скриптов, в котором скрипты, отвечающие за типовые настройки могут работать в группе, т.е. за один раз можно включить или выключить множество настроек. Управлять группой скриптов можно с помощью скрипта SettingsGroup, который находится в корне каталога набора скриптов. С его помощью можно посмотреть текущие значения группы настроек и изменить их. По умолчанию в группе будут работать все скрипты, которые отвечают за типовые настройки. Но при необходимости можно изменить начальный каталог поиска скриптов, которые могут работать в группе, тем самым изменив набор изменяемых настроек. Настройки со значениями, нетипичными для устройств фиксированного назначения будут выделены красным, а настройки с типичными значениями для устройств фиксированного назначения зеленым.



Если Вы захотите добавить в какой-либо скрипт поддержку работы в группе, то это сделать несложно. Скрипт, который управляет группой скриптов, после выбора пункта меню ищет в указанной папке все скрипты PS1, в которых есть функция Lockdown и отправляет ей параметр в зависимости от выбранного пункта. Один из самых простых примеров реализации функции Lockdown в файле WindowsUpdate.ps1


Типовые настройки для устройств фиксированного назначения


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


Схема питания


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


Отображение ошибок


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


Отчеты об ошибках


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


Всплывающие уведомления


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


Сценарий службы политики диагностики


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


Отображение ошибок при загрузке


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


В наборе скриптов есть пример файла ответов для запечатывания с отключением отображений ошибок загрузки OOBEAuto_IgnoreAllBootFailures.xml


Отображение синего экрана


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


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


Отображение уведомлений об обновлениях


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


Автоматическое получение обновлений


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


Прокрутка от краев экрана


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


Отображение логотипа и анимации в виде крутящихся шариков


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


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


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


Отображение процесса входа пользователя в систему


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


Режимы киоска


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


  • Shell Launcher V1 средство для запуска приложений. Запускает одно классическое приложение вместо оболочки системы и контролирует его работу. При закрытии приложения можно настроить: перезапуск приложения, перезагрузку системы, выключение системы.
  • Shell Launcher V2 во второй версии добавлена возможность запуска универсальных приложений.
  • Ограниченный доступ запуск одного универсального приложения вместо оболочки системы.
  • Режим мультикиоска запуск системы в режима планшета и отображение плиток заранее назначенных приложений.

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


Shell Launcher V1


Для включения средства запуска оболочки нужно добавить компонент средства запуска оболочки в систему и заменить запуск стандартной оболочки explorer.exe на запуск средства запуска оболочки eShell.exe. Без настроек средство запуска оболочки будет запускать только командную строку, поэтому необходимо настроить средство запуска оболочки. В настройках по умолчанию можно указать приложение, которое будет запускаться для пользователя, которому не назначен запуск приложения. Плюс к этому, необходимо добавить настройку запуска оболочки системы для группы Администраторы т.к. при настройке запуска приложения для группы Пользователи у данной настройки будет приоритет выше, чем у настройки по умолчанию, следовательно, при отсутствии других настроек для группы Администраторы будет выполняться приложение, назначенное для группы Пользователи. Все эти настройки выполнит скрипт Shell Louncher при включении средства запуска оболочки.



Для настройки запуска приложения вместо оболочки системы необходимо выбрать в меню скрипта, для кого вы хотите настроить запуск оболочки для пользователя или для группы, а в следующем меню выбрать имя пользователя или группы. После выбора конкретного пользователя или группы откроется диалоговое окно для выбора запускаемого файла. После выбора запускаемого файла скрипт создаст в реестре ветку с SIDом выбранного пользователя или группы и пропишет в нее настройки запуска приложения. Скрипт всегда будет прописывать в параметре DefaultReturnCodeAction 0, что означает перезапуск приложения, если Вам необходимо, чтобы были выполнены другие действия при закрытии приложения, установите другое значение параметра DefaultReturnCodeAction. Допустимые параметры:


  • 0 перезапуск приложения
  • 1 перезагрузка
  • 2 выключение
  • 3 отсутствие действий

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


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


Созданные задачи в планировщике заданий не будут работать в режиме аудита.


Ограниченный доступ


Обратите внимание, что настроить режим ограниченного доступа можно только для тех учетных записей, которые находятся в группе Пользователи и не находятся в группе Администраторы. Запускаемое универсальное приложение нельзя закрыть или свернуть, в режиме ограниченного доступа будут заблокированы некоторые горячие клавиши. В данном режиме нет возможности выйти из учетной записи, есть возможность только заблокировать учетную запись и перейти на экран входа в систему. Если после перехода на экран входа в систему не будет никаких действий пользователя 30 секунд, то система автоматически вернется в учетную запись. Время ожидания действий пользователя можно изменить в параметре IdleTimeOut, подробнее об этом параметре можно узнать в соответствующем разделе нашей вики.


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



Режим мультикиоска


Режим мультикиоска можно посмотреть здесь. Настройке режима мультикиоска была посвящена отдельная статья, а здесь скажу об основных моментах. Для настройки мультикиоска был создан отдельный вспомогательный скрипт, который есть в статье посвященной настройке мультикиоска, позже он был интегрирован в общий набор скриптов. В наборе скриптов есть:


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

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



У каждого свой путь


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


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


При дальнейшей настройке системы мы столкнемся с некоторыми особенностями настроек локальной групповой политики. Чтобы эти особенности были понятными, сделаем небольшое отступление и рассмотрим их.


Особенности настроек локальной групповой политики


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


Изменять настройки локальной групповой политики можно разными способами:



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


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


В наборе скриптов есть скрипт LGPOMenu для автоматизации экспорта и импорта настроек локальной групповой политики.


Устройство с множеством пользователей


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



Если пользователю доступна клавиша Shift, обязательно отключите иконку управления питанием, т.к. при перезагрузке системы с удержанием Shift можно перейти в среду восстановления. Для отключения иконки выбора сетевого подключения есть отдельная настройка и отдельный скрипт для нее NetworkSelectionUI.


Если у пользователя будет возможность перехода на экран вызываемый по Alt + Ctrl + Del, необходимо выполнить и его настройку. Все отключенные иконки на экране входа в систему будут отключены и на экране, вызываемом по Alt + Ctrl + Del. Для отключения кнопок, находящихся над кнопкой Отмена, есть группа скриптов, которые находятся в папке Действия по Alt+Ctrl+Del. Во всей группе скриптов есть возможность изменить настройки для всех учетных записей или для конкретной учетной записи. При изменении настройки для всех учетных записей настройка будет изменена с помощью утилиты LGPO, а при изменении настройки только для текущего пользователя, настройка будет изменена в реестре.


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


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


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


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


Устройство с одним пользователем


Самый распространенный вариант использования однопользовательского решения это запуск классического приложения с помощью Shell Launcher V1. Напомню, что для удобства настройки и обслуживания устройства, лучше настроить все ограничения не для конкретного пользователя, а для группы Пользователи, тогда установить и снять ограничения для пользователя можно будет простым переводом учетной записи из одной группы в другую. Т.е. запуск конкретного приложения вместо оболочки системы лучше настроить не для конкретного пользователя, а для группы Пользователи.


Но если в Shell Launcher V1 будут настройки для запуска конкретного приложения для группы Пользователи, то система не сможет загрузиться после запечатывания в режиме приветствия (OOBE). Обойти данную проблему поможет скрипт для запечатывания Sysprep, он временно отключит Shell Launcher V1 и создаст задачу на его включение после первой загрузки в режиме OOBE. Подробнее эту проблему мы рассмотрим в следующей части статьи.


На устройстве с одним пользователем можно не настраивать экран входа в систему и экран вызываемый по Alt + Ctrl + Del, достаточно просто лишить пользователя возможности перейти на эти экраны. Заблокировать Alt + Ctrl + Del и другие горячие клавиши нам поможет фильтр клавиатуры.


Фильтр клавиатуры


С включением и настройкой фильтра клавиатуры нам поможет скрипт Keyboard Filter из набора скриптов. При включении фильтра клавиатуры он добавит компонент фильтра клавиатуры и пропишет в реестр команду запуска службы фильтра клавиатуры при следующей загрузке системы.



Фильтр клавиатуры оказывает влияние на работу режима ограниченного доступа без какой-либо настройки. В режиме ограниченного доступа будут заблокированы горячие клавиши Alt + Ctrl + Del, перейти на экран входа в систему можно будет только при пятикратном нажатии клавиши разблокировки, по умолчанию это кнопка Win.


С помощью фильтра клавиатуры можно:


  • Запретить использование горячих клавиш специальных возможностей
  • Запретить использование комбинаций клавиш
  • Запретить ввод конкретных символов
  • Запретить использование конкретных клавиш
  • Назначить клавишу разблокировки системы

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


Чтобы лишить пользователя возможности перехода на экран вызываемый по Alt + Ctrl + Del и на экран входа в систему, заблокируйте горячие клавиши Alt + Ctrl + Del.


Настройки фильтра клавиатуры находятся в реестре, для быстрого перехода к настройкам фильтра клавиатуры выберите пункт открытия настроек в меню скрипта. В ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Embedded\KeyboardFilter находится перечень клавиш и клавиатурных сочетаний, которые можно заблокировать, прописав значение Blocked.


При открытии настроек фильтра клавиатуры с помощью скрипта, в разделе KeyboardFilter скрипт создаст еще два подраздела CustomFilters и CustomScancodes.


В разделе CustomFilters можно добавить любые символы и клавиатурные сочетания, которых нет в разделе KeyboardFilter и заблокировать их. Учтите, что для блокировки горячих клавиш с использованием букв, необходимо указывать блокировку для имеющихся раскладок клавиатуры. Например, если в системе русская и английская раскладка, то для блокировки горячих клавиш Ctrl+X необходимо добавить еще и блокировку Ctrl+Ч, чтобы горячие клавиши не работали на русскоязычной раскладке.


В разделе CustomScancodes можно заблокировать конкретную клавишу, указав ее скан-код. Скан-код клавиши можно узнать с помощью программы SharpKeys. Чтобы узнать скан-код клавиши запустите программу SharpKeys, в окне программы нажмите на кнопку Add, после чего откроется новое окно программы, в нем нажмите на кнопку Type Key, а затем нажмите на клавишу, скан-код которой Вы хотите узнать. После нажатия на клавишу появится новое окно, в котором будет показан скан-код. В реестр нужно прописать те символы, которые указаны после нижнего подчеркивания.



Периодически начинающие задают вопрос, чем отличается блокировка символа и клавиши? При блокировке символа будет запрещен ввод именно символа, независимо от того, на какой клавише он находится. При блокировке символа Z можно будет вводить символ Я, хотя они находятся на одной клавише. При блокировке клавиши, которой назначен ввод символов Z и Я нельзя будет ввести ни один из этих символов, но если переназначить ввод этих символов на другую клавишу, то их можно будет вводить.


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


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


Послесловие


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


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


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


Если у вас остались вопросы относительно настройки и лицензирования Windows 10 IoT Enterprise, обращайтесь по адресу mse@quarta.ru или на сайт quarta-embedded.ru. Ответы на некоторые вопросы Вы можете найти в нашей вики или на нашем YouTube-канале


Автор статьи: Борисенков Владимир, технический эксперт компании Кварта Технологии.

Подробнее..

Будни OEMщика (Часть 3)

30.09.2020 08:10:03 | Автор: admin

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


В этой части мы рассмотрим, как повысить безопасность и отказоустойчивость системы с помощью стандартных средств Windows: AppLocker, фильтр записи, блокировка устройств. Плюс к этому рассмотрим особенности запечатывания системы в режиме приветствия (OOBE) с некоторыми специфичными настройками системы.


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


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


  • С помощью скрипта настройки питания PowerSettings включена схема питания HORM
  • Система в режиме аудита
  • В системе есть две созданные учетные записи, одна только в группе Администраторы, вторая только в группе Пользователи
  • С помощью Shell Launcher V1 настроен запуск приложения для группы Пользователи

Напомню, что все настройки мы выполняем на Windows 10 IoT Enterprise версии 1809. Убедитесь, что у Вас именно эта версия системы, выполнив команду winver.



Если у Вас нет дистрибутива этой системы, то Вы можете скачать пробную версию.


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


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


Блокировка запуска приложений


Блокировка запуска приложений будет выполняться с помощью AppLockerа. Учтите, что правила AppLockerа не работают в режиме мультикиоска, т.к. в режиме мультикиоска по умолчанию запрещен запуск всех приложений, которые не разрешены. Чтобы правила мультикиоска и AppLockerа не конфликтовали, в режиме мультикиоска AppLocker не работает.


Блокировка запуска приложений не только усилит защиту от вредоносного ПО, а еще и не даст пользователю попасть куда не нужно, например, в настройки.


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


Вот вполне реальный пример. Есть информационный киоск с сенсорным экраном. На киоске настроен режим киоска Shell Launcher V1, который запускает IE. IE настроен на запуск в полноэкранном режиме, кнопки управления окном скрыты, отключен вызов контекстного меню. IE отображает интернет-страницу.


И казалось, ничего не предвещало беды но судьба распорядилась по-другому.


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


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


Для проверки работоспособности блокировки приложений можно временно отключить фильтр клавиатуры, чтобы пользователь мог вызвать диспетчер задач по Ctrl + Shift + Esc и окно залипания клавиш по пятикратному нажатию Shift.


Для начала рассмотрим особенности настройки AppLockerа в целом теоретическая часть. А потом рассмотрим, как настроить правила запуска приложений по белому списку практическая часть.


Теоретическая часть


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


Для AppLockerа необходимо создать правила по умолчанию для разделов Исполняемые правила и Правила упакованных приложений. Создать правила можно в контекстном меню раздела.



После создания правил по умолчанию можно включить AppLocker, для включения AppLockerа необходимо запустить службу AppIDSvc и перевести ее в автоматический режим запуска. Но AppLocker начнет работать не сразу, а после применения политики AppLockerа к системе. О том, что правила AppLockerа применены к системе, можно узнать из журнала AppLockerа Управление компьютером\Служебные программы\Просмотр событий\Журналы приложений и служб\Microsoft\Windows\AppLocker\EXE и DLL. После применения правил в журнале появится запись с кодом события 8001, в событии будет уведомление о том, что политика AppLockerа применена к системе.


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


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


Для правил AppLockerа можно настроить политику применения правил.



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


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


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


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


Практическая часть


Для настройки по белому списку будем использовать скрипт AppLocker, который находится в наборе скриптов.


Включите AppLocker, выбрав соответствующий пункт меню. Скрипт проверит, есть ли минимально необходимые правила для AppLockerа, если их нет, то он предложит их создать. При подтверждении скрипт создаст правила, где разрешен запуск всех программ только для группы Администраторы, а для группы Пользователи правила не прописаны, т.е. запрещен запуск всех программ. После создания правил скрипт запустит службу AppIDSvc и настроит ее автоматический запуск.


Если Вы согласны с предложением скрипта создать правила, просто нажмите Enter.


Чтобы узнать, что AppLocker начал работать, просто обновите информацию об AppLockerе, выбрав соответствующий пункт меню.



Когда AppLocker начнет работать, выберите пункт изменения политики правил и включите режим аудита.


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


Когда система загрузится, выполнит вход в учетную запись пользователя и запустит назначенное приложение вместо оболочки системы, перейдите в учетную запись администратора, запустите скрипт настройки AppLockerа, выберите пункт выбора группы для создания правил AppLockerа. В пункте выбора группы выберите группу Пользователи (Users).


После создания правил вернитесь в главное меню скрипта и выберите пункт отображения правил AppLockerа. У меня для пользователя был настроен запуск Tools\TestRunAs.bat, который находится в наборе скриптов, я получил вот такой набор правил.



Первые два правила для группы Administrators создал скрипт перед запуском AppLockerа. Остальные правила, с приставкой AuditBased, скрипт создал на основании результатов аудита. При желании Вы можете изменить приставку, которая добавляется к создаваемым правилам, для этого нужно просто поменять в скрипте AppLocker.ps1 значение параметра -RuleNamePrefix. Этот параметр легко найти с помощью поиска Ctrl + F.


Теперь посмотрим, что у нас получилось. Измените политику применения правил на принудительное применение правил и перезагрузите систему. Когда система загрузится, и запустится назначенное приложение вместо оболочки системы, попробуйте вызвать диспетчер задач с помощью Ctrl + Shift + Esc или открыть окно настройки залипания клавиш с помощью пятикратного нажатия Shift.



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


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


После настройки AppLockerа отключите автоматический вход пользователя в систему.


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


Запечатываем систему в режиме приветствия OOBE


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


В обычном режиме работы системы мы посмотрим на те настройки, которые не работают в режиме аудита. А именно:


  • Блокировка устройств
  • Отключение отображения процесса загрузки системы
  • Фильтр записи

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


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


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


  • Вместо назначенного приложения будет запущена оболочка системы
  • Не будет ограничений фильтра клавиатуры
  • AppLocker разрешит запускать любые приложения.

Для этого мы и настраивали все ограничения именно для группы. Но всякое решение плодит новые проблемы


Мюллер шел по улице. Вдруг ему на голову упал кирпич.
"Вот тебе раз," подумал Мюллер.
"Вот тебе два," подумал Штирлиц, бросая второй кирпич.


При тиражировании системы ее обязательно нужно запечатать для сброса уникальных SIDов системы и обязательно в режиме приветствия, не использовать же систему в режиме аудита. Но если настроен режим киоска Shell Launcher V1 с указанием запуска приложения именно для группы Пользователи, то система не сможет загрузиться в режиме приветствия.


Если правила AppLockerа настроены по белому списку, и в правилах для пользователя нет разрешения на запуск приложений, которые запускаются при прохождении OOBE, то система не загрузится в режиме приветствия.


Перед запечатыванием системы в режиме OOBE скрипт проверяет настройки Shell Launcherа и AppLockerа. Если настройки будут препятствовать загрузке системы в режиме приветствия, то скрипт предложит временное отключение этих настроек. Настройки AppLockerа и Shell Launcherа будут проверены отдельно друг от друга, и для каждой настройки отдельно будет предложено временное отключение. При подтверждении отключения настроек скрипт отключит их и создаст задачу на их включение, задача будет выполнена после входа в учетную запись при первой загрузке после запечатывания, после включения настроек система будет перезагружена еще раз.


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


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


Ограничение установки драйверов


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


Данная возможность не работает в режиме аудита.


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


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


Настройка в локальной групповой политике


Настройка ограничения установки устройств находится в локальной групповой политике. Конфигурация компьютера\Административные шаблоны\Система\Установка устройства\Ограничение на установку устройств



Можно запретить установку устройства по ID устройства или по GUIDу класса оборудования. После запрета установки устройств нельзя будет установить драйвер, который соответствует указанному GUIDу класса или указанному ID оборудования. При этом ранее установленный драйвер будет работать.



ID устройства можно указывать не полностью, сопоставление ID в правилах с ID в системе будет производиться по частичному совпадению с начала строки. Правило запрещения устройства с ID PCI\VEN_8086&DEV_9D23 будет запрещать все устройства по маске PCI\VEN_8086&DEV_9D23*, т.е. устройство с ID PCI\VEN_8086&DEV_9D23&SUBSYS_8079103C&REV_21\3&11583659&0&FC будет запрещено.


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


При необходимости запретить работу уже установленного драйвера, нужно установить флажок Также применить для соответствующих устройств, которые уже были установлены. Данная настройка будет распространяться на весь перечень указанных устройств. Эту возможность можно настроить отдельно для списка запрещенных ID и GUIDов классов. Будьте внимательны при установке запретов на работу уже установленных драйверов по GUIDу класса. Например, GUID класса флэшки может совпадать с GUIDом класса SSD, на котором установлена система, при установке запрета на работу уже установленного драйвера с таким GUIDом система не сможет загрузиться.


Установленные запреты распространяются на всех пользователей, в том числе и на администраторов. Чтобы снять все ограничения для администратора, можно включить настройку Разрешить администраторам заменять политики ограничения установки устройств. Если эта настройка нужна для обхода запрета использования установленного драйвера, то для возобновления работы устройства нужно просто выполнить автоматический поиск драйвера. Учтите, что после возобновления работы устройства оно будет доступно для всех пользователей, поэтому после обслуживания устройства нужно отключить разрешение для администраторов заменять политики ограничений.


Добавление ID и GUIDов классов в перечень запрещенных это настройка по черному списку, для настройки правил по белому списку нужно включить настройку Запретить установку устройств, не описанных другими параметрами политики. После включения данной настройки будет запрещена установка новых драйверов, для которых не настроено явного разрешения. Работа установленных драйверов будет разрешена. При необходимости устанавливать драйверы на некоторые устройства, их можно добавить в разрешенные по ID и GUIDов классов.


Настройка с помощью скрипта



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


При выборе пунктов разрешения или запрета установки драйверов по ID или по GUIDу класса, скрипт покажет таблицу с перечнем текущих устройств, которые еще не добавлены в правила выбранного параметра. При составлении таблицы с перечнем ID, после получения перечня всех устройств скрипт исключает ID, которые начинаются с: PRINTENUM, ROOT, SW, ACPIAPIC, MONITOR. При необходимости, перечень исключаемых ID можно изменить в функции Add-Devices. У оставшихся ID будут отброшены окончания: &SUBSYS, &REV, &CC вместе со всеми символами после этих окончаний.



С помощью фильтра можно найти устройство по частичному совпадению, поиск которого будет по всем столбцам таблицы. В таблице можно выбрать более одного устройства. Для добавления выбранных устройств в правило нужно нажать OK.


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



После удаления правил скрипт будет автоматически включать отключенные устройства. Но при включении разрешения замены правил для администраторов нужно будет вручную обновлять драйверы отключенных устройств.


Запретить работу уже установленных драйверов можно с помощью пунктов включения / отключения запрета к установленным драйверам.


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


Фильтр записи


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


Важно!!!


  1. Включать фильтр записи необходимо непосредственно на конечном устройстве после активации системы.
  2. При включении фильтра записи изменяются некоторые настройки системы, но при выключении фильтра записи измененные настройки не возвращаются в исходное состояние.
  3. Нельзя запечатывать систему с включенным фильтром записи.

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


А вот непридуманная ситуация. Некоторые работники каждое утро тратят 30 40 минут на то, чтобы открыть все необходимые окна в специализированном ПО, сделать их определенного размера и расставить их в определенном порядке. Эту проблему можно решить с помощью функции HORM, которая есть в фильтре записи.


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


Теоретическая часть


Фильтр записи необходим для сохранения данных в исходном состоянии. Можно выделить две основные функции:


  1. Защита данных от изменений на несъемных носителях
  2. Загрузка системы в определенное состояние из файла гибернации режим HORM
    Сначала рассмотрим работу фильтра записи с настройками по умолчанию, а затем рассмотрим, какие еще есть варианты настройки и для чего они нужны.

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



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


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


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


У фильтра записи есть уведомления об уровнях заполненности оверлея, это порог предупреждения по умолчанию 512 MB и критический порог по умолчанию 1024 MB. При достижении определенного порога в журнал системы будут внесены определенные записи. Журналы Windows > Система.


Overlay usage Source Level Event ID
Warning threshold uwfvol Warning 1
Critical threshold uwfvol Error 2
Back to normal uwfvol Information 3

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


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


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



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


И еще одна особенность оверлея на HDD режим постоянного оверлея. Данный режим подразумевает сохранение данных в оверлее после перезагрузки системы. А для очистки оверлея перед перезагрузкой необходимо выполнить команду, которая сообщит фильтру записи о необходимости очистить оверлей.


Появляется вопрос, если вся система защищена, то как установить обновления, если они нужны? У фильтра записи для этого есть сервисный режим. Для перевода в сервисный режим необходимо выполнить команду uwfmgr servicing enable и перезагрузить систему. В сервисном режиме система сама загрузит и установит обновления, а затем перезагрузится в нормальном режиме работы.


Есть еще некоторые особенности обслуживания устройств с включенным фильтром записи.


HORM


HORM Hibernate Once/Resume Many (HORM). Принцип работы HORMа понять очень просто. Все наверно знают, как работает режим гибернации. При переводе системы в режим гибернации все данные из оперативной памяти записываются на жесткий диск в файл hiberfil.sys, а при включении ПК все данные из файла hiberfil.sys записываются в оперативную память. HORM работает точно так же, только есть одно маленькое но, Вы вводите систему в режим гибернации один раз, а в дальнейшем при каждой загрузке система всегда записывает данные из hiberfil.sys в оперативную память. При этом не важно, как была завершена работа системы выключением или перезагрузкой. Только учтите, что фильтр записи не защищает файл гибернации, поэтому нужно отключить все способы перевода системы в режим гибернации кроме консольного.


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


Для работы режима HORM есть ряд требований:


  1. Все тома несъемных носителей должны быть защищены
  2. Не должно быть никаких исключений из защиты в реестре и файловой системе
  3. Оверлей должен быть в оперативной памяти.

Настраиваем фильтр записи


Перед настройкой фильтра записи необходимо добавить компонент фильтра записи. Вся настройка фильтра записи производится в командной строке с помощью утилиты uwfmgr.exe. Базовые возможности фильтра записи можно настроить с помощью скрипта UnifiedWriteFilter, который находится в наборе скриптов.



Для отображения текущего состояния фильтра записи добавьте компонент фильтра записи и перезагрузите систему. Если Вам недостаточно параметров настроек, которые отображает скрипт, можно отобразить текущие настройки, выбрав соответствующий пункт меню скрипта, тогда будут показаны настройки, которые отображаются при выполнении команды uwfmgr get-config.


С помощью пункта установки размера оверлея можно переключать размер оверлея между размером по умолчанию и максимально возможным размером. Это возможность скрипта, такой возможности нет в стандартных настройках. Максимально возможный размер вычисляется следующим образом. Скрипт получает объем оперативной памяти и вычитает минимально необходимый объем для данной системы. 1 ГБ для x32 и 2ГБ для x64. При изменении объема оверлея будут автоматически изменены пороги предупреждения.


С помощью пункта изменения уровня порогов можно изменять уровень порогов межу стандартным и рекомендуемым. Это возможность скрипта, такой возможности нет в стандартных настройках. Стандартные уровни порогов: 50% от объема оверлея порог предупреждения, 100% от объема оверлея критический порог. Рекомендуемые пороги предупреждения отличаются для реального и виртуального ПК. Для реального ПК: 80% от объема оверлея порог предупреждения, 90% от текущего объема оверлея критический порог. Для виртуального ПК: 10% от объема оверлея порог предупреждения, 20% от текущего объема оверлея критический порог. При необходимости Вы можете сами изменить в скрипте % уровня порогов от оверлея, за них отвечают переменные WarningThresholdGlobal и CriticalThresholdGlobal.


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


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


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


Периодически бывают вопросы, как посмотреть содержимое оверлея, для этого в скрипт добавлен пункт отображения оверлея системного диска. Он добавлен как пример и реализован с помощью Unified Write Filter WMI т.к. содержимое оверлея нельзя посмотреть с помощью утилиты uwfmgr.


А теперь ближе к практике


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


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



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


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


Если Вы захотите выключить фильтр записи, когда у вас включен режим HORM, то сначала необходимо выполнить команду на отключение режима HORM, а затем выполнить команду на отключение фильтра записи. Но если Вы будете отключать фильтр записи с помощью скрипта, то скрипт автоматически отключит HORM перед выключением фильтра записи.


Послесловие


При настройке устройств фиксированного назначения на Windows 10 IoT Enterprise необходимо знать о ее специальных возможностях. Не исключено, что использование специальных возможностей позволит сэкономить на дополнительном ПО, которое может являться аналогом возможностей, которые уже есть в системе. Не исключено, что у дополнительного ПО могут быть преимущества перед стандартными средствами Windows, но, когда Вы что-то покупаете, необходимо понимать, за что именно Вы платите деньги. С помощью набора скриптов можно довольно быстро настроить специальные возможности Windows и сравнить их со сторонним ПО, чтобы принять взвешенное решение.


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


Если у вас остались вопросы относительно настройки и лицензирования Windows 10 IoT Enterprise, обращайтесь по адресу mse@quarta.ru или на сайт quarta-embedded.ru.
Ответы на некоторые вопросы Вы можете найти в нашей вики или на нашем YouTube-канале


Автор статьи: Борисенков Владимир, технический эксперт компании Кварта Технологии.

Подробнее..

Azure Custom Vision без Azure, или где у них маска. Как мы распознавали маску на лице (и других частях тела)

26.01.2021 14:17:08 | Автор: admin

Среди набора примеров для Azure на GitHub был найден один очень интересный: распознавание образов на Raspberry Pi, в офлайне. Авторами предлагается подготовить модель машинного обучения в одном из облачных сервисов Azure, затем перенести ее на компьютер, у которого большую часть времени нет подключения к Интернет, после чего распознавание образов будет работать автономно. Разработчики подготовили проект для двух платформ: ARM32 (собственно Raspberry Pi) и AMD64 (но без поддержки веб-камеры).


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


Все сложно...


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


В Azure Computer Vision, например, даже не нужно обучать модель перед ее использованием: есть набор облачных API, уже готовый к применению. Для более сложных задач есть Azure Custom Vision, где мы сначала обучаем модель, потом ей пользуемся. Причем знание специфической математики практически не требуется, все делается прямо в браузере мышкой. Знание пары терминов из машинного обучения все-таки понадобится, чтобы понять, насколько качественно работает модель.


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


  • Поскольку вся логика находится в облаке, придется передавать туда-обратно много данных, даже если их передача не нужна;
  • Время реакции на распознавание будет зависеть от качества соединения и доступности облачных сервисов;
  • При пропадании соединения все решение перестает работать.

В то же время совсем отказываться от готовых сервисов жутко неудобно, потому что:


  • Для всего придется разрабатывать свой код и настраивать все вручную;
  • Непонятно, как впоследствии масштабировать решение. Что, если таких "турникетов" нужно 100 штук?

Что делать?


Итак, есть вариант "только облако", есть "совсем без облака". Оба варианта крайности. Было бы удобно взять лучшее от облачных сервисов, но "спустить их на землю". Например, однократно обучить модель на Azure Custom Vision, не углубляясь в вопросы математики, а затем использовать эту модель автономно, без подключения к Интернет.


Такое решение уже существует: Azure IoT Edge позволяет использовать предварительно экспортированную модель машинного обучения без постоянного подключения к Интернет. При этом мы получаем все преимущества и со стороны облака, и со стороны полностью наземного решения:


  • Будем передавать в облако только необходимую телеметрию;
  • Для обучения модели практически неограниченные объемы хранилища и вычислительной мощности;
  • Быстрый цикл управления, т.к. все решения принимаются локально, а не в облаке;

Azure IoT Edge и с чем его едят


Подробно мы описывали IoT Edge в этой статье. Вкратце, IoT Edge включает среду выполнения демон Linux, "внутри" которого выполняются модули, которые, в свою очередь, являются Docker-совместимыми контейнерами. Поддержка устройств IoT Edge включена в Azure IoT Hub. Среда выполнения IoT Edge единожды устанавливается на устройство, а затем набор модулей конфигурируется через облако, с портала Azure, после чего компьютер с IoT Edge может работать автономно, без подключения.


"Родной" платформой для IoT Edge по архитектурным причинам является Linux, хотя с 2019 года IoT Edge доступен и для Windows 10 Enterprise LTSC ОС для устройств специального назначения.


Модули IoT Edge могут содержать произвольный код, или в модули можно "обернуть" следующие службы Azure:



В нашем случае интерес представляет как раз Custom Vision. В этом сервисе мы подготовим модель распознавания маски и "обернем" ее в модуль.


В IoT Edge заложен механизм обмена сообщениями с между модулями и между модулями и облаком. Сами сообщения передаются в подобии текстового формата, поэтому такой механизм плохо подходит для обмена сырыми двоичными данными (картинками), поэтому в исходном примере от Microsoft для обмена картинками с камеры между модулями используется HTTP, т.е. один из обменивающихся данными модулей является web-сервером, а другой клиентом.


Пример распознавания изображений от Microsoft


Рассмотрим структуру исходного примера распознавания изображений. Рекомендую посмотреть видео, где ведущие наглядно объясняют, что и как устроено.



На схеме обработка начинается с видеопотока с обычной веб-камеры, подключенной через USB к устройству, на котором предварительно установлена среда выполнения IoT Edge.


Откуда на этом устройстве возьмется среда IoT Edge? Ее необходимо установить вручную, и после того, как она установит подключение к IoT Hub, ей можно (и нужно) управлять уже с IoT Hub. Под "управлением" я также подразумеваю установку модулей.


Модули устанавливаются по команде с IoT Hub. Причем на IoT Edge "спускается" не сам модуль, а как бы ссылка на его скачивание. Механизм устроен так, что предварительно модули нужно выложить в Container Registry (это специальный репозиторий для хранения модулей).


Модули после установки взаимодействуют, как показано на следующей схеме, взятой из того же примера:



  • Camera: модуль захвата видео с камеры. Видео "нарезается" на картинки (не кадры! Из десятка кадров в обработку может уйти только один) и по HTTP передается в следующий модуль;
  • AI: модуль, содержащий обученную модель машинного обучения. Модель работает с отдельными изображениями, а не с видеопотоком, именно поэтому видео "нарезается" на картинки. Модель машинного обучения предварительно должна быть подготовлена в сервисе Custom Vision;
  • Display: модуль, отображающий результаты распознавания. Конкретно в рассматриваемом примере предлагается отличить банан от яблока, соответственно, на экране будет либо картинка яблока, либо банана (либо ничего).

Помимо всего прочего, телеметрия отсылается непосредственно в IoT Hub.


Если мы хотим использовать какую-то свою модель с данным примером, в описании к нему нам предлагается просто заменить модель на свою. Мы в Кварта Технологии проверили этот сценарий, но из-за ограниченности ресурсов Raspberry Pi работало такое решение ну очень медленно, так что на практике пользоваться им было очень неудобно.


Соответственно, для этого примера напрашивается более мощная платформа. AMD64 уже поддерживается, вот только в такой конфигурации реальная веб-камера почему-то не предусмотрена и предлагается пользоваться ее эмуляцией за счет зацикленного куска видео, на котором есть и яблоко, и банан. Это нас точно не устроит, поэтому во что бы то ни стало будем подключать "живую" веб-камеру, пользуясь кодом от ARM32.


Есть еще одна проблема. У компьютера на базе AMD64 нет "экранчика" SenseHat, как в Raspberry Pi, поэтому так элегантно, как на SenseHat, результат распознавания уже не отобразить, и придется придумывать что-то свое.


Обучение модели (Custom Vision)


Заходим на Custom Vision (понадобится подписка Azure) и нажимаем New Project.


  • Name вводим произвольное имя;
  • Description произвольное описание;
  • Resource нажимаем Create new и создаем новый ресурс типа Cognitive Services;
  • Classification Types выбираем Multilabel, так как мы будем определять не только наличие/отсутствие маски, но и где именно она надета на лице или на теле (гуглим "бикини из масок")
  • Domains General (compact).

После создания проекта загружаем предварительно подготовленные картинки следующих типов:


  • Люди в маске на лице, размечаем тегом MaskOnFace;
  • Люди в маске не на лице ("бикини из масок"), размечаем тегом MaskNotOnFace на волне маскобикини-хайпа используем и такой случай, чтобы наша модель машинного обучения не пропускала хитрых фитоняш в маскобикини через турникет (наверное, стоящий на входе в фитнес-клуб, где они качаются);
  • Люди без масок, изображения масок без людей, не размечаем тегами (Negative).

Картинки можно найти в интернете или пофоткать всех знакомых.


Нажимаем кнопку Train, далее Advanced training и ждем, пока модель обучается. После чего на вкладке Performace можно посмотреть параметры качества функционирования модели.


Здесь важно, собственно, понимать эти параметры качества ну хотя бы в общих чертах.


Значение Probability Threshold это вероятность назначенного тега, в зависимости от которой рассчитываются параметры качества функционирования модели. Значение Probability Threshold = 90% означает, что правильными предсказаниями будут считаться теги, вероятность которых оказалась выше 90%. Думаю, эта фраза требует пояснения. Вообще, в машинном обучении ответы обычно не дискретные (да/нет), то есть модель не может "ответить" на вопрос "на лице ли у человека маска" просто "да" или "нет". Грубо говоря, будет что-то типа "маска на лице с вероятностью 89%". Проблема в том, что для расчета параметров качества модели нужны как раз те самые дискретные "да" или "нет". И вот если параметр этот самый Probability Threshold установлен 90%, то ответ "маска на лице с вероятностью 89%" превратится в дискретное "нет", а ответ "маска на лице с вероятностью 91%" превратится в дискретное "да".


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


  • Параметр Recall (полнота) означает способность алгоритма обнаруживать заданный класс вообще;
  • Параметр Precision (точность) способность отличать этот класс от других классов.

Чем больше каждое из значений тем лучше.


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


Модель следует опубликовать (Publish), а затем экспортировать (Export Dockerfile Linux). Полученный файл далее будет использоваться в модуле IoT Edge.


Подготовка наземной платформы


Из-за архитектурных особенностей примера нам понадобится платформа (а именно процессор) с поддержкой AVX инструкций (узнать, поддерживает ли платформа AVX инструкции, можно, выполнив команду grep avx /proc/cpuinfo) это потребуется для корректной работы библиотеки tensorflow. Если вы хотите использовать платформу без поддержки AVX, потребуется пересобрать библиотеку, что выходит за рамки данной статьи. Упростим себе жизнь и возьмем платформу с соответствующей поддержкой. Мы использовали Intel NUC на базе Core i5.


В качестве ОС будем использовать Ubuntu 20.04 LTS. Сложность заключается в том, что инструкций для установки IoT Edge для данной версии нет (слишком свежая по мнению Microsoft?), поэтому о процессе настройки расскажем достаточно подробно.


Вначале установите саму ОС с графическим окружением, затем откройте командную строку для установки Edge. По умолчанию все команды выполняются в домашнем каталоге (~).


Установим необходимые утилиты:


sudo apt-get updatesudo apt-get install wget nano

Устанавливаем конфигурацию репозитория:


wget https://packages.microsoft.com/config/ubuntu/20.04/prod.listmv prod.list microsoft-prod.list

Копируем полученный файл в директорию sources.list.d, чтобы ОС "видела" репозитории Microsoft:


sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/

Загружаем и устанавливаем публичный ключ Microsoft GPG:


wget https://packages.microsoft.com/keys/microsoft.asccat microsoft.asc | gpg --dearmor > microsoft.gpgsudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/

Устанавливаем ПО для контейнеризации (обратим внимание на первую команду ее обязательно нужно выполнить, так как мы добавили новые репозитории и apt еще "не в курсе"):


sudo apt-get updatesudo apt-get install moby-engine

Устанавливаем демон IoT Edge:


sudo apt-get install iotedge

И с удивлением обнаруживаем, что такого пакета в добавленных выше репозиториях нет (это касается только нашей Ubuntu 20.04 на момент публикации статьи), поэтому вместо следования документации пойдем своим путем. Можем добавить репозитории от более ранней версии Ubuntu (18.04 что, строго говоря, не очень хорошая идея) или установить пакеты вручную (правда, опять же, от более ранней версии). Пойдем вторым путем и установим нужные пакеты с GitHub. Ищем Latest release и устанавливаем его при помощи dpkg. Нам также понадобится libssl определенной версии:


wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl1.0/libssl1.0.0_1.0.2n-1ubuntu5_amd64.debsudo dpkg -i libssl1.0.0_1.0.2n-1ubuntu5_amd64.debwget https://github.com/Azure/azure-iotedge/releases/download/1.0.10.4/libiothsm-std_1.0.10.4-1_ubuntu16.04_amd64.debsudo dpkg -i libiothsm-std_1.0.10.4-1_ubuntu16.04_amd64.debwget https://github.com/Azure/azure-iotedge/releases/download/1.0.10.4/iotedge_1.0.10.4-1_ubuntu16.04_amd64.debsudo dpkg -i iotedge_1.0.10.4-1_ubuntu16.04_amd64.deb

Среда выполнения IoT Edge установлена, но она пока не подключена к Azure. Чтобы это сделать, наберем команду:


sudo nano /etc/iotedge/config.yaml

И в открывшемся файле увидим, что для подключения к Azure необходимо указать значение device_connection_string в разделе provisioning. Для того, чтобы получить это значение, зарегистрируем наш экземпляр IoT Edge в Azure.


Настройки в Azure


Все экземпляры IoT Edge подключаются к IoT Hub, который мы сейчас и создадим на портале Azure. Если у вас нет подписки создайте пробную.


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



В результате ваше устройство IoT Edge будет подключено к созданному IoT Hub, а также будет подготовлен репозиторий контейнеров.


Разработка


Внутри IoT Edge нашего решения будут исполняться сразу три модуля:


  • Модуль захвата изображения с камеры. Работает напрямую с веб-камерой, подключенной по USB. Отдает картинку на следующий модуль по HTTP;
  • Модуль машинного обучения, распознающий изображения и классифицирующий их (в маске/без маски/маска не на лице). Получает картинку по HTTP, отдает результат распознавания в следующий модуль путем обмена сообщениями;
  • Модуль отображения (веб-сервер). Отдает по запросу веб-страницу, на которой можно увидеть видео с камеры и результат распознавания.

Схема коммуникаций между модулями показана ниже:



Перед тем, как приступить к разработке, нам потребуется загрузить и установить соответствующие инструменты.


Важно! Последующие действия нужно выполнять на компьютере с Windows 10, а не на устройстве с IoT Edge.

  • Загрузите и установите Visual Studio Code. Разработку также можно вести и в Visual Studio;
  • Установите расширение Azure IoT Edge Extension. После установки на открывшейся странице нажмите Select IoT Hub, пройдите аутентификацию и выберите созданный ранее IoT Hub;
  • Установите расширение Azure IoT Tools;
  • Установите Python 3.8.3. При установке отметьте опцию Add Python to PATH подробнее здесь в секции Task 4;
  • Перейдите в Панель управления, затем Программы и компоненты, и убедитесь, что включена вся группа Hyper-V и Контейнеры. Если нет отметьте их, нажмите OK и при необходимости перезагрузите компьютер;
  • Установите Docker for Windows подробнее там же в секции Task 5;
  • Установите клиент Git для Windows последней доступной версии.

Важно! В случае проблем с виртуализацией Docker выполните команду в командной строке администратора: bcdedit /set {current} hypervisorlaunchtype Auto и перезагрузите компьютер.

Важно! Включение Hyper-V сделает неработоспособной виртуализацию VirtualBox. Для того, чтобы быстро восстановить работоспособность VirtualBox, можно выполнить команду в командной строке администратора: bcdedit /set {current} hypervisorlaunchtype off, но при этом "сломается" Hyper-V и Docker.

Получите исходный код примера, выполнив команду:


git clone https://github.com/Azure-Samples/Custom-vision-service-iot-edge-raspberry-pi.git

Рекомендую также переключиться на коммит, который был использован для модификации примера:


git checkout 6b3540f9b31121321f9e75d8df0ed86397c9324f

В Visual Studio Code откройте папку с примером (File Open Folder) и ознакомьтесь с его структурой. Вы увидите три модуля, о которых мы говорили выше. Если при открытии среда предложит установить дополнительные расширения, сделайте это.


Модификация примера


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


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


Итак, поехали.


.env


Необходимо установить параметры реестра (репозитория) контейнеров, взятые с портала Azure:


  • CONTAINER_REGISTRY_ADDRESS="имя_реестра_контейнеров.azurecr.io"
  • CONTAINER_REGISTRY_USERNAME="имя_пользователя"
  • CONTAINER_REGISTRY_PASSWORD="пароль"

deployment.template.json


  • modules camera-capture env RESIZE_WIDTH установить 640, RESIZE_HEIGHT установить 480
  • modules camera-capture settings image установить ${MODULES.CameraCapture.amd64}
  • modules sensehat-display env THRESHOLD value установить 0.9
  • modules sensehat-display settings image установить ${MODULES.SenseHatDisplay.amd64}, createOptions удалить содержимое HostConfig и установить "PortBindings": { "8000/tcp": [ { "HostPort": "8000" } ] }
  • modules image settings image установить ${MODULES.ImageClassifierService.amd64}

deployment.template_AMD64


Данный файл следует удалить с файловой системы.


СameraCapture\amd64.Dockerfile


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


CameraCapture.py


Поскольку мы перенесли решение на более мощную платформу (по сравнению с Raspberry Pi), уменьшим временной интервал, за который накапливаются кадры для анализа. Для этого ищем строку time.sleep(1.0) и заменяем 1.0 на 0.1.


ImageClassifierService\amd64.Dockerfile


Здесь потребуется подобрать версии библиотек для AMD64. Модифицированный файл можно найти в приложенном архиве.


labels.txt


Данный файл содержит метки, которые получает каждое изображение. Эти метки должны соответствовать меткам из сервиса Custom Vision, поэтому содержимое файла должно быть следующим:


MaskNotOnFaceMaskOnFace

model.pb


Двоичный файл модели из Custom Vision следует заменить существующий на подготовленный нами ранее.


SenseHatDisplay\amd64.Dockerfile


Такого файла в примере нет, нам нужно его создать.


SenseHatDisplay модуль отображения результата распознавания. Но на нашей платформе AMD64 никакого шилда SenseHat нет, поэтому из данного модуля весь код, взаимодействующий, собственно, с SenseHat, уберем, и будем реализовывать простейший веб-сервер на Python, который сможет прямо в браузере показывать результат распознавания.


Файл можно найти в приложенном архиве.


SenseHatDisplay\module.json


В раздел platform нужно внести изменения, а именно добавить amd64:


"amd64": "./amd64.Dockerfile",

SenseHatDisplay\app (директория)


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


  • custom.js
  • index.htm
  • jquery.js
  • style.css
  • DisplayManager.py
  • MessageParser.py

Веб-сервер достаточно "хитрый". Он отдает клиенту страницу, в которой выполняются сразу две важных вещи:


  • Отображается видеопоток от модуля захвата изображения с камеры: его можно увидеть прямо с компьютера с IoT Edge, зайдя браузером на адрес http://127.0.0.1:5012;
  • Отображается результат распознавания от модуля классификатора по адресу http://127.0.0.1:8000/status.

Подчеркну, что фактически получаются два веб-сервера один с видеопотоком, второй с результатом распознавания. Причем страницу, с которой идет обращение к этим серверам, отдает второй сервер. Сама эта страница доступна по адресу http://127.0.0.1:8000.


Сборка


Для сборки потребуется подключение к Интернет.


  • В VS Code выберите View Command Pallette Azure IoT Edge: Set Default Target Platform for IoT Edge Solution и в появившемся списке выберите amd64;
  • Там же выберите команду Azure IoT Edge: Build and Push IoT Edge Solution. Все должно собраться с первого раза и загрузиться в реестр контейнеров, но этого еще недостаточно для попадания на устройство IoT Edge;
  • Разверните решение на IoT Edge, кликнув правой кнопкой на файл config/deployment.json и выбрав Create Deployment for Single device, затем выберите ваше устройство, указав его имя;
  • На развертывание потребуется некоторое время (не забудьте подключить к платформе веб-камеру!). Можете кликнуть на ваше устройство правой кнопкой мыши в расширении IoT Edge Extension и выбрать Start Monitoring D2C Message, тем самым наблюдать телеметрию.

Момент истины


На нашем IoT Edge устройстве логинимся в UI и прямо браузером заходим на веб-страницу по адресу http://localhost:8000, где наблюдаем веб-страницу, как на картинке. Надеваем маску и смотрим в камеру, система определяет, что маска на нас.



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


К огромному сожалению, моделей в маскобикини, чтобы проверить срабатывание тега MaskNotOnFace, у нас не нашлось, но на тестовых картинках все работало хорошо.


Если что-то пошло не так...


Если модули собрались и отлажены, а устройство в сети, вмешательство на стороне IoT Edge не требуется. Но иногда на этапе запуска возникают проблемы (так я, например, узнал, что без AVX инструкций и/или пересборки библиотеки tensorflow модуль классификатора не работает). IoT Edge предлагает разные способы диагностики. Подробно о них можно прочитать здесь. Самое главное, что может пригодиться:


  • Получить список модулей и их статус: iotedge list. В примере на рисунке видно выполняющиеся модули и их аптайм (более недели);
  • Журнал модуля: iotedge logs имя_модуля. Позволяет понять, что конкретно происходит с модулем.

Обновление модулей


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


Что дальше?


Дальше можно отключить компьютер с IoT Edge от Интернета и убедиться, что все работает так же хорошо.


При всем перечисленном мы, конечно, не рассмотрели всех возможностей IoT Edge, например, мы никак не обработали телеметрию на облаке, а могли бы вести, например, журнал "проходов через турникет" и считать какую-нибудь статистику и даже сохранять ее локально при помощи SQL Edge, а затем синхронизировать с облаком.


Мы также совсем не рассмотрели возможности управления устройством IoT Edge с портала Azure, так как это было незначимо для темы данной статьи.


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


Мы убедились, что при помощи сервисов Azure можем комбинировать все плюсы как облачной, так и наземной разработки, и при этом получать решение, которое без проблем будет работать автономно.


Если у вас еще остались вопросы по облачным технологиям Microsoft и Интернету вещей обращайтесь к нам в Кварта Технологии.


Файлы к статье можно скачать по ссылке.


Автор статьи Сергей Антонович, ведущий инженер Кварта Технологии. Связаться с ним можно по адресу sergant (at) quarta.ru.

Подробнее..

Windows 10 IoT Enterprise 2019 и 1809 основные отличия

23.07.2020 12:09:17 | Автор: admin

Введение


Windows 10 IoT Enterprise 2019 маркетинговое наименование очередного выпуска Windows 10. Выход данной версии был объявлен в сентябре прошлого года, соответственно имеет версию 1809, 18 год, 09 месяц. По новому выпуску Windows 10 1809 написано много статей, но большинство из них посвящено различным бантикам, красивостям и различному функционалу, который востребован в домашних условиях. В данной статье пойдет речь только о функционале, который востребован в коммерческом сегменте. А именно о новых возможностях режима киоска. Также будет затронута тема изменения наименований схем обслуживания редакций Windows корпоративного сегмента.


Старая схема обслуживания с новым названием


Начну с небольшого пояснения, в корпоративном сегменте редакций Windows есть две схемы обслуживания, по которым Windows получает обновления. Схемы обслуживания имеют буквенное обозначение. Сейчас ветки обслуживания называются LTSC и SAC.


LTSC означает Long Term Servicing Channel (с долгосрочным обслуживанием). Ранее такой канал назывался LTSB Long Term Servicing Branch, Майкрософт просто изменил название канала обслуживания, само обслуживание осталось прежним.


Также Майкрософт поменял название ветки обслуживания CBB Current Branch for Business, теперь эта ветка обслуживания называется SAC Semi-Annual Channel. Опять же поменялось только название.


Но следует упомянуть, что для веток обслуживания LTSC и SAC используются разные дистрибутивы Windows.


Немного о новом режиме киоска в SAC


Как я уже говорил, у LTSC и SAC разные дистрибутивы. В LTSC нет стандартных универсальных приложений и магазина приложений, а в SAC есть. Соответственно, в LTSC нет браузера Edge, а в он SAC есть. Если при настройке киоска выбрать браузер Edge, то теперь доступы два режима:


  1. Как цифровой знак или интерактивный дисплей
  2. Как общедоступный браузер

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


Киоск с множеством приложений


Некоторые думают, что лицензионное использование Windows 10 IoT Enterprise подразумевает работу только одного приложения на устройстве, на самом деле это не так. Устройство должно быть предназначено для выполнения одной бизнес-задачи и у пользователя не должно быть доступа к рабочему столу. Теперь Майкрософт сам дал инструмент для использования множества приложений. Данный режим называется multi-app kiosk, далее для краткости я буду называть его мультикиоск. В данной статье мы рассмотрим настройку данного режима с помощью пакета обеспечения и некоторые особенности данного режима.


Немного о режиме Мультикиоск


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


Перечень основных настроек и возможностей режима:


  1. Настройка для множества пользователей или групп
  2. Каждому пользователю или группе можно назначить индивидуальные настройки
  3. Возможность использования универсальных и классических приложений
  4. Возможность автоматического запуска одного из приложений при входе пользователя в систему
  5. Работа приложений по белому списку
  6. Доступ к папкам по белому списку

Стоит обратить внимание на пункт 5. По умолчанию будет разрешена работа только тем приложениям, которые необходимы для работы системы, остальные приложения нужно добавить в список разрешенных. Т.е. теперь не нужно отдельно настраивать AppLocker. Кстати, чтобы избежать конфликта настроек AppLockerа, в режиме мультикиоска все настроенные правила AppLockerа действовать не будут.


В пункте 6 обозначена хорошая возможность, но на данный момент возможно дать разрешение на запись только для папки Downloads. Режим позволяет использовать универсальные и классические приложения. Все настройки режима указываются в XML-файле, в котором также можно указать настройки для киоска с одним приложением.


А теперь попробуем все это настроить


Что нам понадобится


  1. В первую очередь нам понадобится сама система, которая поддерживает режим мультикиоска. Здесь можно скачать демонстрационную версию
  2. Инструкция по настройке мультикиоска
  3. Любой XML редактор
  4. Для применения настроек мульткиоска:
    1. Для способа 1 ICD, который входит в состав ADK. ADK можно скачать здесь
    2. Для способа 2 утилита PsExec. Утилиту можно скачать здесь

Он сказал Поехали!


Все опыты я буду проводить на Windows 10 IoT Enterprise 1809 LTSC x32 коммерческая версия, а не демонстрационная. Система будет без активации т.к. отсутствие активации не сказывается на функционале системы. Я взял 32 бита только потому, что она занимает меньше места и работать с образами системы будет быстрее.


Шаг 1 установка


Установка Win 10 IoT Enterprise ничем не отличается от установки Win 10 Enterprise, поэтому весь процесс установки описывать не буду, скажу лишь о некоторых нюансах.


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


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


Т.к. мы будем создавать резервные образа системы и для этого будем ее запечатывать в режиме аудита, то можно сэкономить немного времени загрузив систему в режиме аудита сразу после установки. Для этого, когда система у Вас попросит выбрать регион Lets start with region. Is this right просто нажмите Ctrl+Shift+F3.


Шаг 2 создаем образ системы


Т.к. мы будем издеваться над системой пробовать различные новые настройки, то не исключено что что-то пойдет не так и нужно будет вернуть систему в исходное состояние. А для быстрого возврата в исходное состояние нужно создать образ системы. Единственное что я сделаю, это скопирую джентльменский набор скрипт и файл ответов. Все файлы у меня находятся на в папке Sysprep, которую я скопирую в корень системного диска. И естественно, я поделюсь с Вами данным джентльменским набором.


Sysprep.bat для запечатывания системы.
@echo offchcp 1251>nulnet session>nul 2>nulif %errorLevel% neq 0 (powershell -command "Start-Process "%~s0" -Verb RunAs"&exit)tasklist /fi "ImageName eq sysprep.exe" | find /i "sysprep.exe"if %errorlevel% lss 1 (taskkill /im sysprep.exe)set AdminName=Adminnet user %AdminName%>nul 2>nulif %errorLevel% neq 0 (call :AddAdmin "%AdminName%")if %errorLevel% neq 0 (call :ShowMessage "Ошибка создания новой учетной записи администратора "%AdminName%"Нажмите любую клавишу для завершения работы скрипта"&pause>nul&exit)pushd "%~dp0"clscall :ShowMessage echo  1 - Запечатать систему в режиме аудитаecho  2 - Запечатать систему в режиме приветствия:Selectset /p Choice="Введите номер пункта меню: "if "%Choice%"=="1" (goto Audit)if "%Choice%"=="2" (goto OOBE)echo.&echo Выбрано недопустимое значение.&goto Selectexit:Audit    call :ShowMessage "Запечатывание системы в режиме аудита"    reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v KillSysprep /t REG_SZ /d "taskkill /im sysprep.exe" /f    %SYSTEMROOT%\System32\Sysprep\sysprep.exe /audit /generalize /shutdown /quietgoto :eof:OOBE    call :ShowMessage "Запечатывание системы в режиме приветствия"    reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v KillSysprep /f    powershell -command "(Get-Content -path 'Unattend.xml' -Raw).Trim() -replace 'Architecture=""".+?"""','Architecture="""%PROCESSOR_ARCHITECTURE%"""' | Set-Content -path 'Unattend.xml'"    %SYSTEMROOT%\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown /quiet /unattend:Unattend.xmlgoto :eof:AddAdmin    setlocal    set UserName=%~1    if not defined UserName (echo Не указано имя пользователя&endlocal&exit /b 1)    call :GetGroupName "S-1-5-32-544" AdminGroup    if not defined AdminGroup (endlocal&exit /b 2)    call :GetGroupName "S-1-5-32-545" UserGroup    if not defined UserGroup (endlocal&exit /b 3)    net user %UserName% /add    wmic useraccount where "Name='%UserName%'" set PasswordExpires=False>nul    net localgroup %AdminGroup% %UserName% /add    net localgroup %UserGroup% %UserName% /delete    endlocal&exit /b 0goto :eof:GetGroupName    if "%~1"=="" (echo Не указан SID группы&goto :eof)    set %2=    for /f "tokens=2 delims=\ " %%i in ('whoami /groups /fo table^|find "%~1"') do set %2=%%i    if not defined %2 (echo Ошибка определения имени группы по SID'у "%~1")goto :eof:ShowMessage    setlocal enabledelayedexpansion    set String=%~1    if not defined String (echo.&setlocal disabledelayedexpansion&goto :eof)    set /a ConCols=120 & set /a Num=1    set "String[!Num!].str=%String:=" & set /a Num+=1 & set "String[!Num!].str=%"    for /l %%a in (1,1,%Num%) do (        for /l %%b in (0,1,%ConCols%) do if "!String[%%a].str:~%%b!" == "" (set "String[%%a].str= !String[%%a].str! "&set /a String[%%a].len-=1) else (set /a String[%%a].len+=0||set /a String[%%a].len=0)        if not defined String[%%a].str (set String[%%a].str= )        if not !String[%%a].len! equ 0 (call set String[%%a].str=%%String[%%a].str:~,!String[%%a].len!%%)        if "!String[%%a].str: =!"=="" (echo.) else (echo !String[%%a].str!))    setlocal disabledelayedexpansiongoto :eof

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


Unattend.xml файл ответов для sysprepа.
<?xml version="1.0" encoding="utf-8"?><unattend xmlns="urn:schemas-microsoft-com:unattend">    <settings pass="specialize">        <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <RunSynchronous>                <RunSynchronousCommand wcm:action="add">                    <Path>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f</Path>                    <Order>1</Order>                    <Description>Dont show key page</Description>                </RunSynchronousCommand>                <RunSynchronousCommand wcm:action="add">                    <Path>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f</Path>                    <Order>2</Order>                    <Description>Dont make account</Description>                </RunSynchronousCommand>                <RunSynchronousCommand wcm:action="add">                    <Path>cmd.exe /c rd %systemdrive%\Sysprep /s /q</Path>                    <Order>3</Order>                    <Description>Del Folder</Description>                </RunSynchronousCommand>            </RunSynchronous>        </component>        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <AutoLogon>                <Enabled>true</Enabled>                <Username>Admin</Username>            </AutoLogon>        </component>    </settings>    <settings pass="oobeSystem">        <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <InputLocale>en-US; ru-RU</InputLocale>            <SystemLocale>ru-RU</SystemLocale>            <UILanguage>ru-RU</UILanguage>            <UILanguageFallback></UILanguageFallback>            <UserLocale>ru-RU</UserLocale>        </component>        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <OOBE>                <HideEULAPage>true</HideEULAPage>                <HideLocalAccountScreen>true</HideLocalAccountScreen>                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>                <ProtectYourPC>1</ProtectYourPC>            </OOBE>        </component>    </settings></unattend>

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


Теперь я запечатаю систему в режиме аудита с помощью Sysprep.bat и сниму образ системы. Снимать образ системы я буду с помощью DISMа и буду снимать образ только системного тома. Если Вы будете снимать образ только системного тома, а не всего диска, то не забывайте копировать содержимое каталога Windows\System32\Recovery на первый том в папку Recovery\WindowsRE после разворачивания системы. Это нужно будет сделать до загрузки ОС т.к. после загрузки ОС каталог Windows\System32\Recovery уже будет пустым.


Шаг 3 русификация системы


Языковой пакет можно установить без подключения к интернету, если этот пакет у Вас есть. Если нет, то система сама его загрузит из интернета, когда Вы добавите язык в настройках. Только не нужно брать языковой пакет от предыдущих версий ОС. Для Windows 10 1809 должен быть языковой пакет именно для Windows 10 1809.


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


В режиме аудита Вы можете столкнуться с проблемой открытия параметров системы из меню Пуск, для открытия параметров системы выполните команду ms-settings:, обратите внимание на двоеточие в конце команды, без него команда не будет работать. После однократного открытия параметров системы с помощью данной команды, его можно будет открывать с помощью графического меню.


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


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


Я установлю языковой пакет без подключения к интернету.


После полной локализации системы обязательно создайте образ системы.


Шаг 4 установка необходимых приложений


Т.к. в системах LTSB и LTSC нет магазина приложений, то установка приложений из Microsoft Store вызывает некоторые трудности, а именно загрузка приложения. Для загрузки приложений компания Adguard сделала очень удобный сервис Adguard Store, с помощью которого можно получить временные ссылки на загрузку приложений и их компонентов.


Для установки приложения Вам понадобятся файлы с расширениями Appx и AppxBundle. Перед установкой самого приложения необходимо установить его компоненты. Как правило компоненты от приложения можно интуитивно отличить по названию файла.


Чтобы не делать статью слишком большой не буду подробно описывать процесс установки приложений, тем более что по установке есть подробная инструкция. Но добавлю еще один способ установки приложений в текущую учетную запись. Приложения можно установить с помощью программы App Installer, но для установки приложений потребуется подключение к интернету, зато приложения можно будет установить двойным щелчком мыши и вам не понадобятся его компоненты, все необходимые компоненты загрузит и установит App Installer.


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


Шаг 5 создание файла настройки для мультикиоска


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


Начнем с настройки расположения плиток. Самый простой способ создания XML-конфигурации настройки плиток экспорт их текущего состояния.


Первым делом добавим в меню Пуск плитки тех приложений, которые нам нужны. Вызываем поиск Win+s, находим нужное приложение, нажимаем на нем правой кнопкой мыши и выбираем пункт Закрепить на начальном экране.


Я закрепил следующие приложения:


  • Блокнот
  • Калькулятор
  • Internet Explorer
  • Paint
  • WordPad
  • Параметры
  • Безопасность Windows

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


Т.к. на плитке Безопасность Windows не умещается название полностью, я изменю ее размер на Широкий. Для изменения размера плитки нужно нажать на плитке правой кнопкой мыши и выбрать пункт Изменить размер.


После настройки экспортируем текущее состояние, выполняем команду в среде PowerShell Export-StartLayout path C:\Sysprep\StartLayout.xml.


Дальше проще всего не создавать файл настроек самостоятельно, а отсюда взять пример файла настроек нажимаем на кнопку Copy, вставляем содержимое в блокнот и сохраняем как MultiAppKiosk.xml. Теперь меняем настройки на свои. Для изменения настроек прикрепленных плиток копируем весь блок StartLayoutCollection из StartLayout.xml в MultiAppKiosk.xml. Чтобы добавить приложения в разрешенные необходимо вставить идентификаторы универсальных приложений в раздел AllowedApps и в этот же блок добавить полный путь к исполняемым файлам классических приложений, который прописан в свойствах ярлыках, на которые ссылаются плитки. Для быстрого перехода к ярлыку, нажмите правой кнопкой мыши на закрепленной плитке и пройдите по меню Дополнительно > Перейти к расположению файла. Обратите внимание, для указания ID универсального приложения используется параметр AppUserModelId, а для указания полного пути к классическому приложению используется параметр DesktopAppPath. И еще один маленький нюанс, если Вы планируете использовать IE в системе x64, то в перечне разрешенных приложений необходимо указать два пути для исполняемого файла Program Files\Internet Explorer\iexplore.exe и Program Files (x86)\Internet Explorer\iexplore.exe.


Доступ к папкам я давать не буду, поэтому удаляю секцию FileExplorerNamespaceRestrictions.


Отображение панели задач мне не помешает, поэтому в секции Taskbar оставляю все как есть.


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


В секции Configs учетные записи привязаны к профилям, обратите внимание, что к одному профилю можно привязать множество учетных записей. Но т.к. меня интересует только одна учетная запись, то я удалю все привязки кроме первой блоки Config. В оставшейся привязке пропишу имя пользователя User.


У меня получился вот такой файл с параметрами


MultiAppKiosk.xml
<?xml version="1.0" encoding="utf-8" ?><AssignedAccessConfiguration   xmlns="http://personeltest.ru/away/schemas.microsoft.com/AssignedAccess/2017/config"  xmlns:rs5="http://personeltest.ru/away/schemas.microsoft.com/AssignedAccess/201810/config"  >  <Profiles>      <Profile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}">          <AllAppsList>              <AllowedApps>                  <App AppUserModelId="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />                  <App AppUserModelId="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />                  <App DesktopAppPath="%windir%\system32\notepad.exe" />                  <App DesktopAppPath="C:\Program Files\Internet Explorer\iexplore.exe" />                  <App DesktopAppPath="%windir%\system32\win32calc.exe" />                  <App DesktopAppPath="%windir%\system32\mspaint.exe" />                  <App DesktopAppPath="%ProgramFiles%\Windows NT\Accessories\wordpad.exe" />              </AllowedApps>          </AllAppsList>          <StartLayout>              <![CDATA[<LayoutModificationTemplate xmlns:defaultlayout="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/LayoutModification">                    <LayoutOptions StartTileGroupCellWidth="6" />                    <DefaultLayoutOverride>                      <StartLayoutCollection>                        <defaultlayout:StartLayout GroupCellWidth="6">                          <start:Group Name="Настройки">                            <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />                            <start:Tile Size="4x2" Column="2" Row="0" AppUserModelID="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />                          </start:Group>                          <start:Group Name="Офисные приложения">                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Wordpad.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Calculator.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Accessories\Internet Explorer.lnk" />                          </start:Group>                        </defaultlayout:StartLayout>                      </StartLayoutCollection>                    </DefaultLayoutOverride>                  </LayoutModificationTemplate>              ]]>          </StartLayout>          <Taskbar ShowTaskbar="true"/>      </Profile>  </Profiles>  <Configs>      <Config>          <Account>User</Account>          <DefaultProfile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}"/>      </Config>  </Configs></AssignedAccessConfiguration>

Когда будете делать свои XML-файлы настройки не забывайте, что у каждого профиля должен быть уникальный ID, причем не только в пределах одного XML-файла, а в одной ОС. Т.е. в идеале чтобы не запутаться можно каждый раз создавать новый идентификатор, это можно сделать в среде PowerShell с помощью команды [guid]::NewGuid(). И обязательно сохраняйте файл в кодировке UTF-8, если файл будет сохранен в кодировке ANSI, то при сборке пакета подготовки получите ошибку если в XML-файле будет кириллица.


Шаг 6 применение настроек мультикиоска


Рассмотрим два способа применения настроек, описанных в конфигурационном файле. Первый с помощью пакета подготовки, который нужно создавать в ICD. Для кого-то, возможно, такой способ будет более привычным. Второй с использованием MDM Bridge WMI Provider, этот способ мне показался более удобным.


Способ 1


У кого нет ICD, скачиваем ADK и устанавливаем. Установка ADK очень простая, набор компонентов можно оставить по умолчанию.


Запускаем ICD, нажимаем на плитку Дополнительная подготовка, указываем имя и папку проекта и нажимаем Далее. В следующем окне выбираем Все выпуски Windows для настольных компьютеров и нажимаем Далее. Импорт пакета подготовки можно пропустить, нажимаем Готово.


Раскрываем выпадающее меню Параметры среды выполнения, далее раскрываем подменю AssignedAccess и выбираем пункт MultiAppAssignedAccessSettings. В верхней части средней секции окна ICD нажимаем кнопку Обзор и указываем расположение XML-файла с настройками. На всякий случай можно сохранить проект нажав Ctrl+s. В левой верхней части ICD выбираем Экспорт в выпадающем меню выбираем пункт Пакет подготовки. В качестве владельца выбираем ИТ-администратор все остальные вопросы можно пропустить, нажимая Далее и в конце нажимаем Сборка и Готово.


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


Теперь запускаем пакет подготовки в ранее установленной системе. После применения пакета подготовки изменится меню пуск и у администратора. В левом столбце пуска должны исчезнуть кнопки: Документы, Изображение, Параметры. Если меню пуск не изменилось, то что-то пошло не так. Установленный пакет можно удалить если открыть окно Параметры > Учетные записи > Доступ к учетной записи места работы или учебного заведения > Добавление или удаление пакета подготовки.


Если меню пуск изменилось, то настройки применены к системе, заходите под пользователем, для которого настроен мультикиоск и посмотрите на результат.


Способ 2


Применение настроек с помощью MDM Bridge WMI Provider описано здесь. Удобство данного способа в гибкости использования и возможности избавиться от множества ручных операций, которые нужны для создания пакета подготовки. Здесь каждый для себя может сделать решение, которое будет удобно именно ему. Я для себя сделал вот такую пару скриптов.


MiltiKiosk.bat скрипт для запуска
@echo offchcp 1251>nulif not exist "%~dp0psexec.exe" call :ShowMessage "Для работы скрипта необходим файл psexec.exeДля завершения работы скрипта нажмите любую клавишу"&pause>nul&exitnet session>nul 2>nulif %errorLevel% neq 0 (powershell -command "Start-Process "%~s0" -Verb RunAs"&exit)for /f "tokens=2 delims==" %%i in ('wmic useraccount where "Name='%UserName%'" get SID /value^|find "SID"') do set SID=%%ireg add HKU\%SID%\Software\Sysinternals\PsExec /v EulaAccepted /t REG_DWORD /d 1 /ffor /f %%i in ('dir "%~dp0%~n0*.ps1" /b /o:n') do set PSFilePath=%~dp0%%iif not defined PSFilePath (echo Не найдено PS файлов с началом названия - "%~n0"&pause&exit)set PSFilePath=%PSFilePath: =` %"%~dp0psexec.exe" -i -s powershell -command "Start-Process powershell.exe -ArgumentList '-ExecutionPolicy Unrestricted -Command %PSFilePath%'"exit:ShowMessage    setlocal enabledelayedexpansion    set String=%~1    if not defined String (echo.&setlocal disabledelayedexpansion&goto :eof)    set /a ConCols=120 & set /a Num=1    set "String[!Num!].str=%String:=" & set /a Num+=1 & set "String[!Num!].str=%"    for /l %%a in (1,1,%Num%) do (        for /l %%b in (0,1,%ConCols%) do if "!String[%%a].str:~%%b!" == "" (set "String[%%a].str= !String[%%a].str! "&set /a String[%%a].len-=1) else (set /a String[%%a].len+=0||set /a String[%%a].len=0)        if not defined String[%%a].str (set String[%%a].str= )        if not !String[%%a].len! equ 0 (call set String[%%a].str=%%String[%%a].str:~,!String[%%a].len!%%)        if "!String[%%a].str: =!"=="" (echo.) else (echo !String[%%a].str!))    setlocal disabledelayedexpansiongoto :eof

MiltiKiosk_Ver.12.ps1 основной скрипт
Function ConvertEncoding ([string]$From, [string]$To) {    Begin{$encFrom = [System.Text.Encoding]::GetEncoding($From);$encTo = [System.Text.Encoding]::GetEncoding($To)}    Process{$bytes = $encTo.GetBytes($_);$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes);$encTo.GetString($bytes) -replace [char]0, ''}}Function ShowMessage ($Message='', $Align=0) {    Try {$Align = [decimal]$Align} Catch {Return 'Для параметра Align может быть указано только число' | ConvertEncoding 'windows-1251' -To 'UTF-16'}    if ($Message -is [int]) {for ($i=1; $i -le $Message; $i++) {Write-Host}; Return}    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$Message = $Message | ConvertEncoding 'windows-1251' -To 'UTF-16'}    if ($Message -is [string]) {[array] $Message = $Message}    foreach ($String in $Message) {        Try {$String = [int]$String} Catch {}        if ($String -is [int]) {for ($i=1; $i -le $String; $i++) {Write-Host}; continue}        if ($Host.UI.RawUI.BufferSize.Width -gt $String.Length) {            if ($Align -eq 0) {Write-Host $String            } else {Write-Host ("{0}{1}" -f (' ' * (([Math]::Max(0, $Host.UI.RawUI.BufferSize.Width / $Align) - [Math]::Floor($String.Length / $Align)))), $String)}        } else {Write-Host $String}    } }$script:NameSpace="root\cimv2\mdm\dmmap"$script:ClassName="MDM_AssignedAccess"$script:MultiAppKiosk = Get-CimInstance -Namespace $NameSpace -ClassName $ClassNameif (-not $MultiAppKiosk) {ShowMessage -Message (3, 'Ошибка получения объекта настроек', 2, 'Нажмите "Enter" для завершения рабты скрипта') -Align 2; Read-Host; Exit}Function MainMenu() {    ShowMessage (13, ' 0 - Выход', ' 1 - Выбрать XML-файл для установки', ' 2 - Показать текущую конфигурацию мультикиоска', ' 3 - Удалить настройки мультикиоска', 1)    $local:PromptText = 'Выберите действие'    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$PromptText = $PromptText | ConvertEncoding 'windows-1251' -To 'UTF-16'}    $local:Selections = 1..2    While ($true) {        $Select = Read-Host -Prompt $PromptText        Switch ($Select) {            0 {exit}            1 {XMLSelection}            2 {ShowMessage -Message (1, 'Начало конфигурации') -Align 2; Write-Host $MultiAppKiosk.Configuration; ShowMessage -Message ('Конец конфигурации', 1, 'Для возврата в меню нажмите "Enter"', 1) -Align 2; Read-Host}            3 {$MultiAppKiosk.Configuration = $Null; Set-CimInstance -CimInstance $MultiAppKiosk; ShowMessage -Message (1, 'Выполнена команда удаления настроек', 1) -Align 2}            DEFAULT {ShowMessage 'Выбрано недопустимое значение'}        }        if ($Selections -contains $Select) {Clear-Host; ShowMessage (15, ' 0 - Выход', ' 1 - Выбрать XML-файл для установки', ' 2 - Показать текущую конфигурацию мультикиоска', ' 3 - Удалить настройки мультикиоска', 1)}    }}Function XMLSelection() {    Clear-Host    if (!(Test-Path -Path $PSScriptRoot'\XML')) {ShowMessage -Message (13, 'Не найден каталог', $('"'+$PSScriptRoot+'\XML"'), 1, 'Нажмите "Enter" для возврвта в предыдущее меню') -Align 2; Read-Host; Return}    $local:XMLList = @()    $XMLList += Get-ChildItem -Path $PSScriptRoot'\XML' -name -filter '*.xml'    if ($XMLList.Count -eq  0) {ShowMessage -Message (13, 'Не найдено XML-файлов в каталоге', $('"'+$PSScriptRoot+'\XML"'), 1, 'Нажмите "Enter" для возврвта в предыдущее меню') -Align 2; Read-Host; Return}    [int]$local:Indent = 13 - $XMLList.Count / 2; if ($Indent -lt 1) {$Indent = 1}    ShowMessage ($Indent, ' 0 - Вернуться в предыдущее меню')    for ($i=0; $i -le $XMLList.GetUpperBound(0); $i++) {Write-Host $(' '+($i+1)+' - '+$XMLList[$i])}    Write-Host    $local:PromptText = 'Выберите файл для установки'    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$PromptText = $PromptText | ConvertEncoding 'windows-1251' -To 'UTF-16'}    $local:Selections = 1..$XMLList.Count    $local:BackToPrevMenu = 0    While ($BackToPrevMenu -eq 0) {        $Select = Read-Host -Prompt $PromptText        Switch ($Select) {            0 {$BackToPrevMenu = 1}            {$Selections -contains $Select} {ShowMessage $('Дана команда на применение настроек из файла '+$XMLList[$Select-1]);                $local:Config = (Get-Content -encoding UTF8 -path $($PSScriptRoot+'\XML\'+$XMLList[$Select-1]) -Raw).Trim()                $local:GUIDs = [regex]::matches($Config, '{.+?}') | select -ExpandProperty Value | Get-Unique                foreach ($GUID in $GUIDs) {$Config = $Config -replace $('\'+$GUID),$('{'+[guid]::NewGuid()+'}')}                $Config = $Config -replace '&','&' -replace '<','<' -replace '>','>' -replace "'",''' -replace '"','"'                $MultiAppKiosk.Configuration = $Config                Set-CimInstance -CimInstance $MultiAppKiosk            }            DEFAULT {ShowMessage ('Выбрано недопустимое значение')}         }    }}MainMenu

Если вы хотите использовать мое решение, то сохраните в одну папку вышеуказанные скрипты с их оригинальными именами и в эту же папку положите файл PsExec.exe. В этой же папке создайте папку XML и скопируйте в нее XML-файлы для настройки мультикиоска. Я буду использовать тот же файл, что и в первом способе.


MultiAppKiosk.xml
<?xml version="1.0" encoding="utf-8" ?><AssignedAccessConfiguration   xmlns="http://personeltest.ru/away/schemas.microsoft.com/AssignedAccess/2017/config"  xmlns:rs5="http://personeltest.ru/away/schemas.microsoft.com/AssignedAccess/201810/config"  >  <Profiles>      <Profile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}">          <AllAppsList>              <AllowedApps>                  <App AppUserModelId="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />                  <App AppUserModelId="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />                  <App DesktopAppPath="%windir%\system32\notepad.exe" />                  <App DesktopAppPath="C:\Program Files\Internet Explorer\iexplore.exe" />                  <App DesktopAppPath="%windir%\system32\win32calc.exe" />                  <App DesktopAppPath="%windir%\system32\mspaint.exe" />                  <App DesktopAppPath="%ProgramFiles%\Windows NT\Accessories\wordpad.exe" />              </AllowedApps>          </AllAppsList>          <StartLayout>              <![CDATA[<LayoutModificationTemplate xmlns:defaultlayout="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://personeltest.ru/away/schemas.microsoft.com/Start/2014/LayoutModification">                    <LayoutOptions StartTileGroupCellWidth="6" />                    <DefaultLayoutOverride>                      <StartLayoutCollection>                        <defaultlayout:StartLayout GroupCellWidth="6">                          <start:Group Name="Настройки">                            <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />                            <start:Tile Size="4x2" Column="2" Row="0" AppUserModelID="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />                          </start:Group>                          <start:Group Name="Офисные приложения">                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Wordpad.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Calculator.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk" />                            <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\Accessories\Internet Explorer.lnk" />                          </start:Group>                        </defaultlayout:StartLayout>                      </StartLayoutCollection>                    </DefaultLayoutOverride>                  </LayoutModificationTemplate>              ]]>          </StartLayout>          <Taskbar ShowTaskbar="true"/>      </Profile>  </Profiles>  <Configs>      <Config>          <Account>User</Account>          <DefaultProfile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}"/>      </Config>  </Configs></AssignedAccessConfiguration>

Немного об особенностях скрипта. Скрипт рассчитан на использование XML-файлов с кодировкой UTF8, если вы хотите использовать кодировку ANSI, то из параметра чтения файла уберите параметр encoding UTF8. В папку XML необходимо размещать XML-файлы без замены символов, скрипт сам заменит спецсимволы на соответствующие обозначения. Чтобы не запутаться в GUIDах привязки пользователей к профилям вы можете просто указывать номер или имя пользователя в фигурных скобках, все содержимое в фигурных скобках будет заменено на GUIDы.


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


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


Шаг 7 запечатывание системы


Мультикиоск работает, ну вот и все, казалось бы


Если все идет по плану, значит вы чего-то не замечаете.


Не забываем, что нам еще нужно переводить систему из режима аудита в режим приветствия. Ну мы же к этому готовы, запускаем Sysprep.bat, выбираем пункт 2, система запечатывается. Включаем устройство, система загружается, входим в учетную запись пользователя для которого настроен мультикиоск и не можем войти. После надписи Добро пожаловать появляется надпись Выход из системы.


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


Эксперименты


Что же у нас получилось. В системе две учетные записи:


Admin в группе Администраторы
User в группе Пользователи
В режиме аудита мультикиоск работал, запечатали не работает.


Эксперимент 1


Удаляем установленный пакет подготовки, в оснастке Управление компьютером удаляем пользователя User и создаем нового пользователя с именем User, применяем пакет подготовки, заходим в учетную запись User не работает. Заходим под именем Admin, удаляем пользователя User из группы Пользователи, добавляем в группу Администраторы, заходим под именем User не работает. Заходим под именем Admin, удаляем пакет подготовки с мультикиоском, заходим под именем User получилось войти, но естественно режим мультикиоска не работает т.к. был удален пакет подготовки.


Эксперимент 2


Заливаем образ системы русифицированный в режиме аудита.


ОС загрузилась, нажимаем Win+r, т.к. окно sysprepа у нас закрылось автоматически выполняем команду sysprep, в открывшемся окне запускаем sysprep. Настройки sysprepa в окне: Переход в окно приветствия системы (OOBE), Подготовка к использованию, Перезагрузка. Жмем ОК и ждем приветствия ОС. Отвечаем на вопросы при первой загрузке системы: Continue in selected language? русский; регион Россия; раскладка клавиатуры Русская; добавить вторую раскладку клавиатуры пропустить; Давайте подключим вас к сети Пока пропустить; подключитесь к интернету нет; лицензионное соглашение принять; Кто будет использовать этот компьютер Test; создание пароля оставляю поле пустым; удобная работа на разных устройствах нет; параметры конфиденциальности принять. ОС загрузилась, в оснастке Управление компьютером создаем пользователя с именем User, добавляем пакет подготовки. Результат не работает.


Эксперимент 3


Заливаем образ системы русифицированный в режиме аудита.


ОС загрузилась, подключаем систему к инету, выполняем команду gpedit.msc и в разделе Центр обновлений Windows включаем параметр Включить рекомендуемые обновления через автоматическое обновление, на всякий случай перезагружаемся. В центре обновлений жмем Проверить наличие обновлений и перезагружаемся до тех пор, пока не будут установлены все обновления. Отключаем систему от интернета. Запускаем sysprep в графическом режиме и повторяем все действия, которые описаны в предыдущем шаге с запуска утилиты sysprep до добавления пакета подготовки. Результат не работает.


Эксперимент 4


Заливаем образ системы англоязычный в режиме аудита.


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


Эксперимент 5


Заливаем образ системы русифицированный в режиме аудита.


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


Выходим из учетной записи, заходим под учетной записью Admin. Запускаем PowerShell с правами администратора, выполняем команду Dism /online /Get-Intl и видим Язык пользовательского интерфейса по умолчанию: en-US.


Загружаемся с флэшки в WinPE, развернутая ОС у меня на диске E. Выполняем команду Dism /image:E:\ /Set-UILang:ru-ru. Смотрим на результат, выполняем Dism /image:E:\ /Get-Intl и видим Default system UI language: ru-RU.


Загружаемся в систему, входим в учетную запись User, мультикиоск не работает.


Для четкой фиксации причинно-следственной связи появления проблемы попробуем еще раз сделать мультикиоск рабочим и нерабочим.


Загружаемся с флэшки в WinPE, развернутая ОС у меня на диске E. Выполняем команду Dism /image:E:\ /Set-UILang:en-us. Смотрим на результат, выполняем Dism /image:E:\ /Get-Intl и видим Default system UI language: en-US.


Загружаемся в систему, входим в учетную запись User, мультикиоск работает.


Загружаемся с флэшки в WinPE, развернутая ОС у меня на диске E. Выполняем команду Dism /image:E:\ /Set-UILang:ru-ru. Смотрим на результат, выполняем Dism /image:E:\ /Get-Intl и видим Default system UI language: ru-RU.


Загружаемся в систему, входим в учетную запись User, мультикиоск не работает.


Т.е. можно увидеть четкую зависимость работоспособности киоска от значения языка пользовательского интерфейса по умолчанию. Может есть еще какие-то факторы, влияющие на работоспособность мультикиоска?


Эксперимент 6


Для чистоты эксперимента перезаливаем систему. Заливаем образ системы русифицированный в режиме аудита.


Запускаем sysprep в графическом режиме, запечатываем ОС с теми же параметрами что и во время эксперимента 2. Ждем приветствия ОС и отвечаем на вопросы: Continue in selected language? English (United States); регион Россия; раскладка клавиатуры Русская. Далее все параметры выбраны как и в эксперименте 2.


Смотрим параметры значения языка пользовательского интерфейса по умолчанию. Выполняем команду Dism /online /Get-Intl и видим Default system UI language: en-US. В оснастке Управление компьютером создаем пользователя User, добавляем пакет подготовки, заходим в учетную запись User, мультикиоск работает.


Пробуем сломать киоск путем изменения языка пользовательского интерфейса по умолчанию. Заходим в пользователя Test, который был создан при первой загрузке системы и включаем для него автоматический вход чтобы система не загружалась в учетную запись User, сразу. Выполняем netplwiz, выбираем пользователя Test, снимаем флажок Требовать ввод имени пользователя и пароля и применяем параметры.


Загружаемся с флэшки в WinPE. Выполняем команду Dism /image:E:\ /Set-UILang:ru-ru. Смотрим на результат, выполняем Dism /image:E:\ /Get-Intl и видим Default system UI language: ru-RU.


Загружаемся в систему, пытаемся войти в учетную запись User, мультикиоск работает. Т.е. его не получается сломать. А можно ли его таким образом заставить работать?


Эксперимент 7


Заливаем образ системы русифицированный в режиме аудита.


Запускаем Sysprep.bat, выбираем пункт 2. Загружаемся в систему, в оснастке Управление компьютером создаем пользователя User, добавляем пакет подготовки, заходим в учетную запись User, мультикиоск не работает.


Загружаемся с флэшки в WinPE. Выполняем команду Dism /image:E:\ /Set-UILang:en-us. Смотрим на результат, выполняем Dism /image:E:\ /Get-Intl и видим Default system UI language: en-US.


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


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


Эксперимент 8


Заливаем образ системы англоязычный в режиме аудита.


Подключаемся к интернету, в параметрах системы заходим в раздел Language выбираем Add language, выбираем язык Русский, нажимаем Next, параметры установки оставляем по умолчанию, нажимаем Install, после установки языкового пакета перезагружаем систему, теперь на русифицирована. Отключаем систему от интернета, запускаем Sysprep.bat, выбираем пункт 2.


После загрузки системы в оснастке Управление компьютером создаем пользователя User, добавляем пакет подготовки, заходим в учетную запись User, мультикиоск не работает.


Эксперимент 9


Попробуем русифицировать систему до установки, в оффлайн режиме. Заодно будет краткий ликбез по локализации дистрибутива.


Беру флэшку с чистым оригинальным дистрибутивом X21-96381. Она будет диском E. Для монтирования образов создаю папки: c:\Mount\Install, c:\Mount\Winre, c:\Mount\Boot. Беру набор пакетов локализации X21-87814. И в папку c:\Mount копирую из него пакеты: Microsoft-Windows-Client-Language-Pack_x86_ru-ru.cab, lp.cab, WinPE-Setup_ru-ru.cab. Запускаю консоль с правами администратора. Думаю, что дальнейшие команды будут понятны без комментариев.


Команды локализации
cd c:\mountdism /Mount-Wim /WimFile:e:\sources\install.wim /index:1 /MountDir:Installcodedism /Image:Install /Add-Package /PackagePath:Microsoft-Windows-Client-Language-Pack_x86_ru-ru.cabcodedism /Image:Installcode /Set-AllIntl:ru-rudism /Image:Install /Set-TimeZone:"Russian Standard Time"codedism /Mount-Wim /WimFile:Install\Windows\System32\Recovery\Winre.wim /index:1 /MountDir:Winrecodedism /Image:Winre /Add-Package /PackagePath:lp.cabcodedism /Image:Winrecode /Set-AllIntl:ru-rudism /Image:Winre /Set-TimeZone:"Russian Standard Time"codedism /Unmount-Image /MountDir:Winre /Commitcodedism /Image:Install /Gen-LangINI /distribution:E:\ /Set-AllIntl:ru-RUcodedism /image:Install /Set-SetupUILang:RU-ru /distribution:E:\codedism /Unmount-Image /MountDir:Install /Commitcodedism /mount-wim /wimfile:e:\sources\boot.wim /index:1 /mountdir:Bootcodedism /Image:Boot /Add-Package /PackagePath:lp.cabcodedism /Image:Bootcode /Set-AllIntl:ru-rucopy e:\sources\lang.ini Boot\sources\lang.inicodedism /Unmount-Image /MountDir:Boot /Commitcodedism /mount-wim /wimfile:e:\sources\boot.wim /index:2 /mountdir:Bootcodedism /Image:Boot /Add-Package /PackagePath:lp.cabcodedism /Image:Boot /Add-Package /PackagePath:WinPE-Setup_ru-ru.cabcodedism /Image:Bootcode /Set-AllIntl:ru-rucopy e:\sources\lang.ini Boot\sources\lang.ini /ycodedism /Unmount-Image /MountDir:Boot /Commit

Загружаемся с флэшки, выбираем русский язык и ставим систему на чистый диск. Когда система просит выбрать регион нажимаем Ctrl+Shift+F3. В оснастке Управление компьютером создаем пользователя User, добавляем пакет подготовки, заходим в учетную запись User, мультикиоск не работает.


Загружаемся с флэшки в WinPE. Выполняем команду Dism /image:E:\ /Set-UILang:en-us.


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


Видимо дело не в методах добавления пакета, попробуем добавить дополнительные пакеты.


Эксперимент 10


Берем флэшку, которую мы подготовили на предыдущем шаге.


Берем пакет Feat on Demand X21-87815. В папку c:\Mount копирую из него пакеты: Microsoft-Windows-LanguageFeatures-Basic-ru-ru-Package~31bf3856ad364e35~x86~~.cab, Microsoft-Windows-LanguageFeatures-OCR-ru-ru-Package~31bf3856ad364e35~x86~~.cab, Microsoft-Windows-LanguageFeatures-Handwriting-ru-ru-Package~31bf3856ad364e35~x86~ ~.cab, Microsoft-Windows-LanguageFeatures-TextToSpeech-ru-ru-Package~31bf3856ad364e35~x86~~.cab.


Берем пакет Feat on Demand RDX Updt X21-99781. В папку c:\Mount копирую из него пакеты: Microsoft-Windows-RetailDemo-OfflineContent-Content-Package~31bf3856ad364e35~x86~~.cab, Microsoft-Windows-RetailDemo-OfflineContent-Content-ru-ru-Package~31bf3856ad364e35~x86~~.cab.


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


Команды
cd c:\mountdism /Mount-Wim /WimFile:e:\sources\install.wim /index:1 /MountDir:Installdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-Basic-ru-ru-Package~31bf3856ad364e35~x86~~.cabdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-OCR-ru-ru-Package~31bf3856ad364e35~x86~~.cabdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-Handwriting-ru-ru-Package~31bf3856ad364e35~x86~~.cabdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-TextToSpeech-ru-ru-Package~31bf3856ad364e35~x86~~.cabdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-RetailDemo-OfflineContent-Content-Package~31bf3856ad364e35~x86~~.cabdism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-RetailDemo-OfflineContent-Content-ru-ru-Package~31bf3856ad364e35~x86~~.cabdism /Unmount-Image /MountDir:Install /Commit

Загружаемся с флэшки, выбираем русский язык и ставим систему на чистый диск. Когда система просит выбрать регион нажимаем Ctrl+Shift+F3. В оснастке Управление компьютером создаем пользователя User, добавляем пакет подготовки, заходим в учетную запись User. Я получил черный экран, который долго висел, поэтому я выполнил горячую перезагрузку системы.


Удаляем пакет подготовки, заходим под пользователем User, перезагружаем систему, добавиляем пакет подготовки, мультикиоск не работает.


Загружаемся с флэшки в WinPE. Выполняем команду Dism /image:E:\ /Set-UILang:en-us.


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


Обход проблемы


Нормальные герои. Всегда идут в обход!


Различные способы установки пакетов локализации не решили проблему, значит придется при первой загрузке после запечатывания устанавливать язык en-us, а после первой загрузки изменять языковые настройки.


Заливаем образ системы русифицированный в режиме аудита.


В файле Unattend.xml в параметре вписываем en-US, запускаем Sysprep.bat, выбираем пункт 2 и смотрим, что у нас получилось. Экран приветствия на английском языке, мультикиоск работает. Значит нужно добавить в Unattend.xml команду на изменение языка приветствия. А для этого необходимо выполнить команду control intl.cpl,,/f: с указанием конфигурационного файла, в котором будет прописано копирование текущих параметров в экран приветствия. Содержимое конфигурационного файла будет выглядеть вот так.


<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">      <gs:UserList>        <gs:User UserID="Current" CopySettingsToSystemAcct="true"/>     </gs:UserList></gs:GlobalizationServices>

Т.к. будет копирование настроек текущего пользователя, то и выполнять команду нужно после входа пользователя в систему, а это значит, что нам понадобятся. Есть одно небольшое но, выполнение будет после входа пользователя с правами администратора. И мне бы не хотелось создавать дополнительный файл, который будет необходим для успешного выполнения команды. Лучше все решение реализовать в едином файле Unattend.xml. Для этого просто нужно будет выполнить команду, которая создает конфигурационный файл. Думаю, что создам конфигурационный файл с помощью команды echo в среде cmd, но в ней нужно экранировать угловые скобки циркумфлексом. Т.е. для создания конфигурационного файла получается вот такая команда.


echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>^<gs:UserList^>^<gs:User UserID="Current" CopySettingsToSystemAcct="true"/^>^</gs:UserList^>^</gs:GlobalizationServices^>>Config.xml

Но нам эту команду нужно поместить в XML, у которого свои требования к использованию спецсимволов:


Спецсимвол Замещающее значение
> &gt;
< &lt;
& &amp;
&apos;
&quot;

В итоге для создания конфигурационного файла получилась вот такая команда для FirstLogonCommands.


cmd.exe /c echo ^&lt;gs:GlobalizationServices xmlns:gs=&quot;urn:longhornGlobalizationUnattend&quot;^&gt;^&lt;gs:UserList^&gt;^&lt;gs:User UserID=&quot;Current&quot; CopySettingsToSystemAcct=&quot;true&quot;/^&gt;^&lt;/gs:UserList^&gt;^&lt;/gs:GlobalizationServices^&gt;&gt;&quot;%TMP%\Config.xml&quot;

Далее выполняем команду с использованием конфигурационного файла.


control intl.cpl,,/f:&quot;%TMP%\Config.xml&quot;

Далее удаляем ранее созданный файл и перезагружаем систему т.к. изменения вступят в силу после перезагрузки.


cmd.exe /c del &quot;%TMP%\Config.xml&quot; /q&amp;shutdown /r /f /t 00

В итоге у меня получился вот такой файл ответов для sysprepа.


Unattend.xml
<?xml version="1.0" encoding="utf-8"?><unattend xmlns="urn:schemas-microsoft-com:unattend">    <settings pass="specialize">        <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <RunSynchronous>                <RunSynchronousCommand wcm:action="add">                    <Path>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f</Path>                    <Order>1</Order>                    <Description>Dont show key page</Description>                </RunSynchronousCommand>                <RunSynchronousCommand wcm:action="add">                    <Path>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f</Path>                    <Order>2</Order>                    <Description>Dont make account</Description>                </RunSynchronousCommand>                <RunSynchronousCommand wcm:action="add">                    <Path>cmd.exe /c rd %systemdrive%\Sysprep /s /q</Path>                    <Order>3</Order>                    <Description>Del Folder</Description>                </RunSynchronousCommand>            </RunSynchronous>        </component>        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <AutoLogon>                <Enabled>true</Enabled>                <Username>Admin</Username>            </AutoLogon>        </component>    </settings>    <settings pass="oobeSystem">        <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <InputLocale>en-US; ru-RU</InputLocale>            <SystemLocale>ru-RU</SystemLocale>            <UILanguage>en-US</UILanguage>            <UILanguageFallback></UILanguageFallback>            <UserLocale>ru-RU</UserLocale>        </component>        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://personeltest.ru/away/schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://personeltest.ru/away/www.w3.org/2001/XMLSchema-instance">            <OOBE>                <HideEULAPage>true</HideEULAPage>                <HideLocalAccountScreen>true</HideLocalAccountScreen>                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>                <ProtectYourPC>1</ProtectYourPC>            </OOBE>            <FirstLogonCommands>                <SynchronousCommand wcm:action="add">                    <CommandLine>cmd.exe /c echo ^&lt;gs:GlobalizationServices xmlns:gs=&quot;urn:longhornGlobalizationUnattend&quot;^&gt;^&lt;gs:UserList^&gt;^&lt;gs:User UserID=&quot;Current&quot; CopySettingsToSystemAcct=&quot;true&quot;/^&gt;^&lt;/gs:UserList^&gt;^&lt;/gs:GlobalizationServices^&gt;&gt;&quot;%TMP%\Config.xml&quot;</CommandLine>                    <Description>CreateConfig</Description>                    <Order>1</Order>                </SynchronousCommand>                <SynchronousCommand wcm:action="add">                    <CommandLine>control intl.cpl,,/f:&quot;%TMP%\Config.xml&quot;</CommandLine>                    <Description>UseConfig</Description>                    <Order>2</Order>                </SynchronousCommand>                <SynchronousCommand wcm:action="add">                    <CommandLine>cmd.exe /c del &quot;%TMP%\Config.xml&quot; /q&amp;shutdown /r /f /t 00</CommandLine>                    <Description>DelConfig</Description>                    <Order>3</Order>                </SynchronousCommand>            </FirstLogonCommands>        </component>    </settings>

Проверяем


Заливаем образ системы русифицированный в режиме аудита.


Меняем файл Unattend.xml на новый, запускаем Sysprep.bat, выбираем пункт 2 и смотрим, что у нас получилось. При первой загрузке экран приветствия на английском языке, система перезагружается. Экран приветствия на русском языке, мультикиоск работает.


Если у вас остались вопросы относительно настройки и лицензирования Windows 10 IoT Enterprise, обращайтесь по адресу mse@quarta.ru или на сайт quarta-embedded.ru.
Ответы на некоторые вопросы Вы можете найти в нашей вики или на нашем YouTube-канале


Автор статьи: Борисенков Владимир, технический эксперт компании Кварта Технологии.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru