EMM 통합 가이드

이 가이드는 엔터프라이즈 모바일 관리 (EMM) 제공업체가 제로터치 등록을 콘솔에 보냅니다. 계속해서 등록에 대해 자세히 알아보고 기기 정책 컨트롤러 (DPC)가 기기를 프로비저닝하도록 지원합니다. DPC가 있는 경우 기기를 프로비저닝할 때의 권장사항을 알아보고 살펴봤습니다

IT 관리자를 위한 기능

고객 API를 사용하여 IT 관리자가 제로터치 등록을 직접 설정하도록 지원 확인할 수 있습니다 IT 관리자가 콘솔에서 완료할 수 있는 작업은 다음과 같습니다.

  • 다음을 기반으로 제로터치 등록 구성을 생성, 수정, 삭제합니다. 모바일 정책
  • DPC가 향후 기기를 프로비저닝하도록 기본 구성을 설정합니다. 조직 내 구매
  • 개별 구성을 기기에 적용하거나 제로터치에서 기기를 삭제합니다. 있습니다.

제로터치 등록에 관해 자세히 알아보려면 개요를 참조하세요.

기본 요건

제로터치 등록을 EMM 콘솔에 추가하기 전에 솔루션은 다음을 지원합니다.

  • EMM 솔루션에서 회사 소유 Android 8.0 이상 (Pixel 7.1 이상)을 프로비저닝해야 함 완전 관리형 모드로 설정된 기기 Android 10 이상을 실행하는 회사 소유 기기는 완전 관리형 또는 직장 프로필로 프로비저닝됩니다.
  • 제로터치 등록은 DPC를 자동으로 다운로드하고 설치하기 때문에 DPC는 Google Play에서 사용할 수 있어야 합니다. Google에서는 호환되는 DPC 목록 유지 IT 관리자가 고객 API 또는 포털을 사용하여 구성할 수 있습니다. EMM 제공업체 커뮤니티를 통한 제품 수정 요청 DPC를 목록에 추가합니다.
  • 고객에게 고객 API를 호출하려면 제로터치 등록 계정이 있어야 합니다. 파트너 리셀러는 조직에서 기기를 구매하는 데 사용됩니다.
  • 기기가 Google 모바일 서비스 (GMS)와 호환되어야 합니다. 제로터치 등록을 위해 Google Play 서비스가 항상 사용 설정되어 있어야 함 있어야 합니다.

API 호출

콘솔의 사용자는 Google 계정을 사용하여 다음과 같이 API 요청을 승인합니다. API에 액세스할 수 있습니다 이 흐름은 다음에 대해 수행하는 승인과 다릅니다. 기타 EMM API 앱에서 이 작업을 실행하는 방법은 승인을 참고하세요.

서비스 약관 처리

사용자가 최신 서비스 약관에 동의해야 합니다. 확인할 수 있습니다 API 호출이 HTTP 403 Forbidden 상태 코드를 반환하고 응답 본문에 TosError가 포함된 경우 사용자에게 수락하라는 메시지를 표시합니다. 제로터치 등록 포털에 로그인하여 서비스 약관을 위반합니다. 아래 예 다음 중 한 가지 방법을 보여드리겠습니다.

자바

// 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://partner.android.com/zerotouch'

# 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 및 오류 메시지와 일치해야 합니다.

향후 서비스 약관이 업데이트될 때 이 접근 방식을 따르면 앱이 사용자에게 새 서비스 약관에 다시 동의하도록 안내합니다.

IT 관리자는 제로터치 등록 포털을 사용하여 고객 API를 통해서는 제공할 수 없습니다. IT 관리자는 포털을 사용하여 기기 및 구성을 관리합니다. 만약 보려면 다음 URL을 사용하세요.

https://partner.android.com/zerotouch

IT 관리자에게 Google 계정을 탭합니다.

기기 등록

제로터치 등록은 기기를 등록하는 메커니즘이며 NFC와 비슷합니다. 등록 또는 QR 코드 등록이 가능합니다 콘솔에서 관리 기기를 지원해야 함 DPC는 완전 관리형 기기 모드에서 실행할 수 있어야 합니다.

제로터치 등록은 Android 8.0 또는 확인할 수 있습니다 IT 관리자는 파트너로부터 지원되는 기기를 구매해야 합니다. 리셀러에게 문의하세요. 콘솔에서는 제로터치 등록에 사용할 수 있는 IT 관리자의 기기 customers.devices.list 호출

등록 방식은 다음과 같습니다.

  1. 최초 시작 시 (또는 공장 출고 후) 기기가 Google 서버에 체크인 재설정)을 설정해야 합니다.
  2. IT 관리자가 기기에 구성을 적용했다면 제로터치 등록은 완전 관리형 기기 Android 설정 마법사를 실행하고 구성의 메타데이터가 포함된 화면
  3. 제로터치 등록은 Google Play에서 DPC를 다운로드하고 설치합니다.
  4. DPC는 다음을 수신합니다. ACTION_PROVISION_MANAGED_DEVICE 인텐트 프로비저닝해야 합니다

인터넷에 연결되어 있지 않은 경우 인터넷에 연결되면 확인 작업이 진행됩니다. 있습니다. 제로터치 등록을 통한 기기 프로비저닝에 관해 자세히 알아보려면 아래의 프로비저닝을 참조하세요.

기본 구성

IT 관리자는 제로터치 등록으로 기본 구성을 설정할 때 가장 큰 도움을 받습니다. 조직에서 구매하는 모든 새 기기에 적용됩니다. 승격 설정 콘솔에서 기본 구성을 생성합니다. 여기에서 customers.configurations.isDefault에서 다음까지의 값 조직이 기본 구성을 설정했는지 확인할 수 있습니다.

아래 예는 기존 구성을 기본값:

자바

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

DPC 참조

API 리소스 이름 customers.dpcs.name을(를) 사용하는 것이 좋습니다. DPC를 식별하여 구성에서 사용할 수 있습니다. 리소스 이름에는 고유하고 변경되지 않는 식별자로 사용됩니다. 전화걸기 customers.dpcs.list: 지원되는 모든 목록 가져오기 DPC: 리소스 이름에는 고객 ID도 포함되어 있으므로 목록을 필터링합니다. 마지막 경로 구성요소를 사용하여 일치하는 Dpc 인스턴스를 찾습니다. 예시 DPC를 매칭하고 나중에 사용할 수 있도록 유지하는 방법을 보여줍니다. 구성:

자바

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

콘솔의 사용자 인터페이스에 DPC의 이름을 표시해야 하는 경우 다음을 표시합니다. 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 인텐트를 사용하여 DPC를 설치하고 시작합니다. 시스템은 DPC에 android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE JSON 속성 추가 엑스트라로 포함해야 합니다. DPC는 동일한 키를 사용하는 PersistableBundle.

권장: 다음 추가 인텐트 사용 DPC를 설정합니다.

권장하지 않음: 다음을 포함하지 않음 다음과 같은 추가 기능을 사용할 수 있습니다.

DPC에서 이러한 설정을 추출하고 사용하는 방법을 알아보려면 프로비저닝을 참조하세요. 고객 기기를 사용합니다.

개발 및 테스트

콘솔의 제로터치 등록 기능을 개발하고 테스트하려면 다음이 필요합니다. 다음과 같습니다.

  • 지원되는 기기
  • 고객 제로터치 등록 계정

제로터치를 지원하는 기기를 사용한 개발 및 테스트 기기 등록(예: Google Pixel) 별도의 설정 없이 리셀러 파트너로부터 개발 기기를 구매할 수 없습니다

Google에 문의하여 테스트 고객 계정을 얻고 제로터치 등록 포털을 방문하세요. 회사 이메일 주소를 사용하여 Google에 이메일을 보냅니다. Google과 관련된 계정. 제조업체 정보 및 IMEI 번호 한 대 또는 두 개 기기의 IMEI 번호가 필요합니다. 그러면 개발 있습니다.

제로터치 등록은 DPC를 사용하려면 먼저 Google Play에서 DPC를 사용할 수 있어야 합니다. 프로비저닝할 수 있습니다 개발 버전의 DPC로는 테스트할 수 없습니다.

IT 관리자 지원

콘솔의 인터페이스나 문서에서 IT 관리자를 지원해야 한다면 자세한 내용은 IT 관리자를 위한 제로터치 등록을 참고하세요. 나 콘솔 사용자를 해당 고객센터 도움말로 안내할 수도 있습니다

추가 자료

제로터치 등록을 콘솔: