从 Configuration Manager 控制台创建和运行 PowerShell 脚本

适用于: Configuration Manager(current branch)

Configuration Manager 具有运行 PowerShell 脚本的集成功能。 PowerShell 的优势是可以创建复杂的自动化脚本,以便与更大的社区理解和共享这些脚本。 这些脚本简化了构建用于管理软件的自定义工具,让您能够快速完成日常任务,从而使您能够更轻松、更一致地完成大型工作。

注意

在版本 2006 及更早版本中,Configuration Manager 默认情况下不启用此可选功能。 使用前必须启用此功能。 有关详细信息,请参阅 从更新启用可选功能

通过 Configuration Manager 中的此集成,可以使用“运行脚本”功能执行以下操作:

  • 创建和编辑脚本以与 Configuration Manager 配合使用。
  • 通过角色和安全范围管理脚本使用情况。
  • 脚本的文件夹支持。
  • 在集合或单个本地托管的 Windows 电脑上运行脚本。
  • 在集合或单个本地托管的 Windows 电脑上以 UTC 时间计划脚本运行时。
  • 从客户端设备获取快速聚合脚本结果。
  • 监控脚本执行并查看脚本输出的报告结果。

警告

  • 鉴于脚本的力量,我们提醒你在使用脚本时要有意识且谨慎。 我们内置了额外的保障措施来协助你;独立的角色和范围。 请务必在运行脚本之前验证脚本的准确性,并确认它们来自受信任的源,以防止意外的脚本执行。 注意扩展字符或其他混淆内容,并教育自己如何保护脚本。 详细了解 PowerShell 脚本安全性
  • 某些反恶意软件可能会无意中触发针对 Configuration Manager 运行脚本或 CMPivot 功能的事件。 建议排除 %windir%\CCM\ScriptStore,以便反恶意软件允许这些功能不受干扰地运行。

先决条件

  • 要运行 PowerShell 脚本,客户端必须运行 PowerShell 3.0 或更高版本。 但是,如果运行的脚本包含更高版本 PowerShell 中的功能,则运行该脚本的客户端必须运行该版本的 PowerShell。
  • Configuration Manager 客户端必须从 1706 版本或更高版本运行客户端才能运行脚本。
  • 要使用这些脚本,你必须是相应 Configuration Manager 安全角色的成员。
  • 若要导入和创作脚本 - 你的帐户必须具有创建短信脚本的权限。
  • 若要批准或拒绝脚本 - 你的帐户必须具有短信脚本“批准”权限。
  • 若要运行脚本 - 你的帐户必须具有“ 运行脚本 ”权限以获取 “集合”权限。

有关 Configuration Manager 安全角色的详细信息:
运行脚本
的安全范围运行脚本
的安全角色基于角色的管理基础知识

限制

运行脚本当前支持:

  • 脚本语言:PowerShell
  • 参数类型:整数、字符串和列表。

警告

请注意,使用参数时,它会为潜在的 PowerShell 注入攻击风险打开外围应用。 有多种方法可以缓解和解决,例如使用正则表达式验证参数输入或使用预定义参数。 常见的最佳做法是不要在 PowerShell 脚本中包含机密 (不包含密码等 ) 。 详细了解 PowerShell 脚本安全性

运行脚本作者和审批者

运行脚本使用 脚本作者脚本审批者的 概念作为脚本实现和执行的单独角色。 将作者和审批者角色分开,可以对“运行脚本”这一强大工具进行重要的进程检查。 还有一个附加 脚本运行器 角色,允许执行脚本,但不允许创建或审批脚本。 请参阅 为脚本创建安全角色

脚本角色控制

默认情况下,用户无法批准他们创作的脚本。 由于脚本功能强大、用途广泛,并且可以部署到许多设备上,因此您可以在脚本创作人员和脚本审批人员之间分离角色。 这些角色为防止在没有监督的情况下运行脚本提供了额外的安全级别。 可以关闭二次审批,以便于测试。

批准或拒绝脚本

脚本必须先由 脚本审批者 角色批准,然后才能运行。 若要批准脚本,请执行以下操作:

  1. 在 Configuration Manager 控制台中,单击“软件库”
  2. “软件库” 工作区中,单击 “脚本”
  3. “脚本” 列表中,选择要批准或拒绝的脚本,然后在“ 主页 ”选项卡的“ 脚本 ”组中,单击“ 批准/拒绝”
  4. “批准或拒绝脚本 ”对话框中,为脚本选择“ 批准”或 “拒绝” 。 (可选)输入有关您的决定的注释。 如果拒绝脚本,则无法在客户端设备上运行该脚本。
    脚本 - 审批
  5. 完成该向导。 在 “脚本 ”列表中,你会看到“ 审批状态 ”列发生变化,具体取决于你执行的操作。

允许用户批准自己的脚本

此批准主要用于脚本开发的测试阶段。

  1. 在 Configuration Manager 控制台中,单击“管理”
  2. “管理 ”工作区中,展开 “站点配置”,然后单击 “站点”
  3. 在网站列表中,选择你的网站,然后在“ 开始 ”选项卡的 “网站 ”组中,单击“ 层次结构设置”。
  4. “层次结构设置属性”对话框的“常规”选项卡上,清除复选框“脚本作者需要其他脚本审批者”

重要

作为最佳实践,不应允许脚本作者批准自己的脚本。 应仅在实验室设置中允许。 仔细考虑在生产环境中更改此设置的潜在影响。

安全范围

运行脚本使用安全作用域(Configuration Manager 的现有功能)通过分配代表用户组的标记来控制脚本创作和执行。 有关使用安全范围的详细信息,请参阅 为 Configuration Manager 配置基于角色的管理

为脚本创建安全角色

默认情况下,Configuration Manager 中不会创建用于运行脚本的三个安全角色。 要创建脚本运行者、脚本作者和脚本审批者角色,请按照概述的步骤操作。

  1. 在 Configuration Manager 控制台中,转到“管理>”安全>安全角色
  2. 右键单击某个角色,然后单击 “复制”。 您复制的角色已分配权限。 确保仅获取所需权限。
  3. 为自定义角色提供 名称说明
  4. 为安全角色分配下面概述的权限。

安全角色权限

角色名称: 脚本运行程序

  • 说明: 这些权限使此角色只能运行以前由其他角色创建和批准的脚本。
  • 权限: 确保将以下内容设置为 “是”
类别 权限 状态
集合 运行脚本
Site 阅读
短信脚本 阅读

角色名称: 脚本作者

  • 说明: 这些权限使此角色能够创作脚本,但他们无法批准或运行脚本。
  • 权限:确保设置以下权限。
类别 权限 状态
集合 运行脚本
Site 阅读
短信脚本 创建
短信脚本 阅读
短信脚本 删除
短信脚本 修改

角色名称: 脚本审批者

  • 说明: 这些权限使此角色能够批准脚本,但他们无法创建或运行脚本。
  • 权限: 确保设置以下权限。
类别 权限 状态
集合 运行脚本
Site 阅读
短信脚本 阅读
短信脚本 批准
短信脚本 修改

脚本作者角色的短信脚本权限示例

脚本作者角色的短信脚本权限示例

脚本的文件夹支持

从版本 2403 开始,可以使用文件夹来组织脚本。 此更改允许更好地分类和管理脚本。

打开 Configuration Manager 控制台,然后转到“软件库”工作区。 从功能区或右键单击菜单的脚本中,从以下选项中选择:

  • 创建文件夹
  • 删除文件夹
  • 重命名文件夹
  • 移动文件夹
  • 设置安全范围

创建脚本

  1. 在 Configuration Manager 控制台中,单击“软件库”
  2. “软件库” 工作区中,单击 “脚本”
  3. 主页 选项卡的 创建 组中,单击 创建脚本
  4. 在“创建脚本”向导的“脚本”页上,配置以下设置:
    • 脚本名称 - 输入脚本的名称。 虽然可以创建多个同名脚本,但使用重复名称会使你更难在 Configuration Manager 控制台中找到所需的脚本。
    • 脚本语言 - 目前仅支持 PowerShell 脚本。
    • 导入 - 将 PowerShell 脚本导入控制台。 脚本显示在 “脚本 ”字段中。
    • 清除 - 从脚本字段中删除当前脚本。
    • 脚本 - 显示当前导入的脚本。 可以根据需要编辑此字段中的脚本。
  5. 完成该向导。 新脚本显示在 “脚本” 列表中,状态为“ 等待批准”。 必须先批准它,然后才能在客户端设备上运行此脚本。

重要

使用“运行脚本”功能时,请避免为设备重启或重启 Configuration Manager 代理编写脚本。 这样做可能会导致持续重新启动状态。 如果需要,还可以增强客户端通知功能,从而支持重新启动设备。 “挂起的重启”列有助于识别需要重启的设备。

脚本参数

向脚本添加参数可以提高工作的灵活性。 最多可以包含 10 个参数。 下面概述了“运行脚本”功能的当前功能,其中包含以下脚本参数: 字符串整数 数据类型。 还提供预设值列表。 如果脚本具有不受支持的数据类型,则会收到警告。

“创建脚本”对话框中,单击“脚本”下的“脚本参数”。

脚本的每个参数都有自己的对话框,用于添加更多详细信息和验证。 如果脚本中存在默认参数,它将在参数 UI 中枚举,你可以设置它。 Configuration Manager 不会覆盖默认值,因为它永远不会直接修改脚本。 可以将此视为在 UI 中提供了“预填充的建议值”,但 Configuration Manager 不提供对运行时“默认”值的访问权限。 这可以通过编辑脚本使其具有正确的默认值来解决。

重要

参数值不能包含单引号。

存在一个已知问题,即包含或括在单引号中的参数值无法正确传递到脚本。 指定在脚本中包含空格的默认参数值时,请改用双引号。 在创建或执行 脚本期间指定默认参数值时,无论值是否包含空格,都不需要用双引号或单引号括住默认值。

参数验证

脚本中的每个参数都有一个“ 脚本参数属性 ”对话框,供你添加该参数的验证。 添加验证后,如果为参数输入的值不符合其验证,则应收到错误。

示例: FirstName

在此示例中,可设置字符串参数 FirstName 的属性。

脚本参数 - 字符串

脚本参数属性 ”对话框的验证部分包含以下字段供您使用:

  • 最小长度 - FirstName 字段的最小字符数。
  • 最大长度 - FirstName 字段的最大字符数
  • 正则表达式 - 正则表达式的缩写。 有关使用正则表达式的详细信息,请参阅下一节 使用正则表达式验证
  • 自定义错误 - 可用于添加取代任何系统验证错误消息的自定义错误消息。

使用正则表达式验证

正则表达式是一种紧凑的编程形式,用于根据编码的验证检查字符串。 例如,可以通过放置[^A-Z]则表达式字段来检查 FirstName 字段中是否缺少大写字母字符。

.NET Framework 支持此对话框的正则表达式处理。 有关使用正则表达式的指南,请参阅 .NET 正则表达式正则表达式语言

脚本示例

下面是几个示例,说明你可能想要与此功能一起使用的脚本。

创建新文件夹和文件

根据你的命名输入,此脚本会在文件夹内创建一个新文件夹和一个文件。

Param(
[Parameter(Mandatory=$True)]
[string]$FolderName,
[Parameter(Mandatory=$True)]
[string]$FileName
)

New-Item $FolderName -type directory
New-Item $FileName -type file

获取操作系统版本

此脚本使用 WMI 查询计算机的操作系统版本。

Write-Output (Get-WmiObject -Class Win32_operatingSystem).Caption

编辑或复制 PowerShell 脚本

可以 编辑复制“运行脚本 ”功能一起使用的现有 PowerShell 脚本。 现在直接编辑它,而不是重新创建需要更改的脚本。 这两个操作都使用与创建新脚本时相同的向导体验。 编辑或复制脚本时,Configuration Manager不会保留审批状态。

提示

不要编辑正在客户端上主动运行的脚本。 它们无法完成运行原始脚本,并且您可能无法从这些客户端获得预期的结果。

编辑脚本

  1. 转到软件库工作区下的脚本节点。
  2. 选择要编辑的脚本,然后单击功能区中的 “编辑 ”。
  3. 在“ 脚本详细信息 ”页面中更改或重新导入脚本。
  4. 单击 “下一步 ”查看 摘要 ,然后在完成编辑后 单击“关闭”

复制脚本

  1. 转到软件库工作区下的脚本节点。
  2. 选择要复制的脚本,然后单击功能区中的 “复制 ”。
  3. “脚本名称” 字段中重命名脚本,并进行可能需要的任何其他编辑。
  4. 单击 “下一步 ”查看 摘要 ,然后在完成编辑后 单击“关闭”

运行脚本

脚本获得批准后,可以针对单个设备或集合运行它。 脚本开始执行后,它将通过高优先级系统快速启动,该系统会在一小时内超时。 然后使用状态消息系统返回脚本的结果。

要为脚本选择目标集合,请执行以下操作:

  1. 在 Configuration Manager 控制台中,单击“资产和合规性”。
  2. 在资产和合规性工作区中,单击 设备集合
  3. “设备集合 ”列表中,单击要在其上运行脚本的设备集合。
  4. 选择所选集合,单击“ 运行脚本”
  5. “运行脚本”向导的“脚本”页上,从列表中选择脚本。 仅显示已批准的脚本。
  6. 单击 “下一步”,然后完成向导。

重要

如果脚本未运行(例如,由于目标设备在一小时内关闭),则必须再次运行它。

计划脚本的运行时

从 Configuration Manager 当前分支版本 2309 开始,现在可以在 UTC 中计划脚本的运行时。

对集合计划脚本执行:

  1. 在 Configuration Manager 控制台中,单击“资产和合规性”。

  2. 在资产和合规性工作区中,单击 设备集合

  3. “设备集合 ”列表中,单击要在其上安排脚本的设备集合。

  4. 选择所选集合,单击“ 运行脚本”

  5. 在“ 计划”页上,“计划脚本运行时间”复选框,然后指定“计划时间(以 UTC 为单位)。

  6. 验证 摘要页上显示的详细信息。

  7. 单击 “下一步”,然后完成向导。

    脚本的屏幕截图 - 计划。

注意

每 5 分钟最多处理 25 个计划脚本。

目标计算机执行

脚本作为目标客户端上的 系统计算机 帐户执行 () 。 此帐户的网络访问权限有限。 必须相应地预配通过脚本对远程系统和位置的任何访问。

脚本监视

在设备集合上开始运行脚本后,使用以下过程监视操作。 您可以在脚本执行时实时监视脚本,并在稍后返回给定运行脚本执行的状态和结果。 脚本状态数据作为 “删除过时客户端操作”维护任务 或脚本删除的一部分进行清理。

脚本监视器 - 脚本运行状态

  1. 在 Configuration Manager 控制台中,单击“监视”

  2. “监视 ”工作区中,单击 “脚本状态”。

  3. “脚本状态 ”列表中,可以查看在客户端设备上运行的每个脚本的结果。 脚本退出代码 0 通常表示脚本成功运行。

    脚本监视器 - 截断脚本

计划脚本 监视集合

  1. 在 Configuration Manager 控制台中,单击“监视”

  2. 在“监视”工作区中,单击 “计划脚本”节点

  3. 计划 脚本列表中将显示一个新行。

  4. 验证已在计划脚本列表中显示新行。 状态列的值应为 “已计划”ClientOperationId 列应为空。 验证其他列(如脚本名称、计划时间等)是否具有适当的值。

  5. 计划时间之后,刷新“ 计划脚本” 节点。 状态列的值应为 “已成功启动客户端操作”ClientOperationId 列应具有整数值。

  6. 在监控工作区中,单击 脚本状态节点。验证列表中是否显示了新行,且 ClientOperationId 等于 “计划脚本” 节点中的 ClientOperationId。

  7. 单击“ 查看状态” 并确保显示脚本输出。

    脚本的屏幕截图 - 计划监视、

脚本输出

通过将脚本结果通过管道传递到 ConvertTo-Json cmdlet,使用 JSON 格式的客户端返回脚本输出。 JSON 格式始终返回可读的脚本输出。 对于不将对象作为输出返回的脚本,ConvertTo-Json cmdlet 会将输出转换为客户端返回的简单字符串,而不是 JSON。

  • 获得未知结果或客户端脱机的脚本不会显示在图表或数据集中。

  • 避免返回较大的脚本输出,因为它已被截断为 4KB。

  • 在脚本中将枚举对象转换为字符串值,以便它们以 JSON 格式正确显示。

    将枚举对象转换为 sting 值

可以原始或结构化 JSON 格式查看详细的脚本输出。 这种格式设置使输出更易于阅读和分析。 如果脚本返回有效的 JSON 格式文本,或者可以使用 ConvertTo-Json PowerShell cmdlet 将输出转换为 JSON,请将详细输出视图为 JSON 输出原始输出。 否则,唯一的选项就是 脚本输出

示例:脚本输出可转换为有效的 JSON

命令: $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      16299  551

示例:脚本输出不是有效的 JSON

命令: Write-Output (Get-WmiObject -Class Win32_OperatingSystem).Caption

Microsoft Windows 10 Enterprise

日志文件

  • 在客户端上,默认情况下,在 C:\Windows\CCM\logs 中:

    • Scripts.log
    • CcmMessaging.log
  • 在 MP 上,默认在 C:\SMS_CCM\Logs 中:

    • MP_RelayMsgMgr.log
  • 在站点服务器上,默认情况下,在 C:\Program Files\Configuration Manager\Logs 中:

    • SMS_Message_Processing_Engine.log

使用 Windows PowerShell 自动化

可以使用以下 PowerShell cmdlet 自动执行其中一些任务:

另请参阅