在 Intune 中的 Windows 10/11 设备上使用 PowerShell 脚本

使用 Microsoft Intune 管理扩展在 Intune 中上传 PowerShell 脚本。 然后,在 Windows 10 设备上运行这些脚本。 管理扩展增强了 Windows 设备管理 (MDM),以便更轻松地采用新式管理。

重要

若要支持扩展功能和 bug 修复,请将 .NET Framework 4.7.2 或更高版本与 Windows 客户端上的 Intune 管理扩展配合使用。 如果 Windows 客户端继续使用早期版本的 .NET Framework,Intune管理扩展将继续正常运行。 .NET Framework 4.7.2 自 2018 年 7 月 10 日起从 Windows 更新 提供,它包含在 Win10 1809 (RS5) 及更新中。 请注意,.NET Framework版本的多个版本可以在设备上共存。

此功能适用于:

  • Windows 10 及更高版本(Windows 10 家庭版除外)

注意

满足Intune管理扩展先决条件后,将 PowerShell 脚本或 Win32 应用、Microsoft Store 应用、自定义合规性策略设置或主动修正分配给用户或设备时,将自动安装Intune管理扩展。 有关详细信息,请参阅 Intune 管理扩展先决条件

“工作区加入”(WPJ) 设备上不正式支持的 PowerShell 脚本可部署到 WPJ 设备。 具体而言,设备上下文 PowerShell 脚本可在 WPJ 设备上运行,但用户上下文 PowerShell 脚本因自身性质而会被忽略。 用户上下文脚本将在 WPJ 设备上被忽略,并且不会向Microsoft Intune管理中心报告。

迁移到新式管理

最终用户的计算系统正在向数字化转型。 传统的 IT 侧重于单个设备平台、企业拥有的设备、在办公室办公的用户,以及不同的手动、反应式 IT 过程。 现代工作区使用由用户和业务拥有的许多平台。 这样使用户能够在任何位置工作,并提供自动化和主动的 IT 过程。

Microsoft Intune 等 MDM 服务可以管理运行 Windows 10 的移动和桌面设备。 Windows 10 内置管理客户端可与 Intune 进行通信,以运行企业管理任务。 你可能需要执行一些任务,例如高级设备配置和故障排除。 对于 Win32 应用管理,可以在 Windows 10 设备上使用 Win32 应用管理功能。

Intune 管理扩展对 Windows 10 MDM 内置功能进行了补充。 可创建在 Windows 10 设备上运行的 PowerShell 脚本。 例如,创建执行高级设备配置的 PowerShell 脚本。 然后,将脚本上传到Intune,将脚本分配给Microsoft Entra组,然后运行脚本。 然后,可全程监视脚本运行状态。

准备工作

  • 将脚本设置为用户上下文且最终用户拥有管理员权限时,默认情况下将在管理员权限下运行 PowerShell 脚本。

  • 最终用户无需登录设备即可执行 PowerShell 脚本。

  • 每次重新启动后,Intune 管理扩展代理都会检查是否有任何新脚本或更改。 将策略分配给Microsoft Entra组后,PowerShell 脚本将运行,并报告运行结果。 脚本执行后,除非脚本或策略发生更改,否则不会再次执行。 如果脚本失败,Intune 管理扩展代理会尝试在接下来的连续三次 Intune 管理扩展代理签入中重试脚本三次。

  • 对于共享设备,将为每位登录的新用户运行 PowerShell 脚本。

  • PowerShell 脚本会在 Win32 应用运行之前执行。 换言之,将首先执行 PowerShell 脚本。 然后,执行 Win32 应用。

  • PowerShell 脚本在 30 分钟后超时。

重要

使用 PowerShell 脚本和修正脚本时的隐私意识最佳做法包括:

  • 请勿在脚本中包含任何类型的敏感信息 (,例如密码)
  • 请勿在脚本中包含个人身份信息 (PII)
  • 不要使用脚本从设备收集 PII
  • 始终遵循隐私最佳做法

有关相关信息,请参阅 修正

先决条件

Intune 管理扩展具有以下先决条件。 满足先决条件后,在向用户或设备分配 PowerShell 脚本或 Win32 应用时,系统将自动安装 Intune 管理扩展。

  • 运行 Windows 10 版本 1607 或更高版本的设备。 如果设备是通过批量自动注册进行注册的,设备必须运行 Windows 10 版本 1709 或更高版本。 Windows 10 上的 S 模式不支持 Intune 管理扩展,因为该模式禁止运行非存储应用。

  • 已加入Microsoft Entra ID的设备,包括:

  • Microsoft Entra已注册/已加入工作区 (WPJ) :在 Microsoft Entra ID 中注册的设备,有关详细信息,请参阅工作区加入作为无缝第二因素身份验证。 通常,这些是自带设备 (BYOD) 设备,这些设备已通过“设置帐户>访问工作或学校”>添加了工作或学校帐户。

  • 在 Intune 中注册的设备,其中包括:

    • 在组策略 (GPO) 中注册的设备。 相关指南请参阅通过组策略自动注册 Windows 10 设备

    • 在 Intune 中手动注册的设备,即在下述情况下注册的设备:

      • Microsoft Entra ID中启用了自动注册到Intune。 用户使用本地用户帐户登录到设备,并手动加入设备以Microsoft Entra ID。 然后,他们使用其Microsoft Entra帐户登录到设备。

      OR

      • 用户使用其Microsoft Entra帐户登录到设备,然后注册Intune。
    • 使用 Configuration Manager 和 Intune 的共同托管设备。 安装 Win32 应用时,请确保将“应用”工作负载设置为“试点 Intune”或“Intune”。 即使将“应用”工作负载设置为“Configuration Manager”,也会运行 PowerShell 脚本。 将 PowerShell 脚本面向设备时,Intune 管理扩展将部署到设备。 请记住,设备必须是Microsoft Entra ID或Microsoft Entra混合联接设备。 此外,还必须运行 Windows 10 版本 1607 或更高版本。 若要获取指南,请参阅下列文章:

  • 如果设备的系统时钟超出日期 (月或年),则部署到运行 Intune 管理扩展客户端的脚本将无法运行。 系统时钟更新后,脚本将按预期运行。

注意

要了解如何使用 Window 10 虚拟机,请参阅将 Windows 10 虚拟机与 Intune 配合使用

创建脚本策略并分配该策略

  1. 登录到Microsoft Intune管理中心

  2. 选择“设备>脚本”和“修正>平台脚本>”“添加>Windows 10及更高版本”。

    显示为 Windows 10 设备创建新脚本的屏幕截图。

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

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

    • 脚本位置:浏览查找该 PowerShell 脚本。 脚本必须小于 200 KB (ASCII)。

    • 使用登录凭据运行此脚本:选择“ ” (默认) ,在设备上使用用户的凭据运行脚本。 选择“ ”可在系统上下文中运行脚本。 许多管理员选择“是”。 如果脚本必须在系统上下文中运行,请选择“”。

    • 强制检查脚本签名:如果脚本必须由受信任的发布者签名,请选择“” (默认) 。 如果不需要对脚本进行签名,请选择“ ”。

    • 在 64 位 PowerShell 主机中运行脚本:选择“”,可以在 64 位客户端体系结构上的 64 位 PowerShell (PS) 主机中运行脚本。 选择“”(默认),在 32 位 PowerShell 主机中运行脚本。

      设置为“”或“”时,请对新策略行为和现有策略行为使用下表:

      在 64 位 PS 主机中运行脚本 客户端体系结构 新脚本 现有的策略脚本
      32 位 支持 32 位 PowerShell 主机 仅在 32 位 PowerShell 主机中运行,该主机适用于 32 位和 64 位体系结构。
      64 位 在适用于 64 位体系结构的 64 位 PowerShell 主机中运行脚本。 在 32 位上运行时,脚本在 32 位 PowerShell 主机中运行。 在 32 位 PowerShell 主机中运行脚本。 如果此设置更改为 64 位,则脚本将在 64 位 PowerShell 主机中打开(它不会运行),并报告结果。 在 32 位上运行时,脚本在 32 位 PowerShell 主机中运行。
  5. 选择“作用域标记”。 作用域标记是可选的。 有关详细信息,请参阅对分布式 IT 使用基于角色的访问控制 (RBAC) 和作用域标记

    添加作用域标记:

    1. 选择“选择范围标记>”,从“选择”列表中选择>现有的范围标记。

    2. 完成后,选择“下一步”。

  6. 选择“分配”> 选择要包含的组。 将显示Microsoft Entra组的现有列表。

    1. 选择一个或多个组,其中的用户的设备会接收该脚本。 选择“选择”。 你选择的组将显示在列表中,并将收到策略。

      注意

      Intune中的 PowerShell 脚本可以面向Microsoft Entra设备安全组或Microsoft Entra用户安全组。 但是,当将加入工作区 (WPJ) 设备时,只能使用Microsoft Entra设备安全组, (用户目标将忽略) 。 有关详细信息,请参阅工作区加入 (WPJ) 设备的 Win32 应用支持

    2. 选择 下一步

      将 PowerShell 脚本分配或部署到 Microsoft Intune 中的设备组

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

无法运行脚本示例

上午 8 点

  • 签入
  • 运行脚本 ConfigScript01
  • 脚本失败

上午 9 点

  • 签入
  • 运行脚本 ConfigScript01
  • 脚本失败(重试次数 = 1)

上午 10 点

  • 签入
  • 运行脚本 ConfigScript01
  • 脚本失败(重试次数 = 2)

上午 11 点

  • 签入
  • 运行脚本 ConfigScript01
  • 脚本失败(重试次数 = 3)

中午 12 点

  • 签入
  • 没有额外尝试运行 ConfigScript01 脚本。
  • 如果没有对脚本进行其他任何更改,则不会额外尝试运行脚本。

监视运行状态

可在门户中监视用户和设备的 PowerShell 脚本运行状态。

在“PowerShell 脚本”中,选择要监视的脚本并选择“监视”,然后选择以下报表之一:

  • 设备状态
  • 用户状态

Intune 管理扩展日志

客户端计算机上的代理日志通常位于 C:\ProgramData\Microsoft\IntuneManagementExtension\Logs。 可以使用 CMTrace.exe 查看这些日志文件。

Microsoft Intune 中的屏幕截图或 cmtrace 代理日志示例

删除脚本

在“PowerShell 脚本”中,右键单击该脚本,然后选择“删除”。

常见问题和解决方法

问题:未下载 Intune 管理扩展

可能的解决方法

  • 设备未加入到Microsoft Entra ID。 请确保设备满足本文中的先决条件
  • 未向用户或设备所属的组分配任何 PowerShell 脚本或 Win32 应用。
  • 设备无法使用 Intune 服务签入。 例如,没有 Internet 访问权限,无法访问 Windows 推送通知服务 (WNS) 等。
  • 设备处于 S 模式下。 S 模式下运行的设备不支持 Intune 管理扩展。

要查看是否会自动注册设备,可执行以下操作:

  1. 转至“设置”>“帐户”>“访问工作或学校”。
  2. 选择已加入的帐户 >信息
  3. 在“高级诊断报告”下,选择“创建报表”。
  4. 在 Web 浏览器中,打开 MDMDiagReport
  5. 搜索 MDMDeviceWithAAD 属性。 如果存在此属性,则设备已自动注册。 如果没有此属性,则未自动注册设备。

启用 Windows 10 自动注册分步介绍了如何在 Intune 中配置自动注册功能。

问题:PowerShell 脚本未运行

可能的解决方法

  • PowerShell 脚本不会在每次登录时运行。 它们在下述情况下运行:

    • 在向设备分配脚本时

    • 如果更改了脚本,请将其上传,再将其分配给用户或设备

      提示

      Microsoft Intune 管理扩展是一项在设备上运行的服务,如同服务应用 (services.msc) 中列出中的任何其他服务一样。 设备重启后,此服务可能也会重启,并检查是否随附 Intune 服务分配了任何 PowerShell 脚本。 如果 Microsoft Intune 管理扩展服务设置为“手动”,则设备重启后可能不会重启此服务。

  • 确保设备已加入Microsoft Entra ID。 仅在 Microsoft Entra ID) 中注册 (加入工作区或组织的设备不会收到脚本。

  • 确认 Intune 管理扩展已下载到 %ProgramFiles(x86)%\Microsoft Intune Management Extension

  • 未在 Surface Hub 或 Windows 10 的 S 模式下运行的脚本。

  • 检查日志是否存在任何错误。 请参阅(本文中的)Intune 管理扩展日志

  • 对于可能的权限问题,确保将 PowerShell 脚本的属性设置为 Run this script using the logged on credentials。 另外,确保已登录的用户具有适当的权限来运行脚本。

  • 要隔离脚本问题,可以:

    • 检查设备上的 PowerShell 执行配置。 相关指南请参阅PowerShell 执行策略

    • 使用 Intune 管理扩展运行示例脚本。 例如,创建 C:\Scripts 目录,并为每个人提供完全控制权限。 运行以下脚本:

      write-output "Script worked" | out-file c:\Scripts\output.txt
      

      如果成功,应创建 output.txt,其中应包括“脚本已运行”文本。

    • 要在不使用 Intune 的情况下测试脚本执行,请在系统帐户中本地使用 psexec 工具来运行脚本:

      psexec -i -s

    • 如果脚本报告它成功,但实际上没有成功,那么防病毒服务可能是沙盒 AgentExecutor。 以下脚本始终在 Intune 中报告失败。 可以使用此脚本进行测试:

      Write-Error -Message "Forced Fail" -Category OperationStopped
      mkdir "c:\temp" 
      echo "Forced Fail" | out-file c:\temp\Fail.txt
      

      如果脚本报告成功,请查看 AgentExecutor.log 以确认错误输出。 如果脚本执行,长度应为 >2。

    • 为捕获 .error.output 文件,以下代码片段会通过 AgentExecutor 将脚本执行到 PowerShell x86 (C:\Windows\SysWOW64\WindowsPowerShell\v1.0)。 它会保留日志以供查看。 请记住,Intune 管理扩展会在脚本执行后清除日志:

      $scriptPath = read-host "Enter the path to the script file to execute"
      $logFolder = read-host "Enter the path to a folder to output the logs to"
      $outputPath = $logFolder+"\output.output"
      $errorPath =  $logFolder+"\error.error"
      $timeoutPath =  $logFolder+"\timeout.timeout"
      $timeoutVal = 60000 
      $PSFolder = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0"
      $AgentExec = "C:\Program Files (x86)\Microsoft Intune Management Extension\agentexecutor.exe"
      &$AgentExec -powershell  $scriptPath $outputPath $errorPath $timeoutPath $timeoutVal $PSFolder 0 0
      

后续步骤

配置文件的监视故障排除