Hướng dẫn tích hợp EMM

Hướng dẫn này giúp các nhà cung cấp giải pháp quản lý di động dành cho doanh nghiệp (EMM) tích hợp thiết lập tự động vào bảng điều khiển của mình. Hãy tiếp tục đọc để tìm hiểu thêm về cách đăng ký và xem lời khuyên về các phương pháp hay nhất để giúp bạn cấp phép thiết bị DPC (đơn vị kiểm soát chính sách thiết bị). Nếu bạn có DPC, bạn sẽ tìm hiểu các phương pháp hay nhất khi cấp phép thiết bị và nhận lời khuyên để trợ giúp quá trình phát triển và kiểm thử.

Các tính năng dành cho quản trị viên CNTT

Sử dụng API khách hàng để giúp quản trị viên CNTT thiết lập quy trình thiết lập tự động trực tiếp từ bảng điều khiển của bạn. Sau đây là một số thao tác mà quản trị viên CNTT có thể hoàn thành trong bảng điều khiển của bạn:

  • Tạo, chỉnh sửa và xoá cấu hình đăng ký không cần chạm dựa trên chính sách của bạn về thiết bị di động.
  • Thiết lập cấu hình mặc định để DPC của bạn cung cấp các thiết bị trong tương lai mà tổ chức mua.
  • Áp dụng từng cấu hình cho các thiết bị hoặc xoá thiết bị khỏi chế độ tự động đăng ký đăng ký.

Để tìm hiểu thêm về chương trình thiết lập tự động, hãy đọc bài viết tổng quan.

Điều kiện tiên quyết

Trước khi thêm quy trình thiết lập tự động vào bảng điều khiển EMM, hãy xác nhận rằng Solutions hỗ trợ những nội dung sau:

  • Giải pháp EMM của bạn cần cung cấp phiên bản Android 8.0 trở lên (Pixel 7.1 trở lên) thuộc sở hữu của công ty thiết bị ở chế độ được quản lý hoàn toàn. Các thiết bị chạy Android 10 trở lên do công ty sở hữu có thể được cấp phép là được quản lý hoàn toàn hoặc có hồ sơ công việc.
  • Vì quy trình thiết lập tự động, quá trình thiết lập tự động sẽ tự động tải xuống và cài đặt một DPC, DPC phải có trên Google Play. Chúng tôi duy trì danh sách DPC tương thích mà quản trị viên CNTT có thể định cấu hình bằng API khách hàng hoặc cổng thông tin. Gửi yêu cầu sửa đổi sản phẩm thông qua cộng đồng Nhà cung cấp dịch vụ quản lý thiết bị di động (EMM) để thêm DPC của bạn vào danh sách.
  • Khách hàng của bạn cần có tài khoản thiết lập tự động để gọi API khách hàng. Đại lý bán lại của đối tác sẽ thiết lập tài khoản cho tổ chức của quản trị viên CNTT khi tổ chức đó mua thiết bị.
  • Thiết bị phải tương thích với Các dịch vụ của Google dành cho thiết bị di động (GMS) và Dịch vụ Google Play phải luôn bật để thiết lập tự động để hoạt động chính xác.

Gọi API

Người dùng bảng điều khiển của bạn (thông qua Tài khoản Google của họ) cho phép các yêu cầu API của bạn API khách hàng. Quy trình này khác với yêu cầu uỷ quyền mà bạn thực hiện các API EMM khác. Đọc Uỷ quyền để tìm hiểu cách thực hiện việc này trong ứng dụng của bạn.

Xử lý Điều khoản dịch vụ

Người dùng của bạn cần phải chấp nhận Điều khoản dịch vụ (ToS) mới nhất trước gọi API. Nếu lệnh gọi API trả về mã trạng thái HTTP 403 Forbidden và nội dung phản hồi chứa TosError, nhắc người dùng chấp nhận Điều khoản dịch vụ bằng cách đăng nhập vào cổng thiết lập tự động. Ví dụ bên dưới cho biết một trong những cách bạn có thể làm điều này:

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

Nếu ứng dụng Google API của bạn hỗ trợ lỗi chi tiết (Java, Python hoặc HTTP yêu cầu), hãy bao gồm tiêu đề HTTP X-GOOG-API-FORMAT-VERSION kèm theo giá trị 2 trong yêu cầu của bạn. Nếu ứng dụng của bạn không hỗ trợ lỗi chi tiết (.NET và các lỗi khác), hãy so khớp thông báo lỗi.

Khi chúng tôi cập nhật Điều khoản dịch vụ trong tương lai, nếu bạn làm theo phương pháp này, ứng dụng của bạn hướng dẫn người dùng chấp nhận lại Điều khoản dịch vụ mới.

Quản trị viên CNTT sử dụng cổng thông tin thiết lập tự động để quản lý người dùng cho tổ chức—bạn không thể cung cấp tính năng này thông qua API khách hàng. Quản trị viên CNTT cũng có thể quản lý thiết bị và cấu hình bằng cổng thông tin này. Nếu bạn cần liên kết với cổng thông tin từ bảng điều khiển hoặc trong tài liệu của bạn, hãy sử dụng URL này:

https://partner.android.com/zerotouch

Bạn nên thông báo cho quản trị viên CNTT rằng họ được nhắc đăng nhập bằng Tài khoản Google.

Đăng ký thiết bị

Thiết lập tự động là một cơ chế để đăng ký thiết bị và cũng giống như NFC hoặc đăng ký mã QR. Bảng điều khiển của bạn cần hỗ trợ các thiết bị được quản lý và DPC của bạn phải có thể chạy ở chế độ thiết bị được quản lý hoàn toàn.

Quy trình thiết lập tự động có trên các thiết bị được hỗ trợ chạy Android 8.0 hoặc sau. Quản trị viên CNTT phải mua các thiết bị được hỗ trợ từ một đối tác đại lý. Bảng điều khiển của bạn có thể theo dõi thiết bị nào của quản trị viên CNTT có thể thiết lập tự động bằng cách đang gọi customers.devices.list.

Dưới đây là phần tóm tắt về cách hoạt động của quy trình đăng ký:

  1. Thiết bị sẽ kiểm tra với máy chủ của Google trong lần khởi động đầu tiên (hoặc sau khi đặt lại thiết bị về trạng thái ban đầu) để đăng ký không tiếp xúc.
  2. Nếu quản trị viên CNTT đã áp dụng cấu hình cho thiết bị, hãy thiết lập tự động quá trình đăng ký sẽ chạy trình hướng dẫn thiết lập Android của thiết bị được quản lý toàn bộ và cá nhân hoá màn hình có siêu dữ liệu từ cấu hình.
  3. Quy trình thiết lập tự động sẽ tải xuống và cài đặt DPC của bạn qua Google Play.
  4. DPC của bạn nhận được ACTION_PROVISION_MANAGED_DEVICE ý định và cung cấp thiết bị.

Nếu không có kết nối Internet, quá trình kiểm tra sẽ diễn ra khi một thiết bị sẵn có. Để tìm hiểu thêm về việc cung cấp thiết bị bằng quy trình thiết lập tự động, hãy xem phần Cấp phép bên dưới.

Cấu hình mặc định

Quy trình thiết lập tự động giúp ích nhiều nhất cho quản trị viên CNTT khi thiết lập cấu hình mặc định được áp dụng cho mọi thiết bị mới mà tổ chức của họ mua. Đề xuất thiết lập cấu hình mặc định từ bảng điều khiển nếu bạn chưa thiết lập cấu hình. Bạn có thể xem giá trị của customers.configurations.isDefault thành tìm hiểu xem tổ chức đã đặt cấu hình mặc định hay chưa.

Ví dụ bên dưới cho thấy cách tạo một cấu hình hiện có thành mặc định:

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

Tham chiếu DPC

Bạn nên sử dụng tên tài nguyên API customers.dpcs.name để xác định DPC của bạn và sử dụng nó trong cấu hình. Tên tài nguyên chứa giá trị nhận dạng duy nhất và không thay đổi cho DPC. Gọi điện customers.dpcs.list để xem danh sách tất cả các tuỳ chọn được hỗ trợ DPC. Vì tên tài nguyên cũng bao gồm cả mã khách hàng, nên hãy lọc danh sách sử dụng thành phần đường dẫn cuối cùng để tìm một thực thể Dpc phù hợp. Ví dụ bên dưới cho biết cách khớp DPC của bạn và duy trì để sử dụng sau này trong cấu hình:

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

Nếu bạn cần hiển thị tên của DPC trong giao diện người dùng của bảng điều khiển, hãy hiển thị giá trị được trả về từ customers.dpcs.dpcName.

Cung cấp

Hãy tận dụng cơ hội này để cung cấp trải nghiệm người dùng tuyệt vời cho việc cấp phép thiết bị. Tên người dùng và mật khẩu phải là tất cả những gì cần thiết để cấp phép thiết bị. Hãy nhớ rằng đại lý có thể vận chuyển thiết bị trực tiếp đến người dùng từ xa. Bao gồm tất cả các chế độ cài đặt khác, chẳng hạn như máy chủ EMM hoặc đơn vị tổ chức trong customers.configuration.dpcExtras.

Đoạn mã JSON dưới đây cho thấy một phần của cấu hình mẫu:

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

Quy trình thiết lập tự động sẽ cài đặt và khởi chạy DPC bằng Android Intent. Hệ thống sẽ gửi các giá trị trong android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE thuộc tính JSON sang DPC của bạn làm dữ liệu bổ sung trong ý định. DPC có thể đọc các chế độ cài đặt cấp phép từ PersistableBundle bằng các khoá tương tự.

Nên dùng – hãy sử dụng các ý định bổ sung sau đây để thiết lập DPC:

Không nên – đừng bao gồm những loại nội dung sau mà bạn có thể sử dụng trong các phương thức đăng ký khác:

Để tìm hiểu cách trích xuất và sử dụng các chế độ cài đặt này trong DPC, hãy đọc Cấp phép thiết bị của khách hàng.

Phát triển và kiểm thử

Để phát triển và thử nghiệm các tính năng thiết lập tự động của bảng điều khiển, bạn cần có như sau:

  • một thiết bị được hỗ trợ
  • tài khoản tự động đăng ký của khách hàng

Phát triển và kiểm thử bằng các thiết bị hỗ trợ tính năng đăng ký không tiếp xúc, chẳng hạn như Google Pixel. Bạn không phải mua thiết bị phát triển qua một đối tác đại lý.

Hãy liên hệ với chúng tôi để nhận tài khoản khách hàng thử nghiệm và quyền truy cập vào cổng thiết lập tự động. Gửi email cho chúng tôi từ địa chỉ email công ty của bạn được liên kết với một Tài khoản. Hãy cho chúng tôi biết nhà sản xuất và số IMEI của một hoặc hai thiết bị. Chúng tôi sẽ thêm chúng vào quá trình phát triển của bạn tài khoản.

Hãy nhớ rằng do tính năng đăng ký không tiếp xúc tự động tải xuống và cài đặt DPC, nên DPC của bạn phải có trên Google Play thì bạn mới có thể thử nghiệm việc cấp phép. Bạn không thể thử nghiệm bằng phiên bản phát triển của DPC.

Dịch vụ hỗ trợ dành cho quản trị viên CNTT

Nếu bạn cần trợ giúp quản trị viên CNTT trong giao diện của bảng điều khiển hoặc tài liệu của mình, bạn có thể tham khảo bài viết Thiết lập tự động dành cho quản trị viên CNTT để được hướng dẫn. Bạn cũng có thể hướng người dùng của bảng điều khiển đến bài viết đó trong trung tâm trợ giúp.

Tài liệu đọc thêm

Hãy đọc các tài liệu này để biết cách tích hợp quy trình thiết lập tự động vào bảng điều khiển: