Это руководство поможет поставщикам услуг по управлению мобильной инфраструктурой предприятия (EMM) интегрировать автоматическую настройку в свою консоль. Ниже вы найдете подробную информацию о регистрации и рекомендации по настройке устройств с помощью контроллера правил для устройств. Если у вас есть контроллер политики устройств, вы узнаете, как лучше всего настраивать устройства, и получите советы по разработке и тестированию.
Функции для системных администраторов
Используйте API для клиентов, чтобы помочь системным администраторам настроить автоматическую регистрацию прямо из вашей консоли. Вот некоторые задачи, которые системный администратор может выполнять в консоли:
- Создавайте, изменяйте и удаляйте конфигурации автоматической настройки в соответствии с правилами для мобильных устройств.
- Задайте конфигурацию по умолчанию, чтобы контроллер политики устройств настраивал новые устройства, которые организация приобретет в будущем.
- Применяйте к устройствам отдельные конфигурации или исключайте устройства из списка для автоматической настройки.
Подробнее об автоматической настройке…
Требования
Прежде чем добавлять автоматическую настройку в консоль EMM, убедитесь, что ваше решение поддерживает следующие функции:
- Решение EMM должно поддерживать инициализацию корпоративного устройства Android 8.0 или более поздней версии (Pixel 7.1 или более поздней версии) в режиме полного управления. Корпоративные устройства Android 10 и более поздних версий можно настроить как полностью управляемые или с рабочим профилем.
- Поскольку при автоматической настройке контроллер политики устройств скачивается и устанавливается автоматически, он должен быть доступен в Google Play. Мы поддерживаем список совместимых DPC, которые системные администраторы могут настраивать с помощью API клиента или портала. Чтобы добавить контроллер политик в список, отправьте запрос на изменение продукта через сообщество поставщиков EMM.
- Чтобы вызывать API для клиентов, вашим клиентам нужен аккаунт автоматической настройки. Реселлер-партнер настраивает аккаунт для организации администратора, когда она покупает устройства.
- Чтобы автоматическая настройка работала корректно, устройство должно быть совместимо с Google для мобильных устройств (GMS) и на нем должны быть всегда включены сервисы Google Play.
Вызов API
Пользователи консоли (с помощью своего аккаунта Google) авторизуют запросы к API клиентов. Этот процесс отличается от авторизации, которую вы выполняете для других API EMM. Подробнее о том, как это сделать, читайте в разделе Авторизация.
Условия использования псевдонимов
Перед вызовом API пользователи должны принять последнюю версию Условий использования. Если вызов API возвращает код статуса HTTP 403 Forbidden, а тело ответа содержит TosError, предложите пользователю принять Условия использования, войдя на портал автоматической настройки. Ниже показано, как это можно сделать.
Java
// Authorize this method call as a user that hasn't yet accepted the ToS. final String googleApiFormatHttpHeader = "X-GOOG-API-FORMAT-VERSION"; final String googleApiFormatVersion = "2"; final String tosErrorType = "type.googleapis.com/google.android.device.provisioning.v1.TosError"; try { // Send an API request to list all the DPCs available including the HTTP header // X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception: // from googleapiclient.errors import HttpError AndroidProvisioningPartner.Customers.Dpcs.List request = service.customers().dpcs().list(customerAccount); request.getRequestHeaders().put(googleApiFormatHttpHeader, googleApiFormatVersion); CustomerListDpcsResponse response = request.execute(); return response.getDpcs(); } catch (GoogleJsonResponseException e) { // Get the error details. In your app, check details exists first. ArrayList<Map> details = (ArrayList<Map>) e.getDetails().get("details"); for (Map detail : details) { if (detail.get("@type").equals(tosErrorType) && (boolean) detail.get("latestTosAccepted") != true) { // Ask the user to accept the ToS. If they agree, open the portal in a browser. // ... } } return null; }
.NET
// Authorize this method call as a user that hasn't yet accepted the ToS. try { var request = service.Customers.Dpcs.List(customerAccount); CustomerListDpcsResponse response = request.Execute(); return response.Dpcs; } catch (GoogleApiException e) { foreach (SingleError error in e.Error?.Errors) { if (error.Message.StartsWith("The user must agree the terms of service")) { // Ask the user to accept the ToS. If they agree, open the portal in a browser. // ... } } }
Python
# Authorize this method call as a user that hasn't yet accepted the ToS. tos_error_type = ('type.googleapis.com/' 'google.android.device.provisioning.v1.TosError') portal_url = 'https://enterprise.google.com/android/zero-touch/customers' # Send an API request to list all the DPCs available including the HTTP # header X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception: # from googleapiclient.errors import HttpError try: request = service.customers().dpcs().list(parent=customer_account) request.headers['X-GOOG-API-FORMAT-VERSION'] = '2' response = request.execute() return response['dpcs'] except HttpError as err: # Parse the JSON content of the error. In your app, check ToS exists first. error = json.loads(err.content) tos_error = error['error']['details'][0] # Ask the user to accept the ToS (not shown here). If they agree, then open # the portal in a browser. if (tos_error['@type'] == tos_error_type and tos_error['latestTosAccepted'] is not True): if raw_input('Accept the ToS in the zero-touch portal? y|n ') == 'y': webbrowser.open(portal_url)
Если ваш клиент Google API поддерживает подробные сообщения об ошибках (Java, Python или HTTP-запросы), включите в запросы HTTP-заголовок X-GOOG-API-FORMAT-VERSION со значением 2. Если ваш клиент не поддерживает подробные сообщения об ошибках (.NET и другие), сопоставьте сообщение об ошибке.
Если вы будете следовать этому подходу, то при обновлении Условий использования ваше приложение будет предлагать пользователю принять их заново.
Ссылка на портал
Администраторы используют портал автоматической настройки, чтобы управлять пользователями в организации. Вы не можете предлагать эту функцию через API для клиентов. Администраторы также могут управлять устройствами и конфигурациями на портале. Если вам нужно добавить ссылку на портал в консоль или документацию, используйте этот URL:
https://enterprise.google.com/android/zero-touch/customers
Вы можете сообщить системным администраторам, что им будет предложено войти в аккаунт Google.
Регистрация устройства
Автоматическая настройка – это механизм регистрации устройств, аналогичный регистрации с помощью NFC или QR-кода. Ваша консоль должна поддерживать управляемые устройства, а контроллер политики устройств – работать в режиме полностью управляемого устройства.
Автоматическая настройка доступна на поддерживаемых устройствах с Android 8.0 или более поздней версии. Системные администраторы должны приобрести поддерживаемые устройства у партнерского реселлера. Консоль может отслеживать, какие устройства системного администратора доступны для автоматической настройки, вызывая customers.devices.list.
Вот как это работает:
- При первом запуске или после сброса настроек устройство подключается к серверу Google для автоматической настройки.
- Если администратор применил конфигурацию к устройству, автоматическая настройка запускает мастер настройки Android для полностью управляемого устройства и персонализирует экраны с помощью метаданных из конфигурации.
- При автоматической настройке контроллер политики устройств скачивается и устанавливается из Google Play.
- DPC получает намерение
ACTION_PROVISION_MANAGED_DEVICEи настраивает устройство.
Если подключения к интернету нет, проверка выполняется, когда оно появляется. Подробнее о подготовке устройств с автоматической настройкой…
Конфигурации по умолчанию
Автоматическая настройка наиболее полезна для системных администраторов, когда они задают конфигурацию по умолчанию, которая применяется ко всем новым устройствам, приобретаемым организацией. Если конфигурация по умолчанию не задана, в консоли появится предложение сделать это. Чтобы узнать, задана ли в организации конфигурация по умолчанию, проверьте значение customers.configurations.isDefault.
В примере ниже показано, как сделать существующую конфигурацию конфигурацией по умолчанию.
Java
// Send minimal data with the request. Just the 2 required fields. // targetConfiguration is an existing configuration that we want to make the default. Configuration configuration = new Configuration(); configuration.setIsDefault(true); configuration.setConfigurationId(targetConfiguration.getConfigurationId()); // Call the API, including the FieldMask to avoid setting other fields to null. AndroidProvisioningPartner.Customers.Configurations.Patch request = service .customers() .configurations() .patch(targetConfiguration.getName(), configuration); request.setUpdateMask("isDefault"); Configuration results = request.execute();
.NET
// Send minimal data with the request. Just the 2 required fields. // targetConfiguration is an existing configuration that we want to make the default. Configuration configuration = new Configuration { IsDefault = true, ConfigurationId = targetConfiguration.ConfigurationId, }; // Call the API, including the FieldMask to avoid setting other fields to null. var request = service.Customers.Configurations.Patch(configuration, targetConfiguration.Name); request.UpdateMask = "IsDefault"; Configuration results = request.Execute();
Python
# Send minimal data with the request. Just the 2 required fields. # target_configuration is an existing configuration we'll make the default. configuration = { 'isDefault': True, 'configurationId': target_configuration['configurationId']} # Call the API, including the FieldMask to avoid setting other fields to null. response = service.customers().configurations().patch( name=target_configuration['name'], body=configuration, updateMask='isDefault').execute()
Ссылка на контроллер политик на устройствах
Рекомендуем использовать название ресурса API customers.dpcs.name, чтобы идентифицировать контроллер и использовать его в конфигурациях. Название ресурса содержит уникальный и неизменный идентификатор контроллера политики. Вызовите метод customers.dpcs.list, чтобы получить список всех поддерживаемых контроллеров. Поскольку название ресурса также включает идентификатор клиента, отфильтруйте список по последнему компоненту пути, чтобы найти соответствующий экземпляр Dpc. В примере ниже показано, как сопоставить код поставщика платежных услуг и сохранить его для дальнейшего использования в конфигурации.
Java
// Return a customer Dpc instance for the specified DPC ID. String myDpcIdentifier = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...xMSWCiYiuHRWeBbu86Yjq"; final int dpcIdIndex = 3; final String dpcComponentSeparator = "/"; // ... for (Dpc dpcApp : dpcs) { // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the // fourth component matches the DPC ID. String dpcId = dpcApp.getName().split(dpcComponentSeparator)[dpcIdIndex]; if (dpcId.equals(myDpcIdentifier)) { System.out.format("My DPC is: %s\n", dpcApp.getDpcName()); return dpcApp; } } // Handle the case when the DPC isn't found...
.NET
// Return a customer Dpc instance for the specified DPC ID. var myDpcIdentifer = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...fE9WdHcxMSWCiYiuHRWeBbu86Yjq"; const int dpcIdIndex = 3; const String dpcComponentSeparator = "/"; // ... foreach (Dpc dpcApp in dpcs) { // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the // fourth component matches the DPC ID. String dpcId = dpcApp.Name.Split(dpcComponentSeparator)[dpcIdIndex]; if (dpcId.Equals(myDpcIdentifer)) { Console.WriteLine("Matched DPC is: {0}", dpcApp.DpcName); return dpcApp; } } // Handle the case when the DPC isn't found...
Python
# Return a customer Dpc instance for the specified DPC ID. my_dpc_id = 'AH6Gbe4aiS459wlz58L30cqb...fE9WdHcxMSWCiYiuHRWeBbu86Yjq' # ... for dpc_app in dpcs: # Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, # check the fourth component matches the DPC ID. dpc_id = dpc_app['name'].split('/')[3] if dpc_id == my_dpc_id: return dpc_app # Handle the case when the DPC isn't found...
Если вам нужно показать название контроллера в пользовательском интерфейсе консоли, используйте значение, возвращаемое методом customers.dpcs.dpcName.
Инициализация
Воспользуйтесь возможностью сделать подготовку устройств удобной для пользователей.
Для инициализации устройства достаточно имени пользователя и пароля.
Помните, что реселлеры могут отправлять устройства непосредственно удаленным пользователям. Все остальные настройки, например сервер EMM или организационное подразделение, укажите в customers.configuration.dpcExtras.
Ниже приведен фрагмент кода JSON с примером конфигурации.
{
"android.app.extra.PROVISIONING_LOCALE": "en_GB",
"android.app.extra.PROVISIONING_TIME_ZONE": "Europe/London",
"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
"workflow_type": 3,
"default_password_quality": 327680,
"default_min_password_length": 6,
"company_name": "XYZ Corp",
"organizational_unit": "sales-uk",
"management_server": "emm.example.com",
"detail_tos_url": "https://www.example.com/policies/terms/",
"allowed_user_domains": "[\"example.com\", \"example.org\", \"example.net\"]"
}
}
При автоматической настройке контроллер политик устанавливается и запускается с помощью намерения Android.
Система отправляет значения из свойства JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE в контроллер политики в качестве дополнительных данных в намерении. Ваш контроллер политики устройств может считывать настройки инициализации из PersistableBundle, используя те же ключи.
Рекомендуется – используйте следующие дополнительные параметры intent, чтобы настроить контроллер политик на устройствах:
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLEEXTRA_PROVISIONING_LOCALEEXTRA_PROVISIONING_TIME_ZONEEXTRA_PROVISIONING_LOCAL_TIMEEXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLEDEXTRA_PROVISIONING_MAIN_COLOREXTRA_PROVISIONING_DISCLAIMERS
Не рекомендуется – не включайте следующие дополнительные параметры, которые вы можете использовать в других методах регистрации:
EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAMEEXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUMEXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADEREXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATIONEXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
Чтобы узнать, как извлечь и использовать эти настройки в DPC, прочитайте статью Как настроить устройства клиентов.
Разработка и тестирование
Чтобы разработать и протестировать функции автоматической настройки в консоли, вам потребуется:
- поддерживаемое устройство
- аккаунт клиента для автоматической настройки;
Разрабатывайте и тестируйте приложения на устройствах, поддерживающих автоматическую настройку, например Google Pixel. Вам не нужно покупать устройства для разработки у партнера-реселлера.
Свяжитесь с нами, чтобы получить тестовый аккаунт клиента и доступ к порталу автоматической настройки. Напишите нам с корпоративного адреса электронной почты, связанного с аккаунтом Google. Сообщите нам производителя и IMEI-код одного или двух устройств, и мы добавим их в ваш аккаунт разработчика.
Помните, что при автоматической настройке контроллер политики устройств скачивается и устанавливается автоматически, поэтому он должен быть доступен в Google Play, прежде чем вы сможете протестировать инициализацию. Для тестирования нельзя использовать версию контроллера политики, предназначенную для разработчиков.
Поддержка для системных администраторов
Если вам нужно помочь администраторам в интерфейсе консоли или документации, ознакомьтесь с руководством по автоматической настройке для администраторов. Вы также можете направить пользователей консоли к этой статье Справочного центра.
Дополнительные сведения
Ознакомьтесь с этими документами, чтобы интегрировать автоматическую настройку в свою консоль:
- Автоматическая настройка: руководство для администраторов в Android Enterprise Справка.
- Инициализируйте устройства клиентов на сайте Android EMM Developers.