Przewodnik po integracji EMM

Ten przewodnik pomoże dostawcom usług zarządzania urządzeniami mobilnymi (EMM) zintegrować rejestrację bezdotykową z konsolą. Czytaj dalej, aby dowiedzieć się więcej o rejestracji i poznać sprawdzone metody, które pomogą Ci w udostępnianiu urządzeń za pomocą kontrolera zasad dotyczących urządzeń (DPC). Jeśli masz DPC, poznasz sprawdzone metody wdrażania urządzeń i uzyskasz porady dotyczące programowania i testowania.

Funkcje dla administratorów IT

Użyj interfejsu API klienta, aby pomóc administratorom IT skonfigurować rejestrację typu zero-touch bezpośrednio z konsoli. Oto kilka zadań, które administrator IT może wykonać w konsoli:

  • Tworzenie, edytowanie i usuwanie konfiguracji rejestracji typu zero-touch na podstawie zasad dotyczących urządzeń mobilnych.
  • Ustaw domyślną konfigurację, aby DPC mógł udostępniać przyszłe urządzenia kupowane przez organizację.
  • Zastosuj poszczególne konfiguracje na urządzeniach lub usuń urządzenia z rejestracji typu zero-touch.

Więcej informacji o rejestracji typu zero-touch znajdziesz w tym artykule.

Wymagania wstępne

Zanim dodasz rejestrację typu zero-touch do konsoli EMM, sprawdź, czy Twoje rozwiązanie obsługuje te funkcje:

  • Rozwiązanie EMM musi udostępniać urządzenie należące do firmy z Androidem 8.0 lub nowszym (Pixel 7.1 lub nowszy) w trybie w pełni zarządzanym. Urządzenia z Androidem 10 lub nowszym należące do firmy można obsługiwać jako w pełni zarządzane lub z profilem służbowym.
  • Rejestracja typu zero-touch automatycznie pobiera i instaluje kontroler zasad urządzeń, dlatego musi on być dostępny w Google Play. Prowadzimy listę zgodnych dostawców DPC, którą administratorzy IT mogą konfigurować za pomocą interfejsu API klienta lub portalu. Prześlij prośbę o zmianę produktu w społeczności dostawców usług EMM, aby dodać DPC do listy.
  • Aby wywoływać interfejs API klienta, klienci muszą mieć konto rejestracji typu zero-touch. Sprzedawca partnerski konfiguruje konto dla organizacji administratora IT, gdy organizacja kupuje urządzenia.
  • Aby rejestracja typu zero-touch działała prawidłowo, urządzenie musi być zgodne z Usługami mobilnymi Google (GMS), a Usługi Google Play muszą być zawsze włączone.

Wywoływanie interfejsu API

Użytkownicy konsoli (korzystający z konta Google) autoryzują żądania interfejsu API wysyłane do interfejsu API klienta. Ten proces różni się od autoryzacji przeprowadzanej w przypadku innych interfejsów API EMM. Więcej informacji o tym, jak to zrobić w aplikacji, znajdziesz w sekcji Autoryzacja.

Warunki korzystania z usługi Handle

Zanim użytkownicy wywołają interfejs API, muszą zaakceptować najnowsze Warunki korzystania z usługi. Jeśli wywołanie interfejsu API zwróci kod stanu HTTP 403 Forbidden, a treść odpowiedzi będzie zawierać TosError, poproś użytkownika o zaakceptowanie Warunków korzystania z usługi przez zalogowanie się w portalu rejestracji bezdotykowej. Poniżej znajdziesz przykład, jak to zrobić:

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)

Jeśli klient interfejsu API Google obsługuje szczegółowe błędy (żądania w Javie, Pythonie lub HTTP), w żądaniach uwzględnij nagłówek HTTP X-GOOG-API-FORMAT-VERSION z wartością 2. Jeśli Twój klient nie obsługuje szczegółowych błędów (.NET i inne), dopasuj komunikat o błędzie.

Jeśli w przyszłości zaktualizujemy Warunki korzystania z usługi, a Ty zastosujesz to podejście, Twoja aplikacja przekieruje użytkownika do ponownej akceptacji nowych Warunków korzystania z usługi.

Administratorzy IT używają portalu rejestracji typu zero-touch do zarządzania użytkownikami w swojej organizacji. Nie możesz oferować tej funkcji za pomocą interfejsu API klienta. Administratorzy IT mogą też zarządzać urządzeniami i konfiguracjami za pomocą portalu. Jeśli chcesz umieścić w konsoli lub dokumentacji link do portalu, użyj tego adresu URL:

https://enterprise.google.com/android/zero-touch/customers

Możesz poinformować administratorów IT, że pojawi się prośba o zalogowanie się na konto Google.

Rejestrowanie urządzenia

Rejestracja typu zero-touch to mechanizm rejestrowania urządzeń, podobny do rejestracji NFC lub rejestracji za pomocą kodu QR. Konsola musi obsługiwać urządzenia zarządzane, a kontroler zasad dotyczących urządzeń musi działać w trybie urządzenia w pełni zarządzanego.

Rejestracja typu zero-touch jest dostępna na obsługiwanych urządzeniach z Androidem 8.0 lub nowszym. Administratorzy IT muszą kupować obsługiwane urządzenia od sprzedawcy. Konsola może śledzić, które urządzenia administratora IT są dostępne do rejestracji typu zero-touch, wywołując customers.devices.list.

Oto opis procesu rejestracji:

  1. Przy pierwszym uruchomieniu (lub po przywróceniu ustawień fabrycznych) urządzenie łączy się z serwerem Google w celu rejestracji typu zero-touch.
  2. Jeśli administrator IT zastosował konfigurację na urządzeniu, rejestracja bezdotykowa uruchamia kreatora konfiguracji Androida na w pełni zarządzanym urządzeniu i personalizuje ekrany za pomocą metadanych z konfiguracji.
  3. Rejestracja typu zero-touch pobiera i instaluje DPC z Google Play.
  4. DPC otrzyma intencję ACTION_PROVISION_MANAGED_DEVICE i przygotuje urządzenie.

Jeśli nie ma połączenia z internetem, weryfikacja nastąpi, gdy będzie ono dostępne. Więcej informacji o wdrażaniu urządzeń z wykorzystaniem rejestracji typu zero-touch znajdziesz w sekcji Wdrażanie poniżej.

Konfiguracje domyślne

Rejestracja typu zero-touch jest najbardziej przydatna dla administratorów IT, gdy ustawią domyślną konfigurację, która będzie stosowana na wszystkich nowych urządzeniach zakupionych przez ich organizację. Promowanie ustawienia konfiguracji domyślnej w konsoli, jeśli nie jest ona ustawiona. Możesz sprawdzić wartość customers.configurations.isDefault, aby dowiedzieć się, czy organizacja ustawiła konfigurację domyślną.

Poniższy przykład pokazuje, jak ustawić dotychczasową konfigurację jako domyślną:

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()

Odwoływanie się do DPC

Zalecamy używanie nazwy zasobu interfejsu API customers.dpcs.name do identyfikowania DPC i używania go w konfiguracjach. Nazwa zasobu zawiera unikalny i niezmienny identyfikator dostawcy platformy. Wywołaj funkcję customers.dpcs.list, aby uzyskać listę wszystkich obsługiwanych usług DPC. Nazwa zasobu zawiera też identyfikator klienta, więc aby znaleźć pasującą instancję Dpc, przefiltruj listę, używając ostatniego komponentu ścieżki. Przykład poniżej pokazuje, jak dopasować DPC i zachować go do późniejszego użycia w konfiguracji:

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...

Jeśli w interfejsie konsoli musisz wyświetlić nazwę DPC, pokaż wartość zwróconą przez customers.dpcs.dpcName.

Udostępniam

Skorzystaj z możliwości zapewnienia użytkownikom doskonałych wrażeń podczas wdrażania urządzeń. Do aprowizacji urządzenia wystarczy nazwa użytkownika i hasło. Pamiętaj, że sprzedawcy mogą wysyłać urządzenia bezpośrednio do użytkowników zdalnych. Wszystkie inne ustawienia, takie jak serwer EMM czy jednostka organizacyjna, umieść w pliku customers.configuration.dpcExtras.

Poniższy fragment kodu JSON przedstawia część przykładowej konfiguracji:

{
  "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\"]"
    }
}

Rejestracja typu zero-touch instaluje i uruchamia kontroler zasad dotyczących urządzeń za pomocą intencji Androida. System wysyła wartości we właściwości JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE do DPC jako dodatki w intencji. DPC może odczytywać ustawienia udostępniania z pliku PersistableBundle za pomocą tych samych kluczy.

Zalecane – użyj tych dodatków do intencji, aby skonfigurować DPC:

Nie zalecamy uwzględniania tych dodatkowych elementów, które możesz stosować w innych metodach rejestracji:

Aby dowiedzieć się, jak wyodrębnić te ustawienia i użyć ich w DPC, przeczytaj artykuł Provision customer devices (Konfigurowanie urządzeń klientów).

Programowanie i testowanie

Aby opracowywać i testować funkcje rejestracji typu zero-touch na konsoli, musisz mieć:

  • obsługiwane urządzenie;
  • konto klienta do rejestracji typu zero-touch,

Twórz i testuj aplikacje na urządzeniach obsługujących rejestrację typu zero-touch, takich jak Google Pixel. Nie musisz kupować urządzeń deweloperskich od partnera sprzedaży.

Skontaktuj się z nami, aby uzyskać testowe konto klienta i dostęp do portalu rejestracji typu zero-touch. Wyślij do nas e-maila z firmowego adresu e-mail, który jest powiązany z kontem Google. Podaj producenta i numer IMEI jednego lub dwóch urządzeń, a my dodamy je do Twojego konta dewelopera.

Pamiętaj, że rejestracja typu zero-touch automatycznie pobiera i instaluje kontroler zasad urządzeń, dlatego przed przetestowaniem konfiguracji musisz udostępnić kontroler zasad urządzeń w Google Play. Nie możesz przeprowadzać testów z wersją rozwojową kontrolera zasad urządzenia.

Pomoc dla administratorów IT

Jeśli chcesz pomóc administratorom IT w interfejsie konsoli lub w dokumentacji, zapoznaj się z artykułem Rejestracja typu zero-touch dla administratorów IT. Możesz też odesłać użytkowników konsoli do tego artykułu w Centrum pomocy.

Więcej informacji

Zapoznaj się z tymi dokumentami, aby zintegrować rejestrację typu zero-touch z konsolą: