คู่มือการผสานรวม EMM

คู่มือนี้ช่วยให้ผู้ให้บริการ Enterprise Mobility Management (EMM) สามารถผสานรวมการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มเข้ากับคอนโซลของตน อ่านต่อเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการลงทะเบียนและดูคำแนะนำแนวทางปฏิบัติแนะนำเพื่อช่วยจัดสรรอุปกรณ์ DPC (เครื่องมือควบคุมนโยบายด้านอุปกรณ์) หากคุณมี DPC คุณจะได้เรียนรู้ แนวทางปฏิบัติแนะนำในการจัดสรรอุปกรณ์ และรับคำแนะนำเพื่อช่วยในการพัฒนาและการทดสอบ

ฟีเจอร์สำหรับผู้ดูแลระบบไอที

ใช้ Customer API เพื่อช่วยผู้ดูแลระบบไอทีตั้งค่าการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มโดยตรงจากคอนโซลของคุณ งานที่ผู้ดูแลระบบไอทีอาจดำเนินการในคอนโซลของคุณมีดังนี้

  • สร้าง แก้ไข และลบการกำหนดค่าการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มตามนโยบายอุปกรณ์เคลื่อนที่
  • ตั้งค่าการกำหนดค่าเริ่มต้นเพื่อให้ DPC จัดสรรอุปกรณ์ในอนาคตที่องค์กรซื้อ
  • ใช้การกำหนดค่าส่วนบุคคลกับอุปกรณ์ หรือนำอุปกรณ์ออกจากการลงทะเบียนการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่ม

อ่านภาพรวมเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่ม

ข้อกำหนดเบื้องต้น

ก่อนเพิ่มการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มลงในคอนโซล EMM โปรดยืนยันว่าโซลูชันของคุณรองรับสิ่งต่อไปนี้

  • โซลูชัน EMM จะต้องจัดสรรอุปกรณ์ Android 8.0 ขึ้นไป (Pixel 7.1 ขึ้นไป) ของบริษัทในโหมดที่มีการจัดการครบวงจร อุปกรณ์ Android 10 ขึ้นไปของบริษัทสามารถจัดสรรเป็นจัดการครบวงจรหรือใช้กับโปรไฟล์งานก็ได้
  • การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มจะดาวน์โหลดและติดตั้ง DPC โดยอัตโนมัติ DPC ของคุณต้องพร้อมใช้งานจาก Google Play เราดูแลรายการ DPC ที่เข้ากันได้ซึ่งผู้ดูแลระบบไอทีสามารถกำหนดค่าโดยใช้ API ของลูกค้าหรือพอร์ทัลได้ ส่งคำขอแก้ไขผลิตภัณฑ์ผ่านชุมชนผู้ให้บริการ EMM เพื่อเพิ่ม DPC ของคุณลงในรายการ
  • ลูกค้าต้องมีบัญชีการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มเพื่อเรียกใช้ API ของลูกค้า โดยตัวแทนจำหน่ายที่เป็นพาร์ทเนอร์จะตั้งค่าบัญชีให้องค์กรของผู้ดูแลระบบไอทีเมื่อองค์กรซื้ออุปกรณ์ของตน
  • อุปกรณ์ต้องทำงานร่วมกับบริการของ Google Mobile (GMS) และบริการ Google Play ได้ตลอดเวลาเพื่อให้การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มทำงานได้อย่างถูกต้อง

เรียกใช้ API

ผู้ใช้คอนโซลของคุณ (โดยใช้บัญชี Google ของผู้ใช้) ให้สิทธิ์คำขอ API ของคุณไปยัง API ของลูกค้า ขั้นตอนนี้จะแตกต่างจากการให้สิทธิ์สำหรับ EMM API อื่นๆ อ่านการให้สิทธิ์ เพื่อดูวิธีดำเนินการนี้ในแอปของคุณ

ข้อกำหนดในการให้บริการของแฮนเดิล

ผู้ใช้ต้องยอมรับข้อกำหนดในการให้บริการล่าสุด (ToS) ก่อนเรียกใช้ 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://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 และอื่นๆ) ให้จับคู่ข้อความแสดงข้อผิดพลาด

เมื่อเราอัปเดตข้อกำหนดในการให้บริการในอนาคต หากคุณทำตามวิธีการนี้ แอปจะนำทางผู้ใช้ให้ยอมรับข้อกำหนดในการให้บริการใหม่อีกครั้ง

ผู้ดูแลระบบไอทีจะใช้พอร์ทัลการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มเพื่อจัดการผู้ใช้สำหรับองค์กร คุณจะเสนอการดำเนินการดังกล่าวผ่าน API ของลูกค้าไม่ได้ นอกจากนี้ ผู้ดูแลระบบไอทียังจัดการอุปกรณ์และการกำหนดค่าโดยใช้พอร์ทัลได้ด้วย หากต้องการลิงก์ไปยังพอร์ทัลจากคอนโซลหรือในเอกสาร ให้ใช้ URL นี้

https://partner.android.com/zerotouch

คุณอาจต้องแจ้งผู้ดูแลระบบไอทีว่าได้รับแจ้งให้ลงชื่อเข้าใช้ด้วยบัญชี Google ของตนเอง

การลงทะเบียนอุปกรณ์

การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มเป็นกลไกในการลงทะเบียนอุปกรณ์ และก็เหมือนกับการลงทะเบียน NFC หรือการลงทะเบียนคิวอาร์โค้ด คอนโซลต้องรองรับอุปกรณ์ที่มีการจัดการและ DPC ของคุณต้องทำงานได้ในโหมดอุปกรณ์ที่มีการจัดการครบวงจร

การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มใช้งานได้ในอุปกรณ์ที่รองรับซึ่งใช้ Android 8.0 ขึ้นไป ผู้ดูแลระบบไอทีต้องซื้ออุปกรณ์ที่รองรับจากตัวแทนจำหน่ายที่เป็นพาร์ทเนอร์ คอนโซลของคุณสามารถติดตามอุปกรณ์ของผู้ดูแลระบบไอทีที่พร้อมใช้การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มโดยโทรไปที่ customers.devices.list

ต่อไปนี้เป็นสรุปขั้นตอนการลงทะเบียน

  1. อุปกรณ์จะตรวจสอบกับเซิร์ฟเวอร์ของ Google เมื่อเริ่มต้นระบบครั้งแรก (หรือหลังจากรีเซ็ตเป็นค่าเริ่มต้น) สำหรับการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่ม
  2. หากผู้ดูแลระบบไอทีใช้การกำหนดค่ากับอุปกรณ์ การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มจะเรียกใช้วิซาร์ดการตั้งค่า Android ของอุปกรณ์ที่มีการจัดการครบวงจรและปรับเปลี่ยนหน้าจอในแบบของคุณด้วยข้อมูลเมตาจากการกำหนดค่า
  3. การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มจะดาวน์โหลดและติดตั้ง DPC จาก Google Play
  4. DPC จะได้รับ Intent ของ 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()

การอ้างอิง DPC ของคุณ

เราขอแนะนำให้ใช้ชื่อทรัพยากร API customers.dpcs.name เพื่อระบุ DPC ของคุณและใช้ในการกำหนดค่า ชื่อทรัพยากรมีตัวระบุ ที่ไม่ซ้ำกันและไม่มีการเปลี่ยนแปลงสำหรับ DPC โปรดโทร customers.dpcs.list เพื่อดูรายการ DPC ที่รองรับทั้งหมด เนื่องจากชื่อทรัพยากรมีรหัสลูกค้าด้วย โปรดกรองรายการโดยใช้คอมโพเนนต์เส้นทางสุดท้ายเพื่อค้นหาอินสแตนซ์ Dpc ที่ตรงกัน ตัวอย่างด้านล่างแสดงวิธีจับคู่ 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...

หากต้องแสดงชื่อของ 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\"]"
    }
}

การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มจะติดตั้งและเปิดใช้ DPC โดยใช้ Android Intent ระบบจะส่งค่าในพร็อพเพอร์ตี้ JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE ไปยัง DPC เป็นส่วนเสริมใน Intent DPC จะอ่านการตั้งค่าการจัดสรรจาก PersistableBundle ได้โดยใช้คีย์เดียวกัน

แนะนำ - ใช้เครื่องมือเพิ่มเติมของ Intent ต่อไปนี้ เพื่อตั้งค่า DPC

ไม่แนะนำ อย่าใส่ส่วนเสริมต่อไปนี้ที่คุณอาจใช้ในวิธีการลงทะเบียนอื่นๆ

หากต้องการดูวิธีดึงข้อมูลและใช้การตั้งค่าเหล่านี้ใน DPC โปรดอ่านการจัดสรรอุปกรณ์ของลูกค้า

การพัฒนาและการทดสอบ

หากต้องการพัฒนาและทดสอบฟีเจอร์การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มของคอนโซล คุณจะต้องมีสิ่งต่อไปนี้

  • อุปกรณ์ที่รองรับ
  • บัญชีการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มของลูกค้า

พัฒนาและทดสอบกับอุปกรณ์ที่รองรับการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่ม เช่น Google Pixel คุณไม่จำเป็นต้องซื้ออุปกรณ์การพัฒนาจากพาร์ทเนอร์ตัวแทนจำหน่าย

ติดต่อเราเพื่อรับบัญชีลูกค้าทดสอบและการเข้าถึงพอร์ทัลการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่ม ส่งอีเมลถึงเราจากที่อยู่อีเมลบริษัทที่เชื่อมโยงกับบัญชี Google แจ้งหมายเลขผู้ผลิตและหมายเลข IMEI ของอุปกรณ์ 1 หรือ 2 เครื่อง แล้วเราจะเพิ่มลงในบัญชีการพัฒนาของคุณ

โปรดทราบว่าการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มจะดาวน์โหลดและติดตั้ง DPC โดยอัตโนมัติ DPC ของคุณจะต้องพร้อมใช้งานจาก Google Play ก่อน คุณจึงจะทดสอบการจัดสรรได้ คุณทดสอบกับ DPC เวอร์ชันพัฒนาไม่ได้

การสนับสนุนสำหรับผู้ดูแลระบบไอที

หากต้องการช่วยผู้ดูแลระบบไอทีในอินเทอร์เฟซของคอนโซลหรือเอกสารของคุณเอง โปรดดูคำแนะนำที่การตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มสำหรับผู้ดูแลระบบไอที นอกจากนี้ คุณยังสามารถนำผู้ใช้คอนโซลไปยังบทความในศูนย์ช่วยเหลือได้ด้วย

อ่านเพิ่มเติม

อ่านเอกสารเหล่านี้เพื่อช่วยผสานรวมการตั้งค่าอุปกรณ์พร้อมใช้แบบรวมกลุ่มในคอนโซลของคุณ