دليل دمج إدارة الخدمات الجوّالة للمؤسسات (EMM)

يساعد هذا الدليل موفّري إدارة الخدمات الجوّالة للمؤسسات (EMM) على دمج إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة في وحدة تحكّمهم. ما عليك سوى مواصلة القراءة لمعرفة المزيد حول التسجيل والاطّلاع على أفضل الممارسات لمساعدة وحدة التحكّم بسياسة الجهاز (DPC) على توفير الأجهزة. إذا كان لديك وحدة التحكّم بسياسة الجهاز (DPC)، فستتعلم أفضل الممارسات عند توفير الأجهزة، كما ستحصل على نصائح للمساعدة في التطوير والاختبار.

ميزات لمشرفي تكنولوجيا المعلومات

استخدِم واجهة برمجة تطبيقات العميل لمساعدة مشرفي تكنولوجيا المعلومات في إعداد برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" مباشرةً من وحدة التحكّم. في ما يلي بعض المهام التي قد يكملها مشرف تكنولوجيا المعلومات في وحدة التحكّم:

  • يمكنك إنشاء عمليات ضبط برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" وتعديلها وحذفها استنادًا إلى سياسات الأجهزة الجوّالة.
  • اضبط إعدادات تلقائية حتى تتمكّن وحدة التحكّم بسياسة الجهاز (DPC) من إدارة الأجهزة المستقبلية التي تشتريها المؤسسة.
  • يمكنك تطبيق عمليات ضبط فردية على الأجهزة أو إزالة الأجهزة من التسجيل في برنامج "إعداد الأجهزة الجوّالة للمؤسسات دفعةً واحدة".

للتعرّف على مزيد من المعلومات حول برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة"، يُرجى الاطّلاع على نظرة عامة.

المتطلبات الأساسية

قبل إضافة برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" إلى وحدة تحكّم إدارة الخدمات الجوّالة للمؤسسات (EMM)، تأكَّد من أنّ الحل يوفّر ما يلي:

  • يحتاج حل إدارة الخدمات الجوّالة للمؤسسات (EMM) إلى توفير جهاز مملوك للشركة يعمل بنظام التشغيل Android 8.0 (Pixel 7.1 والإصدارات الأحدث) في وضع الإدارة الكاملة. يمكن توفير أجهزة Android 10 والإصدارات الأحدث التي تملكها الشركة على أنّها مُدارة بالكامل أو تتضمّن ملفًا شخصيًا للعمل.
  • يجب أن تكون وحدة التحكّم بسياسة الجهاز متاحة من Google Play لأنّ برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" ينزِّل وحدة التحكّم بسياسة الجهاز ويثبّتها تلقائيًا. نحتفظ بقائمة بوحدات التحكّم بسياسة الجهاز المتوافقة التي يمكن لمشرفي تكنولوجيا المعلومات ضبطها باستخدام واجهة برمجة تطبيقات العميل أو البوابة. أرسِل طلب تعديل المنتج من خلال منتدى موفّري إدارة الخدمات الجوّالة للمؤسسات (EMM) لإضافة وحدة التحكّم بسياسة الجهاز (DPC) إلى القائمة.
  • يحتاج عملاؤك إلى حساب "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" للاتصال بواجهة برمجة تطبيقات العميل. يعمل مورِّد شريك على إعداد الحساب لمؤسسة مشرف تكنولوجيا المعلومات عند شراء المؤسسة لأجهزتها.
  • يجب أن يكون الجهاز متوافقًا مع خدمات Google للأجهزة الجوّالة (GMS) ويجب تفعيل "خدمات Google Play" في جميع الأوقات حتى يعمل برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" بشكل صحيح.

طلب بيانات من واجهة برمجة التطبيقات

يسمح مستخدمو وحدة التحكّم (باستخدام حساباتهم على Google) بتفويض طلبات البيانات من واجهة برمجة التطبيقات إلى واجهة برمجة تطبيقات العميل. يختلف هذا المسار عن التفويض الذي تنفّذه لواجهات برمجة تطبيقات إدارة الخدمات الجوّالة للمؤسسات الأخرى. اطّلِع على التفويض لمعرفة كيفية إجراء ذلك في تطبيقك.

التعامل مع بنود الخدمة

على المستخدمين قبول أحدث بنود الخدمة قبل إرسال طلب إلى واجهة برمجة التطبيقات. إذا عرض طلب البيانات من واجهة برمجة التطبيقات رمز حالة 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 يوفّر أخطاء تفصيلية (طلبات JavaScript أو Python أو HTTP)، يمكنك تضمين عنوان HTTP X-GOOG-API-FORMAT-VERSION مع القيمة 2 في طلباتك. إذا كان برنامجك لا يدعم الأخطاء التفصيلية (.NET وغيرها)، احرص على مطابقة رسالة الخطأ.

وعند تعديل "بنود الخدمة" في المستقبل، إذا اتّبعت هذه الطريقة، سيوجِّه تطبيقك المستخدم إلى إعادة قبولها.

يستخدم مشرفو تكنولوجيا المعلومات بوابة برنامج "إعداد الأجهزة الجوّالة للمؤسسات دفعةً واحدة" لإدارة المستخدمين في مؤسساتهم، ولا يمكنك تقديم ذلك من خلال واجهة برمجة تطبيقات العميل. يمكن لمشرفي تكنولوجيا المعلومات أيضًا إدارة الأجهزة وعمليات الضبط باستخدام البوابة. إذا كنت بحاجة إلى الربط بالبوابة من وحدة التحكم أو في مستنداتك، فاستخدم عنوان URL هذا:

https://partner.android.com/zerotouch

ننصحك بإعلام مشرفي تكنولوجيا المعلومات بأنّه سيُطلب منهم تسجيل الدخول باستخدام حساباتهم على Google.

تسجيل الجهاز

"إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" هو آلية لتسجيل الأجهزة وتشبه تسجيل NFC أو التسجيل باستخدام رمز الاستجابة السريعة. يجب أن تتوافق وحدة التحكّم مع الأجهزة المُدارة، ويجب أن تتمكّن وحدة التحكّم بسياسة الجهاز من العمل في وضع جهاز مُدار بالكامل.

يتوفّر برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" على الأجهزة المتوافقة التي تعمل بنظام التشغيل Android 8.0 أو إصدار أحدث. على مشرفي تكنولوجيا المعلومات شراء الأجهزة المتوافقة من مورِّد شريك. يمكن لوحدة التحكّم هذه تتبُّع الأجهزة الخاصة بمشرفي تكنولوجيا المعلومات المتاحة لبرنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" من خلال الاتصال على customers.devices.list.

في ما يلي مخطط حول آلية عمل التسجيل:

  1. يتحقّق الجهاز من عملية "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" باستخدام خادم Google عند بدء تشغيله لأول مرة (أو بعد إعادة الضبط على الإعدادات الأصلية).
  2. إذا طبَّق مشرف تكنولوجيا المعلومات عملية ضبط على الجهاز، يشغِّل التسجيل في برنامج "إعداد الأجهزة الجوّالة للمؤسسات دفعةً واحدة" معالج إعداد Android للجهاز المُدار بالكامل ويخصِّص الشاشات التي تتضمّن بيانات وصفية من الإعدادات.
  3. يعمل برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" على تنزيل وحدة التحكّم بسياسة الجهاز (DPC) وتثبيتها من Google Play.
  4. تتلقّى وحدة التحكّم بسياسة الجهاز (DPC) هدف 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()

الإشارة إلى وحدة التحكّم بسياسة الجهاز

نقترح عليك استخدام اسم مورد واجهة برمجة التطبيقات customers.dpcs.name لتحديد وحدة التحكّم بسياسة الجهاز واستخدامها في الإعدادات. يحتوي اسم المورد على معرّف فريد وغير متغير لوحدة التحكّم بسياسة الجهاز. يمكنك الاتصال بالرقم customers.dpcs.list للحصول على قائمة بجميع وحدات التحكّم بسياسة الجهاز المتوافقة. بما أنّ اسم المورد يتضمّن أيضًا الرقم التعريفي للعميل، يمكنك فلترة القائمة باستخدام مكوّن المسار الأخير للعثور على مثيل 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...

إذا كنت تريد عرض اسم وحدة التحكّم بسياسة الجهاز في واجهة مستخدم وحدة التحكّم، اعرض القيمة التي تم عرضها من الرمز 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 Intent. يرسل النظام قيم سمة JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE إلى وحدة التحكّم بسياسة الجهاز (DPC) كميزات إضافية في الغرض. يمكن لوحدة التحكّم بسياسة الجهاز قراءة إعدادات توفير المتطلبات اللازمة من PersistableBundle باستخدام المفاتيح نفسها.

إجراء مقترَح: يمكنك استخدام العناصر الإضافية التالية لإعداد وحدة التحكّم بسياسة الجهاز:

إجراء لا يُنصَح به - لا تُدرِج الميزات الإضافية التالية التي قد تستخدمها في طرق تسجيل أخرى:

لمعرفة كيفية استخراج هذه الإعدادات واستخدامها في وحدة التحكّم بسياسة الجهاز، يُرجى الاطّلاع على المقالة توفير أجهزة العملاء.

التطوير والاختبار

لتطوير ميزات "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" في وحدة التحكّم واختبارها، ستحتاج إلى ما يلي:

  • جهاز متوافق
  • حساب عميل برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة"

تطوير التطبيق واختباره باستخدام الأجهزة التي تتيح إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة، مثل Google Pixel. لا يلزمك شراء أجهزة التطوير من شريك مورّد.

تواصَل معنا للحصول على حساب عميل تجريبي والوصول إلى بوابة "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة". يمكنك إرسال رسالة إلكترونية إلينا من عنوان البريد الإلكتروني لشركتك المرتبط بحساب Google. أخبِرنا بالشركة المصنّعة ورقم IMEI لجهاز واحد أو جهازين وسنضيفهما إلى حساب التطوير.

تجدر الإشارة إلى أنّ برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" ينزِّل وحدة التحكّم بسياسة الجهاز ويثبّتها تلقائيًا، ويجب أن يكون وحدة التحكّم بسياسة الجهاز متاحة من Google Play قبل أن تتمكن من اختبار إدارة الحسابات. لا يمكنك إجراء اختبار باستخدام إصدار تطوير من وحدة التحكّم بسياسة الجهاز.

الدعم لمشرفي تكنولوجيا المعلومات

إذا كنت بحاجة إلى مساعدة مشرفي تكنولوجيا المعلومات في واجهة وحدة التحكّم أو مستنداتك، يُرجى الاطّلاع على مقالة إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة لمشرفي تكنولوجيا المعلومات للحصول على إرشادات. يمكنك أيضًا توجيه مستخدمي وحدة التحكم إلى مقالة مركز المساعدة تلك.

محتوى إضافي للقراءة

اقرأ هذه المستندات لمساعدتك في دمج برنامج "إعداد الأجهزة الجوّالة للمؤسّسات دفعةً واحدة" في وحدة التحكّم: