安全性

本指南的功能說明瞭可進行的安全性管理功能。 正確導入裝置政策控制器 (DPC) 應用程式中。這份文件 包含程式碼範例,您也可以使用 Test DPC 應用程式 Android 企業功能的程式碼範例。

DPC 應用程式可在個人裝置或裝置擁有者的設定檔擁有者模式下執行 模式。下表列舉了各項功能提供的功能 DPC 以設定檔擁有者模式或裝置擁有者模式執行時:

功能 設定檔擁有者 裝置擁有者
停用應用程式存取權
封鎖來源不明的應用程式
限制 Google Play 帳戶
啟用企業專用恢復原廠設定保護機制
監控企業程序記錄和遠端錯誤報告
授予及移除用戶端憑證的存取權
重設安全密碼
工作資料夾安全性驗證問題

停用應用程式存取權

適合想禁止員工玩遊戲或觀看遊戲的機構 在一天中的特定時段使用 Android 裝置播放 YouTube 影片 DPC 可能會暫時停用應用程式的存取權

如要停用應用程式存取權,請在裝置擁有者或設定檔擁有者模式下執行 DPC 設定 setPackagesSuspended(),選取的應用程式會假設 停用時 (Google 啟動器應用程式會顯示為灰色)。使用者輕觸應用程式後 畫面上會顯示系統對話方塊,說明應用程式已暫停。

應用程式遭到停權後,就無法啟動活動,且會通知 套件遭到抑制。遭停權的套件不會顯示在總覽頁面 ,則無法顯示對話方塊 (包括浮動式訊息和 Snackbar),而且 無法播放音訊或裝置震動。

啟動器會呼叫 isPackageSuspended() 方法,增加圍繞地圖邊緣的邊框間距。進一步瞭解如何設定應用程式 請參閱 setPackagesSuspended

封鎖來源不明的應用程式

應用程式不是透過 Google Play (或其他信任的應用程式商店) 安裝 稱為「來源不明應用程式」。裝置和資料的風險可能增加 安裝這類應用程式時

為避免有人安裝來源不明的應用程式, 全代管裝置和工作資料夾都能將 DISALLOW_INSTALL_UNKNOWN_SOURCES 使用者限制。

工作資料夾裝置通用限制

工作資料夾管理員新增 DISALLOW_INSTALL_UNKNOWN_SOURCES 後, 這項限制僅適用於工作資料夾。不過,工作團隊 設定檔可以設定 受管理設定。裝置通用限制為 適用於 Android 8.0 以上版本,只要安裝 Google Play 應用程式即可 80812500 以上版本。

如要限制只能在 Google Play 安裝應用程式,請按照下列步驟操作:

  1. 為 Google Play 套件設定受管理設定套件 com.android.vending
  2. 在組合中,請為 verify_apps:device_wide_unknown_source_block 金鑰。
  3. 新增 ENSURE_VERIFY_APPS 使用者限制。

以下範例說明如何檢查 Google Play 是否支援這項功能 ,然後將值設為 true

Kotlin

internal val DEVICE_WIDE_UNKNOWN_SOURCES = "verify_apps:device_wide_unknown_source_block"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
var existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS)
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES)

Java

static final String DEVICE_WIDE_UNKNOWN_SOURCES =
    "verify_apps:device_wide_unknown_source_block";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Add the setting to Google Play's existing managed config. Supported in
// Google Play version 80812500 or higher--older versions ignore unsupported
// settings.
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DEVICE_WIDE_UNKNOWN_SOURCES, true);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

// Make sure that Google Play Protect verifies apps.
dpm.addUserRestriction(adminName, UserManager.ENSURE_VERIFY_APPS);
dpm.addUserRestriction(adminName, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);

系統設定中的使用者介面仍然有效,但系統封鎖 應用程式安裝。這項限制會影響日後安裝項目, 已安裝的應用程式仍會保留在裝置上。裝置使用者仍可繼續安裝應用程式 然後透過 Android Debug Bridge (ADB) 連線至個人設定檔。

如要進一步瞭解不明來源,請參閱「其他發行方式」 選項

在 Google Play 中限制帳戶

機構有時會想允許使用者新增個人 Google 帳戶 (例如讀取 Gmail 中的郵件),但不想要個人 安裝應用程式。DPC 可以設定可供使用者使用的帳戶清單 Google Play。

全代管裝置或工作資料夾的管理員元件,可能會限制 調整 Google Play 的受管理設定。帳戶 安裝的 Google Play 應用程式版本為 80970100,才能使用限制 或更高版本。

如要限制 Google Play 帳戶使用範圍,請按照下列步驟操作:

  1. 為 Google Play 套件設定受管理設定套件 com.android.vending
  2. 在套裝組合中,輸入以半形逗號分隔的電子郵件地址,做為以下項目的字串值: allowed_accounts 鍵。

以下範例說明如何限制帳戶:

Kotlin

internal val ALLOWED_ACCOUNTS = "allowed_accounts"
internal val GOOGLE_PLAY_APK = "com.android.vending"

// ...

// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
val googleAccounts = "ali@gmail.com,ali.connors@example.com"

// Supported in Google Play version 80970100 or higher.
val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

Java

static final String ALLOWED_ACCOUNTS = "allowed_accounts";
static final String GOOGLE_PLAY_APK = "com.android.vending";

// ...


// Limit Google Play to one work and one personal account. Use
// a comma-separated list of account email addresses (usernames).
String googleAccounts = "ali@gmail.com,ali.connors@example.com";

// Supported in Google Play version 80970100 or higher.
Bundle existingConfig =
    dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putString(ALLOWED_ACCOUNTS, googleAccounts);
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

如果只想透過公司帳戶使用 Google Play,請將 allowed_accounts 設為 單一客戶帳戶。一個 空白字串可防止使用者在 Google Play 中使用任何帳戶。

啟用企業專用恢復原廠設定保護機制

透過企業專用恢復原廠設定保護機制,機構可以指定 Google 帳戶可以佈建已恢復原廠設定的裝置。

消費者恢復原廠設定的保護機制,可防止裝置遭竊。之前 允許任何人在未獲授權的恢復原廠設定後佈建裝置 (例如 就像使用 EMM),設定精靈會要求使用者進行所有連線驗證 先前儲存在裝置個人資料夾中的 Google 帳戶。

在企業環境中,恢復原廠設定是管理基礎架構的重要工具 員工離開機構時使用的員工裝置。不過, 機構不知道員工的帳戶憑證, 恢復原廠設定 防護功能可阻擋機構將裝置核發給其他裝置的能力 員工

控管恢復原廠設定後的佈建設定

在裝置擁有者模式下執行時,DPC 可使用 按 setFactoryResetProtectionPolicy() 可控管要啟用的帳戶 授權可在恢復原廠設定後佈建裝置。如果這項設定 已設為「null」或設為空白清單,表示有權佈建的帳戶 恢復原廠設定後的裝置,是指 裝置。

DPC 可在全代管生命週期內設定這些帳戶 裝置。

  1. IT 管理員可以使用 People API 中的 people.get 方法 使用特殊值 me。這會擷取userId 登入帳戶。系統會在userIDresourceName 格式為 people/[userId],以整數字串表示。新建立的帳戶 在 72 小時內無法恢復原廠設定。
  2. 建議您在之後讓一或多位 IT 管理員解鎖裝置 恢復原廠設定。要求以下每位 IT 管理員登入自己的 Google 帳戶和 也按照步驟 1 操作,並與你分享「userId」,這樣你就能新增這些 將 userIds 新增至清單。
  3. DPC 會使用 setFactoryResetProtectionPolicy()以設定允許userId清單 佈建恢復原廠設定的裝置。
  4. DPC 可讓可在工廠後佈建裝置的帳戶 則經由播送的方式重設 com.google.android.gms.auth.FRP_CONFIG_CHANGED 是明確意圖 以防止因背景限製而遭到捨棄

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
val accountIds = listOf("000000000000000000000")

dpm.setFactoryResetProtectionPolicy(
    adminName,
    FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build()
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

// List of userId that can provision a factory reset device.
// You can use the value returned calling people/me endpoint.
List<String> accountIds = new ArrayList<String>();
accountIds.add("000000000000000000000");

dpm.setFactoryResetProtectionPolicy(
    adminName,
    new FactoryResetProtectionPolicy.Builder()
        .setFactoryResetProtectionAccounts(accountIds)
        .setFactoryResetProtectionEnabled(true)
        .build());

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

舊版

無法使用 setFactoryResetProtectionPolicy() (適用 API 級別 30,DPC 可使用 setApplicationRestrictions 新增 所選帳戶套用的 factoryResetProtectionAdmin 代管設定 適用於 com.google.android.gms 套件。

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false)
newConfig.putString(FACTORY_RESET_PROTECTION_ADMIN, googleAccounts)
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, false);
newConfig.putStringArray(FACTORY_RESET_PROTECTION_ADMIN,
        accountIds.toArray(new String[accountIds.size()]));
dpm.setApplicationRestrictions(adminName, GOOGLE_PLAY_APK, newConfig);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

停用企業專用恢復原廠設定保護機制

如要停用恢復原廠設定保護機制,DPC 可透過 setFactoryResetProtectionPolicy()傳遞 null 值。

Kotlin

const val ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String ACTION_FRP_CONFIG_CHANGED =
    "com.google.android.gms.auth.FRP_CONFIG_CHANGED";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

dpm.setFactoryResetProtectionPolicy(adminName, null);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

舊版

無法使用 setFactoryResetProtectionPolicy() (適用 API 級別 30,DPC 可使用 setApplicationRestrictions 設定金鑰 disableFactoryResetProtectionAdmin 受管理中的 true 值 請務必檢查 com.google.android.gms 套件的設定

Kotlin

const val GOOGLE_PLAY_APK = "com.android.vending"
const val FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin"
const val DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin"
const val GMSCORE_PACKAGE = "com.google.android.gms"

// ...

val existingConfig = dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK)
val newConfig = Bundle(existingConfig)
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true)

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions
)

val frpChangedIntent = Intent(ACTION_FRP_CONFIG_CHANGED)

frpChangedIntent.setPackage(GMSCORE_PACKAGE)
context.sendBroadcast(frpChangedIntent)

Java

static final String GOOGLE_PLAY_APK = "com.android.vending";
static final String FACTORY_RESET_PROTECTION_ADMIN = "factoryResetProtectionAdmin";
static final String DISABLE_FACTORY_RESET_PROTECTION_ADMIN = "disableFactoryResetProtectionAdmin";
static final String GMSCORE_PACKAGE = "com.google.android.gms";

// ...

Bundle existingConfig =
        dpm.getApplicationRestrictions(adminName, GOOGLE_PLAY_APK);
Bundle newConfig = new Bundle(existingConfig);
newConfig.putBoolean(DISABLE_FACTORY_RESET_PROTECTION_ADMIN, true);

dpm.setApplicationRestrictions(
    adminName, GOOGLE_PLAY_SERVICES_PACKAGE, restrictions);

Intent frpChangedIntent = new Intent(ACTION_FRP_CONFIG_CHANGED);

frpChangedIntent.setPackage(GMSCORE_PACKAGE);
context.sendBroadcast(frpChangedIntent);

監控企業程序記錄和遠端錯誤報告

管理員可以在 EMM 控制台中,透過企業監控全代管裝置 程序記錄和遠端錯誤報告。

記錄企業裝置活動

在裝置擁有者模式下執行的 DPC 可從遠端識別可疑活動 追蹤裝置活動,包括應用程式啟動、Android Debug Bridge (ADB) 活動及螢幕解鎖不需使用者同意即可處理記錄。

如要啟用或停用記錄功能,DPC 會呼叫 setSecurityLoggingEnabled()

有新的一批記錄檔時,DeviceAdminReceiver 會收到 onSecurityLogsAvailable() 回呼。如要擷取紀錄 (在 觸發回呼時,DPC 會呼叫 retrieveSecurityLogs()

裝置政策控制器 (DPC) 也可以呼叫 retrievePreRebootSecurityLogs() 來擷取安全性資訊 記錄檔這是介於 以及上次重新啟動的裝置。不支援的裝置 retrieveSecurityLogs() 會傳回 null。如果您的應用程式使用 retrievePreRebootSecurityLogs()retrieveSecurityLogs(),你需: 檢查是否有重複的項目。
注意:這項功能只會記錄單一單一管理裝置中全代管裝置上的活動 使用者或關聯使用者。無法使用這項功能 個人裝置,因為這類資料會記錄所有裝置的活動。

這項設定會記錄安全性事件, 下列動作類型:

  • 每當應用程式剛啟動時。這有助於確認 以被入侵應用程式啟動的惡意軟體。
  • 裝置解鎖失敗。這也可以偵測 短時間內多次解鎖失敗。
  • 可能有害的 ADB 指令 透過 USB 傳輸線將裝置連接到電腦

如要進一步瞭解如何讀取記錄,請參閱 SecurityLog

在開發及測試過程中,您可以強制系統 DPC 可取得現有的安全性記錄,因此您不必等待完整記錄檔 批次。在 Android 9.0 (API 級別 28) 以上版本中,執行下列指令 在終端機中使用 Android Debug Bridge (ADB) 指令:

adb shell dpm force-security-logs

系統會限制使用者使用這項工具的頻率,並 刻意減緩終端機輸出內容的執行速度。如果有可用的記錄, DPC 收到 onSecurityLogsAvailable() 回呼。

從遠端要求錯誤報告

在裝置擁有者模式下運作的 DPC 可從遠端為使用者索取錯誤報告 裝置只有一位使用者或關聯使用者的裝置。錯誤報告會擷取 要求錯誤報告的確切當下的裝置活動,但也可能 包含過去幾小時的活動 (視 logcat 頻率而定) 緩衝區重新整理。

如要從遠端要求錯誤報告,DPC 會呼叫 requestBugreport()

授予及移除用戶端憑證的存取權

在個人資料擁有者或裝置擁有者模式下執行的 DPC 授權第三方應用程式 應用程式可以授權自己存取憑證 憑證,不必經過使用者介入如何安裝 憑證,讓設定檔中的所有應用程式都能存取,請使用 installKeyPair()

如要瞭解要設定哪些參數,請參閱 installKeyPair()。這項功能 可搭配現有的 API 使用,以便管理憑證

部署情境

如果沒有 installKeyPair() 方法:

  • 使用者每次都必須輕觸憑證名稱,再輕觸「允許」。 他們要授予憑證存取權。
  • 使用者安裝憑證時會看到提示,且必須為 憑證

使用 installKeyPair() 方法:

  • 使用者每次要授予存取權時,都不必輕觸「允許」。 憑證
  • 使用者無法重新命名憑證。
  • 管理員可進一步控管,他們可以封鎖 不應存取特定憑證的應用程式。

移除用戶端憑證

授予用戶端憑證的存取權後,即可從遠端移除用戶端 憑證,透過 installKeyPair() 安裝,呼叫 removeKeyPair()

在裝置擁有者模式、設定檔擁有者模式下執行或委派的 DPC 憑證安裝程式可以呼叫 removeKeyPair()。這將移除 憑證和私密金鑰組安裝在特定私密金鑰別名之下。

部署情境

如果機構要遷移至更安全的用戶端形式,請啟用這項功能 憑證管理員推出新憑證及其發布作業 管理員需要花費大量時間 憑證。

安全密碼重設

您的 DPC 可透過 安全又安全的註冊權杖裝置擁有者和個人資料擁有者可進行通話,確保安全 密碼重設 API 來變更裝置和工作資料夾的密碼 。安全密碼重設功能會將 resetPassword() 替換成 以下是改善項目:

如果您的裝置政策控制器 (DPC) 版本指定 Android 8.0 (API),請使用安全密碼重設功能 層級 26) 以上。呼叫 resetPassword() 會擲回 DPC 中的 SecurityException,且指定 Android 8.0 以上版本,您便可 必須先更新裝置政策控制器 (DPC)。

設定並啟用權杖

DPC 必須先設定並啟用權杖,才能重設密碼。由於 您的 DPC 可能無法直接使用權杖 預先安排 IT 管理員可能需要使用的時間

密碼重設權杖是經過加密的高強度隨機值,必須 長度至少為 32 個位元組。為每部裝置和設定檔建立權杖,切勿 重複使用或分享產生的符記

建議您將權杖或加密權杖解密的方式儲存在 伺服器如果將權杖儲存在本機的憑證加密儲存空間,DPC 使用者就無法重設密碼,請使用者解鎖裝置或設定檔。如果發生以下情況: 將權杖儲存在裝置本機加密儲存空間中,導致這類權杖遭駭 攻擊者可以使用此憑證來取得工作資料夾或主要 內容。

您可以在 DPC 中產生新的權杖,也可以從伺服器擷取權杖。 下方範例說明的是,DPC 自行產生符記並回報給 伺服器:

Kotlin

val token = ByteArray(32)

// Generate a new token
val random = SecureRandom()
random.nextBytes(token)

// Set the token to use at a later date
val success: Boolean
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(context), token)

// Activate the token and update success variable...

// Store the token on a server
if (success) {
 sendTokenToServer(token)
}

Java

byte token[] = new byte[32]; // Minimum size token accepted

// Generate a new token
SecureRandom random = new SecureRandom();
random.nextBytes(token);

// Set the token to use at a later date
boolean success;
success = dpm.setResetPasswordToken(DeviceAdminReceiver.getComponentName(getContext()), token);

// Activate the token and update success variable ...

// Store the token on a server
if (success) {
 sendTokenToServer(token);
}

在大多數情況下,DPC 必須在設定權杖後啟用權杖。但當您 如果使用者沒有螢幕鎖定密碼,系統就會啟用權杖 走在正前方如要啟用權杖,請要求使用者確認憑證。 DPC 可以呼叫 KeyguardManager 方法 createConfirmDeviceCredentialIntent() 以取得 Intent,用來啟動 確認。透過使用者介面向裝置使用者說明 並要求他們進行驗證下列程式碼片段說明如何啟用 取得 DPC 憑證

Kotlin

// In your DPC, you'll need to localize the user prompt
val ACTIVATE_TOKEN_PROMPT = "Use your credentials to enable remote password reset"
val ACTIVATE_TOKEN_REQUEST = 1

// Create or fetch a token and set it in setResetPasswordToken() ...
val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(null, ACTIVATE_TOKEN_PROMPT)

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST)
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

Java

// In your DPC, you'll need to localize the user prompt
static final String ACTIVATE_TOKEN_PROMPT =
 "Use your credentials to enable remote password reset";
static final int ACTIVATE_TOKEN_REQUEST = 1;

// Create or fetch a token and set it in setResetPasswordToken() ...

KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
Intent confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(
  null, ACTIVATE_TOKEN_PROMPT);

if (confirmIntent != null) {
 startActivityForResult(confirmIntent, ACTIVATE_TOKEN_REQUEST);
 // Check your onActivityResult() callback for RESULT_OK
} else {
 // Null means the user doesn't have a lock screen so the token is already active.
 // Call isResetPasswordTokenActive() if you need to confirm
}

您需要在裝置重新啟動之前啟用 DPC 設定的權杖。Android 版 會將未啟用的憑證儲存在記憶體中,且不會在 。如果使用者在啟用權杖前重新啟動裝置,DPC 就能 請再次設定相同權杖或產生新權杖。

DPC 可透過呼叫 isResetPasswordTokenActive(),並檢查結果為 true

DPC 設定並啟用權杖後,該權杖將失效,直到 DPC 刪除或 更換權杖 (或裝置恢復原廠設定)。權杖與 並不會受到使用者變更或清除密碼的影響。

刪除權杖

您可以呼叫 clearResetPasswordToken() 刪除 DPC 的權杖 工具。您可能需要撤銷遭入侵的權杖,或是 移除重設密碼的功能。以下範例說明如何執行 DPC 的運作方式:

Kotlin

val dpm = getDpm()
val admin = DeviceAdminReceiver.getComponentName(requireActivity())

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

Java

DevicePolicyManager dpm = getDpm();
ComponentName admin = DeviceAdminReceiver.getComponentName(getActivity());

// Clear the token
if (!dpm.clearResetPasswordToken(admin)) {
 // Report the failure and possibly try later ...
}

重設密碼

如果 IT 管理員需要重設密碼,請致電 resetPasswordWithToken(),並傳送 DPC 設定並啟用的權杖 :

Kotlin

val token: ByteArray = getTokenFromServer()
val newPassword = "password"

try {
 val result: Boolean = dpm.resetPasswordWithToken(
 DeviceAdminReceiver.getComponentName(requireContext()),
 newPassword,
 token,
 0
 )

 if (result) {
 // The password is now 'password'
 } else {
 // Using 'password' doesn't meet password restrictions
 }
} catch (e: IllegalStateException) {
 // The token doesn't match the one set earlier.
}

Java

byte token[] = getTokenFromServer();
String newPassword = "password";

try {
 boolean result = dpm.resetPasswordWithToken(
  DeviceAdminReceiver.getComponentName(getContext()), newPassword, token, 0);

 if (result) {
 // The password is now 'password'
 } else {
 // Using `password` doesn't meet password restrictions
 }
} catch (IllegalStateException e) {
 // The token doesn't match the one set earlier.
}

呼叫 resetPasswordWithToken() 會傳回 false,但密碼不會 變更時,系統會在不符合下列條件的情況下變更:

  • 字元數符合任何密碼長度下限限制。致電 getPasswordMinimumLength() 比較 IT 人員 管理員設定了時間長度限制
  • 密碼涵蓋的字元範圍和複雜度與構成要素相符 限制。致電 getPasswordQuality() 洽詢 IT 人員 管理員設定了組合限制

如果密碼品質限制不需要設定密碼,您可以 將 null 或空字串傳遞至 resetPasswordWithToken(),移除 密碼。

工作資料夾安全驗證問題

在設定檔擁有者模式下運作的 DPC 可要求使用者指定安全性 針對在工作資料夾中執行的應用程式提出挑戰。系統會 挑戰使用者嘗試開啟任何工作應用程式時如果使用者成功 完成安全驗證後,系統會解鎖工作資料夾,並 並在必要時解密。

工作資料夾安全性驗證說明的運作方式

  1. 如果 DPC 傳送 ACTION_SET_NEW_PASSWORD 意圖,系統會提示 要求使用者設定安全驗證問題
  2. DPC 也可以傳送 ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 提示使用者設定裝置鎖定的意圖。

DPC 可以設定工作挑戰的密碼政策,與 政策。舉例來說 裝置驗證回應可以不等於 密碼。裝置政策控制器 (DPC) 使用 DevicePolicyManager 方法,例如 setPasswordQuality()setPasswordMinimumLength()

注意事項

  • DPC 可以重設工作資料夾的密碼,但無法重設 裝置 (個人) 密碼。如果使用者選擇設定公司密碼和個人密碼 值相同,則工作資料夾上的 resetPassword() 就會造成 密碼只會重設工作資料夾,且密碼不同 也就是裝置螢幕鎖定畫面
  • 裝置政策控制器 (DPC) 可使用 setOrganizationColor()setOrganizationName()
  • 裝置管理員無法使用 resetPassword() 清除密碼或變更密碼 也可以查看已經設定的廣告裝置管理員仍可設定密碼,但只有 裝置沒有密碼、PIN 碼或解鎖圖案時。

詳情請參閱 getParentProfileInstance() 和參考資料 說明文件 (位於 DevicePolicyManager) 下。