מדריך לשילוב EMM

המדריך הזה יעזור לספקים לניהול ניידות ארגונית (EMM) לשלב את השילוב הם נרשמים דרך המסוף דרך הארגון. בהמשך מופיע מידע נוסף על הרשמה ועצות לשיטות מומלצות לעזור להקצאת מכשירים לבקרת מדיניות המכשירים (DPC). אם יש לכם בקר DPC, נלמד שיטות מומלצות בתהליך הקצאת מכשירים ומקבלים עצות לעזרה עם פיתוח ובדיקה.

תכונות לאדמינים ב-IT

שימוש ב-Customer API כדי לעזור לאדמינים ב-IT להגדיר הרשמה דרך הארגון ישירות מ: במסוף. הנה כמה משימות שאדמין ב-IT יכול לבצע במסוף שלך:

  • יצירה, עריכה ומחיקה של הגדרות הרשמה דרך הארגון על סמך המדיניות לנייד.
  • קובעים הגדרות ברירת מחדל כדי שה-DPC יקצה מכשירים עתידיים רכישות של הארגון.
  • אפשר להחיל הגדרות אישיות מסוימות על מכשירים או להסיר מכשירים דרך הארגון ללא מגע להרשמה לקראת השקת אפליקציה.

למידע נוסף על הרשמה דרך הארגון, אפשר לקרוא את סקירה כללית.

דרישות מוקדמות

לפני הוספת הרשמה דרך הארגון למסוף ה-EMM, עליך לאשר את בפתרון הזה:

  • בפתרון ה-EMM שלך צריך להקצות מכשיר Android מגרסה 8.0 ואילך בבעלות החברה (Pixel 7.1 ואילך) המכשיר במצב מנוהל באופן מלא. מכשירי Android 10+ בבעלות החברה יכולים להיות מוקצה כמנוהל במלואו או באמצעות פרופיל עבודה.
  • ההרשמה דרך הארגון מורידה ומתקינה באופן אוטומטי בקר DPC, בקר DPC צריך להיות זמין מ-Google Play. יש לנו רשימה של בקרי DPC תואמים שאדמינים ב-IT יכולים להגדיר באמצעות ה-API ללקוח או הפורטל. לשלוח בקשה לשינוי מוצר דרך קהילת ספקי ה-EMM כדי להוסיף את בקר ה-DPC לרשימה.
  • כדי שהלקוחות שלך יוכלו לקרוא ל-API של הלקוח, הם צריכים חשבון בהרשמה דרך הארגון. מפיץ שותף מגדיר את החשבון לארגון של אדמין ב-IT כאשר: אנשים רוכשים את המכשירים שלהם.
  • המכשיר חייב להיות תואם לשירות Google Mobile Services (GMS) צריך להפעיל את Google Play Services כל הזמן כדי להירשם דרך הארגון כדי לפעול כראוי.

שליחת קריאה ל-API

משתמשי המסוף שלך (באמצעות חשבון Google שלהם) מאשרים את בקשות ה-API שלך ל ממשק ה-API ללקוח. התהליך הזה שונה מההרשאה שאליה מבצעים את הפעולה ממשקי API אחרים של EMM. כדי ללמוד איך לעשות זאת באפליקציה, ניתן לקרוא את המאמר הרשאה.

התנאים וההגבלות של הכינוי

המשתמשים שלך צריכים לאשר את התנאים וההגבלות העדכניים (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 ו- אחרים), מתאימים את הודעת השגיאה.

אם נעדכן את התנאים וההגבלות בעתיד, אם תקפידו על הגישה הזו, האפליקציה שלכם שמפנה את המשתמש לאישור מחדש של התנאים וההגבלות החדשים.

אדמינים ב-IT משתמשים בפורטל ההרשמה דרך הארגון כדי לנהל את המשתמשים עבור ארגון - לא תוכלו להציע זאת דרך ממשק ה-API של הלקוח. אדמינים ב-IT יכולים גם לנהל מכשירים והגדרות אישיות באמצעות הפורטל. אם צריך לקשר אל מהמסוף או בתיעוד שלכם, צריך להשתמש בכתובת ה-URL הבאה:

https://partner.android.com/zerotouch

כדאי להודיע לאדמינים ב-IT שהם מתבקשים להיכנס לחשבון חשבון Google.

צירוף מכשיר לתוכנית

הרשמה דרך הארגון היא מנגנון לרישום מכשירים, והוא כמו NFC הרשמה או רישום באמצעות קוד QR. המסוף צריך לתמוך במכשירים מנוהלים ושה-DPC צריך להיות מסוגל לפעול במצב מכשיר מנוהל.

הרשמה דרך הארגון זמינה במכשירים נתמכים עם Android 8.0 או מאוחר יותר. מנהלי IT ב-IT צריכים לרכוש מכשירים נתמכים משותף של מכשירים נתמכים מפיץ. המסוף שלך יכול לעקוב אילו מהמכשירים של האדמין ב-IT זמינים להרשמה דרך הארגון, עד התקשרות אל customers.devices.list.

בהמשך מוסבר איך מתבצע הרישום:

  1. מכשיר מבצע בדיקה באמצעות שרת של Google בהפעלה הראשונה (או לאחר הפעלת היצרן) איפוס) להרשמה דרך הארגון.
  2. אם האדמין ב-IT החיל הגדרות אישיות על המכשיר, דרך הארגון הרישום מפעיל את אשף ההגדרה של Android למכשיר המנוהל ומתאים אישית מסכים עם מטא-נתונים מהתצורה.
  3. הרשמה דרך הארגון מורידה ומתקין את ה-DPC מ-Google Play.
  4. בקר ה-DPC מקבל כוונת רכישה ACTION_PROVISION_MANAGED_DEVICE וגם מקצה את המכשיר.

אם אין חיבור לאינטרנט, הבדיקה תתבצע כשיתבצע חיבור זמינים. למידע נוסף על הקצאת מכשירים באמצעות הרשמה דרך הארגון, תוכלו לקרוא בהמשך בקטע אספקה.

הגדרות ברירת המחדל

הרשמה דרך הארגון עוזרת לרוב לאדמינים ב-IT כשהם קובעים הגדרות ברירת מחדל שמוחל על כל מכשיר חדש שהארגון רכש. ההגדרה לקידום הגדרות ברירת מחדל מהמסוף, אם לא מוגדרת. אפשר לבדוק את הערך של 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.

ניהול הקצאות (Provisioning)

נצלו את ההזדמנות כדי לספק חוויית משתמש מעולה להקצאת מכשירים. שם משתמש וסיסמה צריכים להיות כל מה שצריך כדי להקצות את המכשיר. חשוב לזכור: מפיצים עשויים לשלוח מכשירים ישירות למשתמשים מרוחקים. כלול כל שאר ההגדרות, כגון שרת 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 באמצעות Intent של Android. המערכת שולחת את הערכים נכס JSON אחד (android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE) ל-DPC בתור תוספות במסגרת כוונה. ה-DPC יכול לקרוא את הגדרות ניהול התצורה בעזרת PersistableBundle באמצעות אותם מקשים.

מומלץ – השתמשו בתוספות הבאות של Intent כדי להגדיר את ה-DPC:

לא מומלץ – אין לכלול את הפריטים הבאים תוספות שאפשר להשתמש בהן בשיטות רישום אחרות:

כדי ללמוד איך לחלץ את ההגדרות האלה ולהשתמש בהן בבקר ה-DPC, אפשר לקרוא את המאמר הקצאה המכשירים של הלקוחות.

פיתוח ובדיקה

כדי לפתח ולבדוק את תכונות ההרשמה דרך הארגון: הבאים:

  • מכשיר נתמך
  • חשבון בהרשמה דרך הארגון של לקוח

פיתוח ובדיקה באמצעות מכשירים שתומכים ב'ללא מגע' הרשמה, כמו Google Pixel. לא חייבים לרכוש את מכשירי הפיתוח שלך משותף של מפיץ.

צרו איתנו קשר כדי לקבל חשבון לקוח לבדיקה וגישה אל פורטל ההרשמה דרך הארגון. שולחים לנו אימייל מכתובת האימייל העסקית משויך לחשבון Google חשבון. מציינים את היצרן ואת מספר ה-IMEI של מכשיר אחד או שניים, ואנחנו נוסיף אותם חשבון.

חשוב לזכור, מאחר שהרשמה דרך הארגון מורידה ומתקינה באופן אוטומטי בקר DPC, בקר ה-DPC צריך להיות זמין ב-Google Play כדי שאפשר יהיה לבדוק הקצאה. אי אפשר לבצע בדיקה בגרסת פיתוח של בקר ה-DPC.

תמיכה לאדמינים ב-IT

אם אתם צריכים לעזור לאדמינים ב-IT בממשק של המסוף או במסמכים, אפשר לקבל הנחיות במאמר הרשמה דרך הארגון לאדמינים ב-IT. שלך יכול גם להפנות את משתמשי המסוף למאמר הזה במרכז העזרה.

קריאה נוספת

קראו את המסמכים האלה כדי לעזור לכם לשלב הרשמה דרך הארגון המסוף: