在这里插入图片描述

1 -> 概述

1.1 -> 企业移动设备管理的演进

随着企业数字化转型的不断深化,移动设备管理(Mobile Device Management,MDM)已成为现代企业信息化建设中不可或缺的一环。从早期的简单设备状态监控,到如今覆盖硬件能力、通信渠道、数据交互等全维度的精细化管控体系,企业对于移动终端的管理需求正在经历质的飞跃。

HarmonyOS 6.0 在原有的 MDM Kit(Mobile Device Management Kit)基础上进行了大幅扩展和增强。据相关资料显示,此次 HarmonyOS 6 共开放了超过 300 项系统 API,覆盖设备管理、通信管理、网络配置、应用保活、应用分发、KIOSK 展台模式等关键领域。接口的丰富性与精细化,直接提升了鸿蒙设备管理的精准度与安全防护等级,为复杂政企场景提供了更为灵活的适配可能。

在设备安全管理领域,HarmonyOS 6.0 新增了一批具有行业纵深能力的 API。其中,“针对指定应用设置 user_grant 权限的管理策略”这一能力的引入,标志着鸿蒙企业级权限管控体系从“用户主导”向“策略主导”迈出了关键一步。

1.2 -> 问题的由来:user_grant 权限在企业场景下的困境

要理解这一新能力的价值,首先需要回顾鸿蒙系统权限体系的基本设计。鸿蒙系统将应用权限划分为两大类:

  • system_grant(系统授权):由系统在应用安装时自动授予,开发者无需进行额外的动态申请操作。
  • user_grant(用户授权):涉及用户隐私数据或敏感操作的权限——如相机、位置、麦克风、通讯录等——需要应用在运行时通过弹窗向用户明确请求授权,用户确认后方可使用。

这种“用户知情同意”的权限模型在个人消费场景中是合理且必要的,它体现了对用户隐私和数据主权的尊重。然而,当我们将这一模型套用到企业设备管理场景时,一系列现实困境便浮出水面:

  1. 授权不确定性:员工可能拒绝授予某些权限,导致核心业务应用无法正常工作。例如,巡检类应用需要相机权限扫描二维码,物流应用需要定位权限记录轨迹,若员工拒绝授予,业务将直接受阻。
  2. 误操作风险:用户可能因不了解权限用途而误操作关闭权限,或因疏忽导致权限状态异常变更,带来数据泄露隐患。
  3. 运维成本高昂:在部署了成百上千台设备的规模化场景中,逐台设备、逐个用户地进行权限指导,对于 IT 运维团队而言几乎是不可能完成的任务。
  4. 合规审计困难:大量设备的权限状态难以统一管控和审计,在金融、政务等高合规要求领域,缺乏统一权限策略往往成为监管合规的盲区。

1.3 -> 新能力的定位与意义

HarmonyOS 6.0 在 MDM Kit 中新增的 setPermissionManagedState 接口,正是为解决上述问题而生。该接口允许企业设备管理应用(MDM 应用)通过策略化的方式,对指定应用的一个或多个 user_grant 权限进行统一设置,将权限的授权决策权从终端用户前移至企业 IT 管理员。

这意味着,企业可以在后台集中控制关键业务应用所需的敏感权限,确保员工设备上的权限状态始终符合企业安全策略。从更宏观的视角来看,MDM Kit 作为鸿蒙系统面向企业级设备管理的核心组件,为 MDM 应用提供了一套完整的设备管理 API。设备管理应用通过继承 EnterpriseAdminExtensionAbility 来调用 MDM Kit 中的接口,本次新增的权限管理能力进一步完善了 MDM Kit 的安全管理矩阵。

2 -> 能力价值与适用场景

2.1 -> 核心价值

这一新增能力为企业设备管理带来了三个层次的价值提升:

第一层:权限管控模式从“被动响应”转向“主动策略”。以往,企业 IT 部门面对应用权限问题时,只能通过下发操作指南、培训员工等方式被动应对,缺乏对设备权限状态的实际控制力。员工是否开启权限、何时关闭权限,完全依赖于个人意愿和操作习惯。新能力让 IT 管理员能够直接在后台设置权限的管理策略,从源头上保障应用运行所需权限的可用性。企业的安全策略不再是一纸空文,而是落地为可执行的系统状态。

第二层:显著降低企业应用的运行门槛和运维成本。对于部署在企业设备上的核心业务应用——如巡检应用需要相机权限、物流应用需要定位权限、医疗应用需要存储权限——IT 管理员可以通过后台策略统一完成权限配置,免除逐台设备、逐个用户进行指导的操作负担。在规模化部署场景下(如零售门店、物流网点、医院院区),这一价值尤为突出:原本需要数十人天的工作量,通过策略批量下发即可在数分钟内完成。

第三层:强化企业数据安全防线的闭环能力。权限是企业数据安全的第一道闸门。在金融、政府、制造、医疗等敏感行业中,通过 MDM 策略强制开启或关闭特定权限,能够在合规审计、数据防泄漏等场景中形成完整的安全管控闭环。当企业发现某类权限存在安全风险时,可以立即通过 MDM 平台批量修改权限策略,实现快速响应和全局收敛。

2.2 -> 适用场景

该能力广泛适用于多种企业设备管理场景:

  • COPE(Corporate-Owned, Personally-Enabled)场景,即企业派发设备:企业统一采购设备并分发给员工使用,设备所有权归企业。IT 部门可以对设备上的业务应用权限进行全面托管,确保各类工作应用在受控环境下运行。员工可以使用设备处理个人事务,但企业核心应用的权限状态由 IT 统一管控,实现“企业数据安全”与“员工使用便利”的平衡。

  • BYOD(Bring Your Own Device)场景,即自带设备办公:允许员工携带自有设备接入办公环境。在这一场景下,企业 MDM 应用通过新能力在工作空间内统一管理业务应用的权限,而在个人空间则保持原有的用户授权模式,实现数据隔离下的分级管控。新能力确保了业务运行所需的关键权限始终可用,同时不干涉用户对个人应用的自主选择。

  • 专用设备/Kiosk 展台模式:在政务大厅自助终端、企业展厅展台设备、零售门店 POS 终端等场景中,设备通常锁定在单一应用(Kiosk 模式),且由企业完全掌控。通过该能力,企业可以在设备部署阶段统一配置所需的所有权限,确保终端设备开机即用、无需人工干预。

  • 高合规行业场景:在金融、医疗、政府、军工等高合规要求行业中,企业需要确保设备上的权限状态能够通过监管审计。新能力提供了权限配置的可追溯性和一致性,审计人员可以通过 MDM 平台查看全局权限策略的执行情况。

3 -> 新增 API 详解

3.1 -> API 概述

本次新增的权限管理能力主要通过 securityManager 模块中的 setPermissionManagedState 接口实现。该接口从 API version 20 开始支持,属于 HarmonyOS 6.0 新增的高阶 MDM 能力之一。

该接口的核心功能是:企业设备管理应用可以通过该接口为指定应用设置 user_grant 权限的管理策略,批量控制该应用上若干权限的授予或拒绝状态。

3.2 -> 导入模块

在使用该接口之前,需要先从 @kit.MDMKit 中导入 securityManager 模块:

import { securityManager } from '@kit.MDMKit';
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

说明:本模块首批接口从 API version 12 开始支持,新增的权限管理接口从 API version 20 开始支持。本模块接口仅可在 Stage 模型下使用,且调用接口前需激活设备管理应用。

3.3 -> 接口定义与参数说明

setPermissionManagedState 接口的函数签名如下:

function setPermissionManagedState(
    admin: Want, 
    bundleName: string, 
    permissionName: string, 
    state: PermissionManagedState
): Promise<void>

参数详解

参数名 类型 必填 说明
admin Want 企业设备管理扩展组件。Want 对象中必须包含企业设备管理扩展能力的 abilityName 和所在应用的 bundleName
bundleName string 目标应用的包名(Bundle Name),即需要为其设置权限策略的应用
permissionName string 需要设置管理状态的 user_grant 权限名称。必须是已在系统定义的 user_grant 类型权限
state PermissionManagedState 权限管理状态,枚举类型,取值包括:
• ALLOWED:允许该权限
• DENIED:拒绝该权限

返回值

返回 Promise<void> 对象。当权限管理状态设置成功时,Promise 正常完成;当设置失败时,会抛出相应的错误对象。

3.4 -> 前置条件

在调用本接口之前,必须满足以下前置条件:

  1. 应用类型:调用方必须为已激活的设备管理应用(MDM 应用),普通应用无权调用。
  2. 模型约束:仅在 Stage 模型下可用。
  3. 权限声明:调用该接口需要声明相应的企业设备管理权限,具体权限级别为 system_coresystem_basic,需根据目标权限的敏感程度确定。
  4. 参数合法性:bundleName 必须对应一个已安装的合法应用,permissionName 必须是系统定义的 user_grant 类型权限。

3.5 -> 错误码说明

调用该接口时,可能会返回以下错误码:

错误码 错误信息 说明
201 Permission verification failed 应用不具备调用该接口所需的权限
401 Parameter error 参数错误。可能原因:缺少必填参数、参数类型错误、参数校验失败
9200001 The application is not an administrator application of the device 调用方应用尚未成功激活为设备管理应用
9200002 The administrator application does not have permission to manage the device 设备管理应用的权限不足以执行该操作

3.6 -> 相关数据结构

PermissionManagedState(权限管理状态枚举)

enum PermissionManagedState {
    ALLOWED = 0,  // 允许该权限
    DENIED = 1    // 拒绝该权限
}

使用说明

  • state 设置为 ALLOWED 时,MDM 策略会强制为目标应用授予该 user_grant 权限,用户将不会收到授权弹窗,也无法在系统设置中关闭该权限(受 MDM 策略管控)。
  • state 设置为 DENIED 时,MDM 策略会强制拒绝该权限,目标应用即使调用权限申请接口,系统也不会弹出授权弹窗,直接返回拒绝结果。

4 -> 开发实战

4.1 -> 开发环境准备

在开始开发之前,需要准备以下环境:

  1. 开发工具:DevEco Studio 5.0+ 版本
  2. SDK 版本:HarmonyOS 6.0 SDK(API version 20 及以上)
  3. 运行环境:Node.js 16+ 版本

4.2 -> 步骤一:创建企业设备管理应用

首先,需要在项目中创建一个 EnterpriseAdminExtensionAbility 类型的 ExtensionAbility,这是成为 MDM 应用的前提。在 module.json5 文件中添加如下配置:

{
    "module": {
        "extensionAbilities": [
            {
                "name": "EnterpriseAdminAbility",
                "srcEntry": "./ets/enterpriseadmin/EnterpriseAdminAbility.ets",
                "type": "enterpriseAdmin",
                "visible": true,
                "metadata": [
                    {
                        "name": "enterprise_device_management",
                        "value": "true"
                    }
                ]
            }
        ]
    }
}

然后创建对应的 ExtensionAbility 实现文件:

// EnterpriseAdminAbility.ets
import EnterpriseAdminExtensionAbility from '@ohos.enterprise.EnterpriseAdminExtensionAbility';

export default class EnterpriseAdminAbility extends EnterpriseAdminExtensionAbility {
    onAdminEnabled() {
        console.info('EnterpriseAdminAbility onAdminEnabled');
    }
    
    onAdminDisabled() {
        console.info('EnterpriseAdminAbility onAdminDisabled');
    }
}

4.3 -> 步骤二:激活设备管理应用

在调用 MDM Kit 的任何接口之前,必须先激活设备管理应用。应用首次启动时,需要引导用户激活管理员权限:

import { adminManager } from '@kit.MDMKit';
import { Want } from '@kit.AbilityKit';

async function activateAdmin() {
    const adminWant: Want = {
        bundleName: 'com.example.mdmapp',
        abilityName: 'EnterpriseAdminAbility'
    };
    
    try {
        await adminManager.setAdmin(adminWant);
        console.info('Device administrator activated successfully');
    } catch (err) {
        let error = err as BusinessError;
        console.error(`Failed to activate admin: Code: ${error.code}, message: ${error.message}`);
    }
}

4.4 -> 步骤三:声明所需权限

module.json5 中声明调用 MDM API 所需的权限:

{
    "module": {
        "requestPermissions": [
            {
                "name": "ohos.permission.MANAGE_ENTERPRISE_DEVICE_ADMIN",
                "reason": "$string:reason_manage_device_admin",
                "usedScene": {
                    "abilities": ["EntryAbility"],
                    "when": "inuse"
                }
            }
        ]
    }
}

注意:MDM 应用所需的权限需要在申请证书和 Profile 时一并申请,普通运行时声明不足以激活系统级能力。

4.5 -> 步骤四:调用 setPermissionManagedState 设置权限策略

以下示例演示如何为指定的企业应用设置相机权限管理策略:

import { securityManager } from '@kit.MDMKit';
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 定义设备管理应用的 Want 对象
const admin: Want = {
    bundleName: 'com.example.mdmapp',
    abilityName: 'EnterpriseAdminAbility'
};

// 目标应用的包名
const TARGET_BUNDLE_NAME = 'com.example.enterprise.app';

/**
 * 为指定应用设置权限管理策略
 * @param permissionName 权限名称
 * @param state 权限状态(ALLOWED / DENIED)
 */
async function setPermissionPolicy(permissionName: string, state: number): Promise<void> {
    try {
        await securityManager.setPermissionManagedState(admin, TARGET_BUNDLE_NAME, permissionName, state);
        console.info(`Successfully set permission policy for ${TARGET_BUNDLE_NAME}: ${permissionName} = ${state}`);
    } catch (err) {
        let error = err as BusinessError;
        console.error(`Failed to set permission policy: Code: ${error.code}, message: ${error.message}`);
        throw error;
    }
}

// 启用相机权限
setPermissionPolicy('ohos.permission.CAMERA', 0);  // 0 = ALLOWED

// 拒绝位置权限
setPermissionPolicy('ohos.permission.LOCATION', 1);  // 1 = DENIED

4.6 -> 步骤五:批量设置多个权限

在实际的企业场景中,通常需要为一个应用批量设置多个权限。以下示例演示了批量设置的实现方式:

interface PermissionPolicy {
    permissionName: string;
    state: PermissionManagedState;
}

/**
 * 批量设置应用权限管理策略
 * @param bundleName 目标应用包名
 * @param policies 权限策略列表
 */
async function batchSetPermissionPolicies(bundleName: string, policies: PermissionPolicy[]): Promise<void> {
    const admin: Want = {
        bundleName: 'com.example.mdmapp',
        abilityName: 'EnterpriseAdminAbility'
    };
    
    const results = [];
    const errors = [];
    
    for (const policy of policies) {
        try {
            await securityManager.setPermissionManagedState(admin, bundleName, policy.permissionName, policy.state);
            results.push({ permission: policy.permissionName, success: true });
            console.info(`Policy set successfully: ${policy.permissionName} = ${policy.state}`);
        } catch (err) {
            let error = err as BusinessError;
            errors.push({ permission: policy.permissionName, success: false, error: error.message });
            console.error(`Failed to set policy for ${policy.permissionName}: ${error.message}`);
        }
    }
    
    console.info(`Batch operation completed. Success: ${results.length}, Failed: ${errors.length}`);
    return { results, errors };
}

// 使用示例
const policies: PermissionPolicy[] = [
    { permissionName: 'ohos.permission.CAMERA', state: PermissionManagedState.ALLOWED },
    { permissionName: 'ohos.permission.MICROPHONE', state: PermissionManagedState.ALLOWED },
    { permissionName: 'ohos.permission.LOCATION', state: PermissionManagedState.ALLOWED },
    { permissionName: 'ohos.permission.READ_CONTACTS', state: PermissionManagedState.DENIED },
    { permissionName: 'ohos.permission.WRITE_CONTACTS', state: PermissionManagedState.DENIED }
];

batchSetPermissionPolicies('com.example.enterprise.app', policies);

4.7 -> 步骤六:策略下发后的验证

设置权限管理策略后,可以通过以下方式验证策略是否生效:

import { abilityAccessCtrl } from '@kit.AbilityKit';

async function checkPermissionStatus(bundleName: string, permissionName: string): Promise<void> {
    const atManager = abilityAccessCtrl.createAtManager();
    
    try {
        // 检查目标应用的权限状态
        const grantStatus = await atManager.checkAccessToken(bundleName, permissionName);
        console.info(`Permission ${permissionName} status for ${bundleName}: ${grantStatus}`);
    } catch (err) {
        let error = err as BusinessError;
        console.error(`Failed to check permission: ${error.message}`);
    }
}

// 验证相机权限状态
checkPermissionStatus('com.example.enterprise.app', 'ohos.permission.CAMERA');

5 -> 技术原理与策略冲突处理

5.1 -> 策略作用域

setPermissionManagedState 设置的权限管理策略作用于设备级别。一旦通过 MDM 应用设置了权限管理状态,该策略会持久保存在设备中,系统重启后依然生效,直到被显式清除或覆盖。该策略覆盖以下场景:

  • 目标应用运行时调用 requestPermissionsFromUser 接口申请权限时,系统会直接根据 MDM 策略返回结果,不会弹出用户授权弹窗。
  • 用户在系统“设置”中尝试修改该应用的权限状态时,受 MDM 策略管控的权限项会被禁用,用户无法手动变更。

5.2 -> 策略冲突规则

在多 MDM 应用共存的场景下,HarmonyOS 遵循从严管控原则处理策略冲突:

  • 当存在多个 MDM 应用时,任一应用要求“拒绝(DENIED)”,则最终策略为拒绝。
  • 仅当所有 MDM 应用都未设置“拒绝”策略(即全部设置为“允许(ALLOWED)”或未设置)时,权限才会被允许。

这种设计确保了企业安全管理中的“最小权限原则”能够得到有效执行,防止某个 MDM 应用的配置失误或遗漏导致安全缺口。

5.3 -> 策略的生命周期管理

权限管理策略可以通过以下方式管理:

// 清除某个权限的管理策略(恢复为未托管状态)
// 注意:当前版本中,清除策略需要通过将 state 设置为目标值来实现覆盖
// 如需彻底解除策略管控,建议查阅最新 API 文档确认是否有专用的清除接口

// 查询当前权限的管理策略状态
// 示例:可通过企业设备管理接口查询策略配置

6 -> 企业集成最佳实践

6.1 -> 策略设计原则

在设计企业权限管理策略时,建议遵循以下原则:

  • 最小必要原则:仅对企业核心业务应用的必要权限进行托管管控,对于非核心应用或非必要权限,保持原有的用户授权模式,避免过度管控带来的用户体验下降。
  • 分层分级策略:根据员工角色和部门属性,制定差异化的权限策略。例如,管理层设备可保持较宽松的权限设置,而一线操作层设备应严格管控。
  • 策略可审计:所有的权限策略变更操作应在 MDM 平台记录审计日志,便于合规追溯和安全事件调查。

6.2 -> 与现有 MDM 体系的集成

本新增权限管理能力可以与其他 MDM 能力协同使用,构建完整的企业设备管理方案:

  • 结合 应用分发能力,在企业推送新应用时同步下发权限策略,实现“安装即配置”。
  • 结合 Kiosk 展台模式,在设备进入锁定状态时自动配置必要权限,确保终端设备可无人值守运行。
  • 结合 Enterprise Space Kit 空间管理服务,在工作空间内实现对业务应用权限的统一管控。

6.3 -> 运维建议

  • 灰度发布策略:在大规模部署前,建议先在小范围内进行权限策略的测试验证,确保不会对业务造成意外影响。
  • 异常监控:建议在 MDM 平台建立权限策略执行的监控和告警机制,及时发现和处理策略下发失败的设备。
  • 用户告知:在实施权限策略变更前,建议提前通知用户变更内容及其业务目的,减少因用户不理解而产生的抵触情绪。

7 -> 总结

HarmonyOS 6.0 MDM Kit 新增的针对指定应用设置 user_grant 权限管理策略的能力,是鸿蒙企业级设备管理能力的一次重要升级。这一能力的核心意义在于:

第一,填补了企业应用权限集中管理的空白。它打破了“用户授权”在企业场景下的局限性,将权限的决策权从终端用户前移至 IT 管理员,为企业提供了对敏感权限的可编程控制能力。

第二,构建了从“用户主导”到“策略主导”的管控范式转变。企业不再被动依赖员工的操作配合,而是能够通过后台策略主动保障核心应用的权限可用性和数据安全性,实现真正的“策略驱动型”设备管理。

第三,为企业数字化转型提供了更坚实的底层支撑。在 COPE、BYOD、Kiosk 展台等多样化场景中,这一能力让企业能够以更低的运维成本、更高的安全级别实现设备的规模化管控。

随着鸿蒙生态的持续演进和企业设备管理需求的不断深化,MDM Kit 的能力矩阵将持续扩展。可以预见,未来版本的 MDM Kit 将进一步增强权限管理能力,如支持更细粒度的权限控制策略(单次授权、临时授权等)、权限审计事件订阅、跨设备权限策略同步等功能,为企业数字化转型提供更为强大的技术底座。


感谢各位大佬支持!!!

互三啦!!!
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐