在 Intune 的 macOS 设备上使用 shell 脚本

使用 shell 脚本扩展 Intune 中的设备管理功能,超出 macOS 操作系统支持的功能。

注意

若要在 Apple Silicon Mac 上运行 x64 (Intel) 版本的应用,需要使用 Rosetta 2。 若要在 Apple Silicon Macs 上自动安装 Rosetta 2,可以在 Intune 中部署 shell 脚本。 若要查看示例脚本,请参阅 Rosetta 2 安装脚本

先决条件

在编写 shell 脚本并将其分配给 macOS 设备时,请确保满足以下先决条件。

  • 设备正在运行 macOS 12.0 或更高版本。
  • 设备由 Intune 管理。
  • 设备直接连接到 Internet。 不支持通过代理进行连接。
  • Shell 脚本以 #! 开头,并且 必须位于有效位置,例如 #!/bin/sh#!/usr/bin/env zsh
  • 已安装适用 shell 的命令行解释器。

使用 shell 脚本之前的重要注意事项

  • Shell 脚本要求在 macOS 设备上成功安装 Microsoft Intune 管理代理。 有关详细信息,请参阅 适用于 macOS 的 Microsoft Intune 管理代理
  • Shell 脚本作为单独的进程在设备上并行运行。
  • 作为已登录用户运行的 Shell 脚本将在运行时为设备上所有当前登录的用户帐户运行。
  • 最终用户需要登录到设备才能执行以登录用户身份运行的脚本。
  • 如果脚本要求进行标准用户帐户无法进行的更改,则需要根用户权限。
  • 在某些情况下,Shell 脚本将尝试运行比所选脚本频率更高的频率,例如,如果磁盘已满、存储位置被篡改、本地缓存被删除或 Mac 设备重启。
  • 运行时间超过 60 分钟的 Shell 脚本将停止并报告为“失败”。

创建和分配 shell 脚本策略

  1. 登录到 Microsoft Intune 管理中心

  2. 选择“ 设备>按平台>macOS>管理设备>”“脚本>添加”。

  3. 在“基本信息”中,输入以下属性并选择“下一步”:

    • 名称:输入 shell 脚本的名称。
    • 说明:输入 shell 脚本的说明。 此设置是可选的,但建议进行。
  4. 在“脚本设置”中,输入以下属性并选择“下一步”:

    • 上传脚本:浏览到 shell 脚本。 脚本文件的大小必须小于 1 MB。
    • 以登录用户身份运行脚本:选择“ ”,在设备上使用用户的凭据运行脚本。 选择“ (默认) 以根用户身份运行脚本。
    • 隐藏设备上的脚本通知: 默认情况下,将显示运行的每个脚本的脚本通知。 最终用户看到 IT 正在从 macOS 设备上的Intune配置计算机通知。
    • 脚本频率: 选择脚本的运行频率。 选择“ 未配置 (默认) 只运行一次脚本。 具有设置频率的脚本也将在设备重启后运行。
    • 脚本失败时重试的最大次数: 选择如果脚本返回非零退出代码 (零表示成功) ,则应运行多少次。 选择“ 未配置 (默认) 在脚本失败时不重试。
  5. “作用域标记”中,可以选择为脚本添加作用域标记,然后选择“ 下一步”。 可以使用范围标记来确定谁可以查看Intune中的脚本。 有关范围标记的完整详细信息,请参阅 为分布式 IT 使用基于角色的访问控制和范围标记

  6. 选择“分配”> 选择要包含的组。 将显示Microsoft Entra组的现有列表。 选择要接收脚本的一个或多个用户或设备组。 选择“选择”。 所选组将显示在列表中,并接收脚本策略。

    注意

  7. 在“查看 + 添加”中,将显示你配置的设置的摘要。 选择“添加”以保存脚本。 选择“ 添加”时,脚本策略将部署到所选组。

创建的脚本现在显示在脚本列表中。 如果需要,可以在将 macOS shell 脚本上传到Intune后查看这些脚本的内容。

监视 shell 脚本策略

可以通过选择以下报表之一来监视用户和设备分配的所有脚本的运行状态:

  • 脚本>选择要监视>的脚本设备状态
  • 脚本>选择要监视>的脚本用户状态

重要

无论所选 脚本频率如何,仅在首次运行脚本时报告脚本运行状态。 脚本运行状态不会在后续运行时更新。 但是,更新的脚本被视为新脚本,并将再次报告运行状态。

脚本运行后,它将返回以下状态之一:

  • 脚本运行状态为 “失败 ”表示脚本返回了非零退出代码或脚本格式不正确。
  • 脚本运行状态为 “成功 ”指示脚本返回零作为退出代码。

使用日志收集对 macOS shell 脚本策略进行故障排除

可以收集设备日志以帮助排查 macOS 设备上的脚本问题。

日志收集的要求

在 macOS 设备上收集日志需要以下项:

  • 必须指定完整的绝对日志文件路径。
  • 只能使用分号 (;) 分隔文件路径。
  • 要上传的最大日志集合大小为 60 MB (压缩) 或 25 个文件,以先出现者为准。
  • 允许用于日志收集的文件类型包括以下扩展名: .log、.zip、.gz、.tar、.txt、.xml、.crash、.rtf

收集设备日志

  1. 登录到 Microsoft Intune 管理中心

  2. 导航到 “设备>管理设备>”“脚本和修正>平台脚本 ”,然后选择 macOS shell 脚本。

  3. “设备状态” 或“ 用户状态 报告”中,选择设备。

  4. 选择“ 收集日志”,提供仅用分号 ( 分隔的日志文件的文件夹路径;) 路径之间没有空格或换行符。
    例如,多个路径应编写为 /Path/to/logfile1.zip;/Path/to/logfile2.log

    重要

    使用逗号、句点、换行符或引号(带或不带空格)分隔的多个日志文件路径将导致日志收集错误。 也不允许将空格用作路径之间的分隔符。

  5. 选择“确定”。 下次设备上Intune管理代理使用 Intune 签入时,将收集日志。 此检查通常每 8 小时发生一次。

    注意

    • 收集的日志在设备上加密,传输并存储在 Microsoft Azure 存储中 30 天。 存储的日志按需解密,并使用 Microsoft Intune 管理中心下载。
    • 除了管理员指定的日志外,还会从以下文件夹中收集Intune管理代理日志: /Library/Logs/Microsoft/Intune~/Library/Logs/Microsoft/Intune。 代理日志文件名称为 IntuneMDMDaemon date--time.logIntuneMDMAgent date--time.log
    • 如果缺少任何管理员指定的文件或文件扩展名错误,你会发现这些文件名在 中 LogCollectionInfo.txt列出。

日志收集错误

由于下表中提供的任何以下原因,日志收集可能无法成功。 若要解决这些错误,请遵循修正步骤。

错误代码 (十六进制) 错误代码 (dec) 错误消息 修正步骤
0X87D300D1 2016214834 日志文件大小不能超过 60 MB。 确保压缩日志的大小小于 60 MB。
0X87D300D1 2016214831 提供的日志文件路径必须存在。 系统用户文件夹是日志文件的无效位置。 确保提供的文件路径有效且可访问。
0X87D300D2 2016214830 由于上传 URL 过期,日志收集文件上传失败。 重试 “收集日志” 操作。
0X87D300D3、0X87D300D5、0X87D300D7 2016214829, 2016214827, 2016214825 由于加密失败,日志收集文件上传失败。 重试日志上传。 重试 “收集日志” 操作。
2016214828 日志文件数超出了允许的 25 个文件的限制。 一次最多只能收集 25 个日志文件。
0X87D300D6 2016214826 由于 zip 错误,日志收集文件上传失败。 重试日志上传。 重试 “收集日志” 操作。
2016214740 无法加密日志,因为找不到压缩日志。 重试 “收集日志” 操作。
2016214739 日志已收集,但无法存储。 重试 “收集日志” 操作。

macOS 的自定义属性

可以创建自定义属性配置文件,使你能够使用 shell 脚本从托管 macOS 设备收集自定义属性。

为 macOS 设备创建和分配自定义属性

  1. 登录到 Microsoft Intune 管理中心

  2. 选择 “设备>按平台>macOS>组织设备>”“自定义 macOS>添加属性”。

  3. 在“基本信息”中,输入以下属性并选择“下一步”:

    • 名称:输入脚本的名称。
    • 说明:输入脚本的说明。 此设置是可选的,但建议进行。
  4. “属性设置”中,输入以下属性,然后选择“ 下一步”:

    • 属性的数据类型:选择脚本返回的结果的数据类型。 可用值为 StringIntegerDate
    • 脚本:选择脚本文件。

    其他详细信息:

    • shell 脚本必须回显要报告的属性,并且输出的数据类型必须与自定义属性配置文件中属性的数据类型匹配。
    • shell 脚本返回的结果必须为 20KB 或更小。

    注意

    使用 Date 类型属性时,请确保 shell 脚本以 ISO-8601 格式返回日期。 请参阅以下示例。

    使用时区打印符合 ISO-8601 的日期:

    #!/bin/sh
    var=$(date +"%Y-%m-%dT%H:%M:%S%z")
    echo $var # Prints an ISO-8601 compliant date with time-zone
    

    以 UTC 时间打印符合 ISO-8601 的日期:

    #!/bin/sh
    var=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    echo $var # Prints an ISO-8601 compliant date in UTC time
    
  5. “分配”中,单击“ 选择要包括的组”。 选择“选择组”以包含现有Microsoft Entra组列表时,将显示。 选择要接收脚本的一个或多个用户或设备组。 选择“选择”。 所选组将显示在列表中,并接收脚本策略。 或者,可以通过在“分配到”旁边的下拉框中选择其中一个选项来选择“所有用户”、“所有设备”或“所有用户和所有设备”。

    注意

    • 分配给用户组的脚本适用于登录到 Mac 的任何用户。
  6. 在“查看 + 添加”中,将显示你配置的设置的摘要。 选择“添加”以保存脚本。 选择“ 添加”时,脚本策略将部署到所选组。

创建的脚本现在显示在自定义属性列表中。 如果需要,可以在将自定义属性上传到Intune后查看它们的内容。

监视自定义属性策略

可以通过选择以下报表之一来监视用户和设备分配的所有自定义属性配置文件的运行状态:

  • 自定义属性>选择要监视>的自定义属性配置文件设备状态
  • 自定义属性>选择要监视>的自定义属性配置文件用户状态

重要

自定义属性配置文件中提供的 Shell 脚本每 8 小时在托管 Mac 上运行一次并报告。

自定义属性配置文件运行后,它将返回以下状态之一:

  • 状态为 “失败 ”表示脚本返回了非零退出代码或脚本格式不正确。 在 “结果 ”列中报告错误。
  • 状态为 “成功 ”指示脚本返回零作为退出代码。 脚本回显的输出在 “结果 ”列中报告。

常见问题解答

为什么分配的 shell 脚本未在设备上运行?

原因可能有多种:

  • 代理可能需要检查才能接收新的或更新的脚本。 此检查过程每 8 小时发生一次,与 MDM 检查不同。 确保设备已唤醒并连接到网络,以便代理成功检查,并等待代理检查。 还可以请求最终用户在 Mac 上打开公司门户,选择设备并单击“检查设置”。
  • 可能未安装代理。 检查代理是否已安装在 /Library/Intune/Microsoft Intune Agent.app macOS 设备上。
  • 代理可能未处于正常状态。 如果仍分配了 shell 脚本,代理将尝试恢复 24 小时、删除自身并重新安装。

报告脚本运行状态的频率如何?

脚本运行完成后,脚本运行状态将立即报告给Microsoft Intune管理中心。 如果脚本计划定期以设定的频率运行,则它仅在首次运行时报告状态。

何时再次运行 shell 脚本?

仅当配置了脚本 失败时要重试的最大次数 设置并且脚本在运行时失败时,才会再次运行脚本。 如果未配置 脚本失败时重试的最大次数 ,并且脚本在运行时失败,则不会再次运行,并且运行状态将报告为 失败

shell 脚本需要哪些Intune角色权限?

分配的 intune 角色需要 设备配置 权限才能删除、分配、创建、更新或读取 shell 脚本。

已知问题

  • 无脚本运行状态: 在不太可能的情况下,在设备上收到脚本,并且设备在报告运行状态之前脱机,设备将不会在管理中心报告脚本的运行状态。

其他信息

从 Microsoft Intune 为 macOS 设备部署 shell 脚本或自定义属性时,它会部署在 Apple Silicon Mac 计算机上本机运行的 Intune 管理代理应用的新通用版本。 相同的部署将在 Intel Mac 计算机上安装 x64 版本的应用。 若要在 Apple Silicon Mac 上运行 x64 (Intel) 版本的应用,需要使用 Rosetta 2。 若要在 Apple Silicon Macs 上自动安装 Rosetta 2,可以在 Intune 中部署 shell 脚本。 若要查看示例脚本,请参阅 Rosetta 2 安装脚本

后续步骤