راهنمای ادغام EMM

این راهنما به ارائه‌دهندگان مدیریت تحرک سازمانی (EMM) کمک می‌کند تا ثبت‌نام بدون تماس را در کنسول خود ادغام کنند. برای کسب اطلاعات بیشتر در مورد ثبت‌نام و مشاهده بهترین توصیه‌ها برای کمک به DPC (کنترل‌کننده سیاست دستگاه) خود در زمینه تأمین دستگاه‌هایتان، به خواندن ادامه دهید. اگر DPC دارید، بهترین شیوه‌ها را هنگام تأمین دستگاه‌ها یاد خواهید گرفت و برای کمک به توسعه و آزمایش، توصیه‌هایی دریافت خواهید کرد.

ویژگی‌های مدیران فناوری اطلاعات

از API مشتری برای کمک به مدیران فناوری اطلاعات در راه‌اندازی ثبت‌نام بدون تماس (zero-touch registration) مستقیماً از کنسول خود استفاده کنید. در اینجا برخی از کارهایی که یک مدیر فناوری اطلاعات ممکن است در کنسول شما انجام دهد، آورده شده است:

  • پیکربندی‌های ثبت‌نام بدون نیاز به لمس را بر اساس سیاست‌های تلفن همراه خود ایجاد، ویرایش و حذف کنید.
  • یک پیکربندی پیش‌فرض تنظیم کنید تا DPC شما، دستگاه‌های آینده‌ای را که سازمان خریداری می‌کند، تأمین کند.
  • تنظیمات فردی را روی دستگاه‌ها اعمال کنید یا دستگاه‌ها را از ثبت بدون تماس حذف کنید.

برای کسب اطلاعات بیشتر در مورد ثبت نام بدون تماس، مرور کلی را مطالعه کنید.

پیش‌نیازها

قبل از اینکه ثبت‌نام بدون تماس (zero-touch registration) را به کنسول EMM خود اضافه کنید، مطمئن شوید که راهکار شما از موارد زیر پشتیبانی می‌کند:

  • راهکار EMM شما باید یک دستگاه اندروید ۸.۰+ (پیکسل ۷.۱+) متعلق به شرکت را در حالت کاملاً مدیریت‌شده ارائه دهد. دستگاه‌های اندروید ۱۰+ متعلق به شرکت را می‌توان به صورت کاملاً مدیریت‌شده یا با نمایه کاری ارائه داد.
  • از آنجا که ثبت‌نام بدون تماس (zero-touch registration) به طور خودکار یک DPC را دانلود و نصب می‌کند، DPC شما باید از Google Play در دسترس باشد. ما فهرستی از DPCهای سازگار را نگهداری می‌کنیم که مدیران فناوری اطلاعات می‌توانند با استفاده از API مشتری یا پورتال پیکربندی کنند. برای افزودن DPC خود به لیست، درخواست اصلاح محصول را از طریق انجمن ارائه‌دهندگان EMM ارسال کنید.
  • مشتریان شما برای تماس با API مشتری به یک حساب کاربری ثبت‌نام بدون تماس نیاز دارند. یک فروشنده همکار، این حساب کاربری را برای یک سازمان مدیر فناوری اطلاعات، زمانی که سازمان دستگاه‌های آنها را خریداری می‌کند، راه‌اندازی می‌کند.
  • برای عملکرد صحیح ثبت بدون تماس، دستگاه باید با سرویس‌های موبایل گوگل (GMS) سازگار باشد و سرویس‌های گوگل پلی باید همیشه فعال باشند.

فراخوانی API

کاربران کنسول شما (با استفاده از حساب گوگل خود) درخواست‌های API شما را به API مشتری تأیید می‌کنند. این جریان با تأییدی که برای سایر APIهای EMM انجام می‌دهید متفاوت است. برای یادگیری نحوه انجام این کار در برنامه خود، بخش «مجوز» را مطالعه کنید.

مدیریت شرایط خدمات

کاربران شما قبل از فراخوانی API باید آخرین شرایط خدمات (ToS) را بپذیرند . اگر فراخوانی API کد وضعیت HTTP 403 Forbidden را برگرداند و بدنه پاسخ حاوی TosError باشد، از کاربر بخواهید با ورود به پورتال ثبت نام بدون تماس (zero-touch registration portal) شرایط خدمات (ToS) را بپذیرد. مثال زیر یکی از راه‌های انجام این کار را نشان می‌دهد:

جاوا

// 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;
}

دات نت

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

پایتون

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

اگر کلاینت Google API شما از خطاهای جزئی (درخواست‌های جاوا، پایتون یا HTTP) پشتیبانی می‌کند، هدر HTTP X-GOOG-API-FORMAT-VERSION را با مقدار 2 در درخواست‌های خود وارد کنید. اگر کلاینت شما از خطاهای جزئی (.NET و سایر موارد) پشتیبانی نمی‌کند، پیام خطا را مطابقت دهید.

وقتی در آینده شرایط خدمات را به‌روزرسانی کنیم، اگر از این رویکرد پیروی کنید، برنامه شما کاربر را به پذیرش مجدد شرایط خدمات جدید هدایت می‌کند.

مدیران فناوری اطلاعات از پورتال ثبت‌نام بدون تماس برای مدیریت کاربران سازمان خود استفاده می‌کنند - شما نمی‌توانید این را از طریق API مشتری ارائه دهید. مدیران فناوری اطلاعات همچنین می‌توانند دستگاه‌ها و پیکربندی‌ها را با استفاده از پورتال مدیریت کنند. اگر نیاز دارید از کنسول یا در مستندات خود به پورتال لینک دهید، از این URL استفاده کنید:

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

شاید بخواهید به مدیران فناوری اطلاعات اطلاع دهید که از آنها خواسته شده است با حساب Google خود وارد سیستم شوند.

ثبت نام دستگاه

ثبت نام بدون تماس (Zero-touch registration) مکانیزمی برای ثبت نام دستگاه‌ها است و مانند ثبت نام NFC یا ثبت نام QR-code عمل می‌کند. کنسول شما باید از دستگاه‌های مدیریت شده پشتیبانی کند و DPC شما باید بتواند در حالت دستگاه کاملاً مدیریت شده اجرا شود.

ثبت نام بدون تماس (Zero-touch registration) در دستگاه‌های پشتیبانی شده با اندروید ۸.۰ یا بالاتر در دسترس است. مدیران فناوری اطلاعات باید دستگاه‌های پشتیبانی شده را از یک فروشنده همکار خریداری کنند. کنسول شما می‌تواند با فراخوانی customers.devices.list پیگیری کند که کدام یک از دستگاه‌های مدیر فناوری اطلاعات برای ثبت نام بدون تماس در دسترس هستند.

در اینجا خلاصه‌ای از نحوه ثبت نام ارائه شده است:

  1. یک دستگاه در اولین راه‌اندازی (یا پس از تنظیم مجدد کارخانه) برای ثبت‌نام بدون تماس، با سرور گوگل ارتباط برقرار می‌کند.
  2. اگر مدیر فناوری اطلاعات پیکربندی را روی دستگاه اعمال کرده باشد، ثبت بدون تماس، ویزارد راه‌اندازی اندروید دستگاه را که کاملاً مدیریت شده است، اجرا می‌کند و صفحات را با فراداده‌های پیکربندی، شخصی‌سازی می‌کند.
  3. ثبت‌نام بدون تماس، DPC شما را از گوگل پلی دانلود و نصب می‌کند.
  4. DPC شما، هدف ACTION_PROVISION_MANAGED_DEVICE را دریافت کرده و دستگاه را آماده می‌کند.

اگر اتصال اینترنت وجود نداشته باشد، بررسی زمانی انجام می‌شود که اتصالی در دسترس قرار گیرد. برای کسب اطلاعات بیشتر در مورد تأمین دستگاه با ثبت‌نام بدون تماس، به بخش تأمین در زیر مراجعه کنید.

پیکربندی‌های پیش‌فرض

ثبت‌نام بدون تماس (Zero-Touch Registration) بیشترین کمک را به مدیران فناوری اطلاعات می‌کند، زمانی که آنها یک پیکربندی پیش‌فرض تنظیم می‌کنند که روی هر دستگاه جدیدی که سازمانشان خریداری می‌کند اعمال می‌شود. اگر پیکربندی پیش‌فرضی تنظیم نشده است، آن را از کنسول خود فعال کنید. می‌توانید مقدار 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();

دات نت

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

پایتون

# 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 است. برای دریافت لیست تمام DPCهای پشتیبانی شده، customers.dpcs.list را فراخوانی کنید. از آنجا که نام منبع شامل شناسه مشتری نیز می‌شود، لیست را با استفاده از آخرین مؤلفه مسیر فیلتر کنید تا یک نمونه 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...

دات نت

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

پایتون

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

ثبت نام بدون تماس (Zero-touch registration) با استفاده از یک Android Intent، DPC شما را نصب و اجرا می‌کند. سیستم مقادیر موجود در ویژگی android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE JSON را به عنوان موارد اضافی در intent به DPC شما ارسال می‌کند. DPC شما می‌تواند تنظیمات تأمین را از PersistableBundle با استفاده از همان کلیدها بخواند.

توصیه می‌شود - از موارد اضافی زیر برای تنظیم DPC خود استفاده کنید:

توصیه نمی‌شود - موارد اضافی زیر را که ممکن است در سایر روش‌های ثبت‌نام استفاده کنید، لحاظ نکنید:

برای یادگیری نحوه استخراج و استفاده از این تنظیمات در DPC خود، بخش «دستگاه‌های مشتری Provision» را مطالعه کنید.

توسعه و آزمایش

برای توسعه و آزمایش ویژگی‌های ثبت‌نام بدون نیاز به لمس کنسول خود، به موارد زیر نیاز دارید:

  • یک دستگاه پشتیبانی شده
  • حساب ثبت نام بدون تماس مشتری

با دستگاه‌هایی که از ثبت‌نام بدون تماس پشتیبانی می‌کنند ، مانند Google Pixel، توسعه و آزمایش کنید. لازم نیست دستگاه‌های توسعه خود را از یک شریک فروشنده خریداری کنید.

برای دریافت یک حساب کاربری آزمایشی و دسترسی به پورتال ثبت نام بدون تماس با ما تماس بگیرید . از آدرس ایمیل شرکتی خود که با یک حساب گوگل مرتبط است، به ما ایمیل بزنید. سازنده و شماره IMEI یک یا دو دستگاه را به ما بگویید تا آنها را به حساب توسعه شما اضافه کنیم.

به یاد داشته باشید، از آنجا که ثبت‌نام بدون تماس (zero-touch registration) به طور خودکار یک DPC را دانلود و نصب می‌کند، DPC شما باید قبل از اینکه بتوانید آماده‌سازی را آزمایش کنید، از Google Play در دسترس باشد. شما نمی‌توانید با نسخه در حال توسعه DPC خود آزمایش کنید.

پشتیبانی از مدیران فناوری اطلاعات

اگر نیاز دارید که در رابط کاربری کنسول یا مستندات خود به مدیران فناوری اطلاعات کمک کنید، برای راهنمایی به ثبت نام بدون تماس برای مدیران فناوری اطلاعات مراجعه کنید. همچنین می‌توانید کاربران کنسول خود را به آن مقاله مرکز راهنما هدایت کنید.

مطالعه بیشتر

برای کمک به ادغام ثبت‌نام بدون تماس در کنسول خود، این اسناد را مطالعه کنید: