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 tính năng đăng ký không cần thao tác vào bảng điều khiển của họ. Hãy tiếp tục đọc để tìm hiểu thêm về quy trình đăng ký và xem các lời khuyên về cách làm hiệu quả nhất để giúp DPC (trình kiểm soát chính sách thiết bị) của bạn cung cấp thiết bị. Nếu có DPC, bạn sẽ tìm hiểu các phương pháp hay nhất khi cung cấp thiết bị và nhận được lời khuyên để hỗ trợ 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 chương trình thiết lập tự động ngay trên bảng điều khiển. Sau đây là một số việc mà quản trị viên CNTT có thể hoàn tất trong bảng điều khiển:
- Tạo, chỉnh sửa và xoá các cấu hình thiết lập tự động dựa trên chính sách dành cho thiết bị di động của bạn.
- Đặt cấu hình mặc định để DPC của bạn cung cấp các thiết bị mà tổ chức sẽ mua trong tương lai.
- Áp dụng từng cấu hình cho thiết bị hoặc xoá thiết bị khỏi quy trình đăng ký không cần thao tác.
Để tìm hiểu thêm về chương trình thiết lập tự động, hãy đọc thông tin tổng quan.
Điều kiện tiên quyết
Trước khi thêm tính năng đăng ký không chạm vào bảng điều khiển EMM, hãy xác nhận rằng giải pháp của bạn hỗ trợ những điều sau:
- Giải pháp EMM của bạn cần cung cấp một thiết bị Android 8.0+ (Pixel 7.1+) do công ty sở hữu ở chế độ được quản lý hoàn toàn. Bạn có thể thiết lập các thiết bị Android 10 trở lên do công ty sở hữu ở chế độ được quản lý hoàn toàn hoặc có hồ sơ công việc.
- Vì chương trình thiết lập tự động sẽ tự động tải xuống và cài đặt một DPC, nên DPC của bạn phải có trên Google Play. Chúng tôi duy trì danh sách các DPC tương thích mà quản trị viên CNTT có thể định cấu hình bằng cách sử dụ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 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. Một đại lý đố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ị của họ.
- Thiết bị phải tương thích với Dịch vụ di động của Google (GMS) và Dịch vụ Google Play phải luôn được bật để quy trình đăng ký không cần thao tác hoạt động đúng cách.
Gọi API
Người dùng bảng điều khiển của bạn (sử dụng Tài khoản Google) sẽ uỷ quyền các yêu cầu API của bạn cho API khách hàng. Quy trình này khác với quy trình uỷ quyền mà bạn thực hiện cho các API EMM khác. Hãy đọc phần 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.
Điều khoản dịch vụ về tên người dùng
Người dùng của bạn cần chấp nhận Điều khoản dịch vụ (ToS) mới nhất trước khi 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, hãy 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 đăng ký không cần tiếp xúc. Ví dụ dưới đây cho thấy một trong những cách bạn có thể thực hiện việc 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://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)
Nếu ứng dụng Google API hỗ trợ lỗi chi tiết (Java, Python hoặc yêu cầu HTTP), hãy thêm tiêu đề HTTP X-GOOG-API-FORMAT-VERSION có giá trị 2 vào các yêu cầu của bạn. Nếu máy khách 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 sẽ hướng người dùng chấp nhận lại Điều khoản dịch vụ mới.
Đường liên kết đến cổng thông tin
Quản trị viên CNTT sử dụng cổng đăng ký không cần thao tác để quản lý người dùng cho tổ chức của họ. 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ý các thiết bị và cấu hình bằng cách sử dụng cổng thông tin. Nếu bạn cần liên kết đến cổng thông tin này trong bảng điều khiển hoặc tài liệu của mình, hãy sử dụng URL sau:
https://enterprise.google.com/android/zero-touch/customers
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 của mình.
Đăng ký thiết bị
Thiết lập tự động là một cơ chế để đăng ký thiết bị và tương tự như đăng ký 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ó khả năng chạy ở chế độ thiết bị được quản lý hoàn toàn.
Chương trình thiết lập tự động có trên các thiết bị được hỗ trợ chạy Android 8.0 trở lên. Quản trị viên CNTT phải mua thiết bị được hỗ trợ từ một đại lý đối tác. Bảng điều khiển của bạn có thể theo dõi những thiết bị của quản trị viên CNTT có thể thiết lập tự động bằng cách gọi customers.devices.list.
Sau đây là thông tin tổng quan về cách đăng ký:
- Thiết bị sẽ đăng ký với một máy chủ của Google khi khởi động lần đầu (hoặc sau khi đặt lại về trạng thái ban đầu) để đăng ký không cần tương tác.
- Nếu quản trị viên CNTT đã áp dụng một cấu hình cho thiết bị, thì quy trình đăng ký không cần chạm sẽ chạy trình hướng dẫn thiết lập Android cho thiết bị do công ty quản lý hoàn toàn và cá nhân hoá các màn hình bằng siêu dữ liệu từ cấu hình.
- Tính năng đăng ký không cần chạm tải xuống và cài đặt DPC của bạn qua Google Play.
- DPC của bạn nhận được ý định
ACTION_PROVISION_MANAGED_DEVICEvà 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 có kết nối. Để tìm hiểu thêm về việc cung cấp thiết bị bằng chương trình thiết lập tự động, hãy xem phần Cung cấp bên dưới.
Cấu hình mặc định
Quy trình thiết lập tự động sẽ giúp ích nhiều nhất cho quản trị viên CNTT khi họ thiết lập một 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. Thúc đẩy việc 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. Bạn có thể kiểm tra giá trị của customers.configurations.isDefault để biết liệu một tổ chức có đặt cấu hình mặc định hay không.
Ví dụ dưới đây cho thấy cách bạn có thể đặt một cấu hình hiện có làm cấu hì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 dùng tên tài nguyên API customers.dpcs.name để xác định DPC và dùng tên này trong cấu hình. Tên tài nguyên chứa một giá trị nhận dạng duy nhất và không thay đổi cho DPC. Gọi customers.dpcs.list để lấy danh sách tất cả các DPC được hỗ trợ. Vì tên tài nguyên cũng bao gồm mã khách hàng, hãy lọc danh sách bằ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 thấy cách so khớp DPC và duy trì để sử dụng sau này trong một 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 cần hiện tên của một 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 để mang đến trải nghiệm người dùng tuyệt vời cho quá trình cung cấp thiết bị.
Bạn chỉ cần tên người dùng và mật khẩu để cung cấp thiết bị.
Xin lưu ý rằng đại lý có thể vận chuyển thiết bị trực tiếp cho người dùng ở xa. Đưa 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, vào customers.configuration.dpcExtras.
Đoạn mã JSON bên dưới 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\"]"
}
}
Tính năng thiết lập tự động sẽ cài đặt và khởi chạy DPC bằng một Ý định của Android.
Hệ thống sẽ gửi các giá trị trong thuộc tính JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE đến DPC của bạn dưới dạng các phần bổ sung trong ý định. DPC của bạn có thể đọc các chế độ cài đặt cấp phép từ PersistableBundle bằng cách sử dụng các khoá tương tự.
Nên dùng – sử dụng các phần bổ sung ý định sau để thiết lập DPC:
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLEEXTRA_PROVISIONING_LOCALEEXTRA_PROVISIONING_TIME_ZONEEXTRA_PROVISIONING_LOCAL_TIMEEXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLEDEXTRA_PROVISIONING_MAIN_COLOREXTRA_PROVISIONING_DISCLAIMERS
Không nên dùng – đừng thêm các phần bổ sung sau đây mà bạn có thể dùng trong các phương thức đăng ký khác:
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
Để 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 bài viết Cung cấp thiết bị cho khách hàng.
Phát triển và kiểm thử
Để phát triển và kiểm thử các tính năng đăng ký không cần thao tác của bảng điều khiển, bạn cần có những thứ sau:
- thiết bị được hỗ trợ
- tài khoản thiết lập tự động 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 thiết lập tự động, chẳng hạn như Google Pixel. Bạn không bắt buộc phải mua thiết bị phát triển của mình từ một đối tác đại lý.
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 thông tin thiết lập tự động. Gửi email cho chúng tôi từ địa chỉ email công ty được liên kết với một Tài khoản Google. 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 các thiết bị đó vào tài khoản phát triển của bạn.
Xin lưu ý rằng vì tính năng đăng ký không cần thao tác sẽ tự động tải xuống và cài đặt một DPC, nên DPC của bạn phải có trên Google Play thì bạn mới có thể kiểm thử quy trình cung cấp. Bạn không thể kiểm thử 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 bảng điều khiển hoặc tài liệu của mình, hãy xem bài viết Đăng ký không cần thao tác cho quản trị viên CNTT để được hướng dẫn. Bạn cũng có thể chuyển người dùng của bảng điều khiển đến bài viết đó trên trung tâm trợ giúp.
Tài liệu đọc thêm
Hãy đọc những tài liệu này để giúp bạn tích hợp tính năng đăng ký không cần thao tác trong bảng điều khiển:
- Chương trình thiết lập tự động dành cho quản trị viên CNTT trong phần Trợ giúp về Android dành cho doanh nghiệp.
- Cung cấp thiết bị cho khách hàng từ trang web của Nhà phát triển EMM Android.