从 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 安全角色的成员。
- 若要导入和创作脚本 - 你的帐户必须具有 SMS 脚本的“创建”权限。
- 若要批准或拒绝脚本 - 帐户必须具有短信脚本的“批准”权限。
- 若要运行脚本 - 你的帐户必须具有“集合”的“运行脚本”权限。
有关 Configuration Manager 安全角色的详细信息:
运行脚本
的安全作用域安全角色运行脚本
基于角色的管理基础知识。
限制
运行脚本当前支持:
- 脚本语言:PowerShell
- 参数类型:整数、字符串和列表。
警告
请注意,使用参数时,它会打开潜在的 PowerShell 注入攻击风险的外围应用。 有多种缓解和解决方法,例如使用正则表达式验证参数输入或使用预定义参数。 常见的最佳做法是不要在 PowerShell 脚本中包含机密 (无密码等 ) 。 详细了解 PowerShell 脚本安全性
运行脚本作者和审批者
运行脚本使用 脚本作者 和 脚本审批者 的概念作为实现和执行脚本的单独角色。 将作者和审批者角色分开后,可以对运行脚本的强大工具进行重要的过程检查。 还有一个额外的 脚本运行程序 角色,它允许执行脚本,但不允许创建或批准脚本。 请参阅 为脚本创建安全角色。
脚本角色控制
默认情况下,用户无法批准他们创作的脚本。 由于脚本功能强大、用途广泛,并且可能部署到许多设备,因此你可以将脚本的作者和批准脚本的人员之间的角色分开。 这些角色提供了额外的安全级别,防止在没有监督的情况下运行脚本。 为了便于测试,你可以关闭辅助审批。
批准或拒绝脚本
脚本必须经过 脚本审批者 角色的批准,然后才能运行脚本。 若要批准脚本,请执行以下操作:
- 在 Configuration Manager 控制台中,单击“ 软件库”。
- 在 “软件库 ”工作区中,单击“ 脚本”。
- 在 “脚本 ”列表中,选择要批准或拒绝的脚本,然后在“ 开始 ”选项卡上的“ 脚本 ”组中,单击“ 批准/拒绝”。
- 在 “批准或拒绝脚本 ”对话框中,为脚本选择“ 批准”或 “拒绝 ”。 (可选)输入有关决策的注释。 如果拒绝脚本,则无法在客户端设备上运行该脚本。
- 完成该向导。 在 “脚本 ”列表中,可以看到“ 审批状态 ”列会根据你执行的操作而更改。
允许用户批准自己的脚本
此审批主要用于脚本开发的测试阶段。
- 在 Configuration Manager 控制台中,单击“ 管理”。
- 在 “管理 ”工作区中,展开“ 站点配置”,然后单击“ 站点”。
- 在网站列表中,选择你的网站,然后在“ 主页 ”选项卡上的“ 网站 ”组中,单击“ 层次结构设置”。
- 在“层次结构设置属性”对话框的“常规”选项卡上,清除“脚本作者需要其他脚本审批者”复选框。
重要
最佳做法是,不应允许脚本作者批准自己的脚本。 应仅在实验室设置中允许它。 仔细考虑在生产环境中更改此设置的潜在影响。
安全范围
运行脚本使用安全作用域(Configuration Manager 的现有功能)通过分配表示用户组的标记来控制脚本创作和执行。 有关使用安全作用域的详细信息,请参阅 配置 Configuration Manager 的基于角色的管理。
为脚本创建安全角色
默认情况下,不会在 Configuration Manager 中创建用于运行脚本的三个安全角色。 若要创建脚本运行程序、脚本作者和脚本审批者角色,请按照概述的步骤操作。
- 在 Configuration Manager 控制台中,转到 管理>安全>角色
- 右键单击某个角色,然后单击“ 复制”。 复制的角色已分配有权限。 请确保仅获取所需的权限。
- 为自定义角色提供 “名称” 和 “说明”。
- 为安全角色分配下面概述的权限。
安全角色权限
角色名称:脚本运行程序
- 说明:这些权限使此角色只能运行以前由其他角色创建和批准的脚本。
- 权限: 确保将以下内容设置为 “是”。
类别 | 权限 | 状态 |
---|---|---|
集合 | 运行脚本 | 是 |
Site | 阅读 | 是 |
SMS 脚本 | 阅读 | 是 |
角色名称:脚本作者
- 说明:这些权限使此角色能够创作脚本,但无法批准或运行脚本。
- 权限:确保设置了以下权限。
类别 | 权限 | 状态 |
---|---|---|
集合 | 运行脚本 | 否 |
Site | 阅读 | 是 |
SMS 脚本 | 创建 | 是 |
SMS 脚本 | 阅读 | 是 |
SMS 脚本 | 删除 | 是 |
SMS 脚本 | 修改 | 是 |
角色名称:脚本审批者
- 说明:这些权限使此角色能够批准脚本,但无法创建或运行脚本。
- 权限: 确保设置了以下权限。
类别 | 权限 | 状态 |
---|---|---|
集合 | 运行脚本 | 否 |
Site | 阅读 | 是 |
SMS 脚本 | 阅读 | 是 |
SMS 脚本 | 批准 | 是 |
SMS 脚本 | 修改 | 是 |
脚本作者角色的 SMS 脚本权限示例
脚本的文件夹支持
从版本 2403 开始,可以使用文件夹来组织脚本。 此更改允许更好地对脚本进行分类和管理。
打开 Configuration Manager 控制台并转到“软件库”工作区。 在功能区或右键单击菜单中的“脚本”中,从以下选项中进行选择:
- 创建文件夹
- 删除文件夹
- 重命名文件夹
- 移动文件夹
- 设置安全作用域
创建脚本
- 在 Configuration Manager 控制台中,单击“ 软件库”。
- 在 “软件库 ”工作区中,单击“ 脚本”。
- 在“ 开始 ”选项卡上的“ 创建 ”组中,单击“ 创建脚本”。
- 在“创建 脚本” 向导的“ 脚本” 页上,配置以下设置:
- 脚本名称 - 输入脚本的名称。 虽然可以创建具有相同名称的多个脚本,但使用重复名称会使你在 Configuration Manager 控制台中查找所需的脚本更加困难。
- 脚本语言 - 目前仅支持 PowerShell 脚本。
- 导入 - 将 PowerShell 脚本导入控制台。 脚本显示在 “脚本” 字段中。
- Clear - 从“脚本”字段中删除当前脚本。
- 脚本 - 显示当前导入的脚本。 可以根据需要编辑此字段中的脚本。
- 完成该向导。 新脚本显示在 “脚本 ”列表中,状态为 “正在等待审批”。 在客户端设备上运行此脚本之前,必须对其进行批准。
重要
使用“运行脚本”功能时,请避免编写设备重新启动或 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
获取 OS 版本
此脚本使用 WMI 来查询计算机的 OS 版本。
Write-Output (Get-WmiObject -Class Win32_operatingSystem).Caption
编辑或复制 PowerShell 脚本
可以 编辑 或 复制 与 “运行脚本” 功能一起使用的现有 PowerShell 脚本。 现在直接编辑脚本,而不是重新创建需要更改的脚本。 这两个操作使用与创建新脚本时相同的向导体验。 编辑或复制脚本时,Configuration Manager 不会保留审批状态。
提示
不要编辑在客户端上主动运行的脚本。 它们不会完成原始脚本的运行,你可能无法从这些客户端获得预期结果。
编辑脚本
- 转到“软件库”工作区下的“脚本”节点。
- 选择要编辑的脚本,然后单击功能区中的“ 编辑 ”。
- 在“脚本详细信息”页中更改或重新导入 脚本 。
- 单击 “下一步 ”查看 “摘要” ,然后在完成编辑后 单击“关闭 ”。
复制脚本
- 转到“软件库”工作区下的“脚本”节点。
- 选择要复制的脚本,然后单击功能区中的“ 复制 ”。
- 在“ 脚本名称 ”字段中重命名脚本,然后进行可能需要的任何其他编辑。
- 单击 “下一步 ”查看 “摘要” ,然后在完成编辑后 单击“关闭 ”。
运行脚本
脚本获得批准后,可以针对单个设备或集合运行该脚本。 开始执行脚本后,它会通过一小时内超时的高优先级系统快速启动。 然后,使用状态消息系统返回脚本的结果。
若要为脚本选择目标集合,请执行以下操作:
- 在 Configuration Manager 控制台中,单击“ 资产和符合性”。
- 在“资产和符合性”工作区中,单击“ 设备集合”。
- 在 “设备集合” 列表中,单击要运行脚本的设备集合。
- 选择所选的集合,单击“ 运行脚本”。
- 在“运行脚本”向导的“脚本”页上,从列表中选择一个脚本。 仅显示已批准的脚本。
- 单击“ 下一步”,然后完成向导。
重要
如果脚本未运行,例如,因为目标设备在一小时内关闭,则必须再次运行它。
计划脚本的运行时
从 Configuration Manager Current Branch 版本 2309 开始,现在可以在 UTC 中计划脚本的运行时。
计划集合上的脚本执行:
在 Configuration Manager 控制台中,单击“ 资产和符合性”。
在“资产和符合性”工作区中,单击“ 设备集合”。
在 “设备集合” 列表中,单击要为其计划脚本的设备集合。
选择所选的集合,单击“ 运行脚本”。
在 “计划”页上,“计划脚本在运行时间”复选框,并指定“计划时间”(以 UTC 为单位)。
验证 摘要页上显示的详细信息。
单击“ 下一步”,然后完成向导。
注意
每 5 分钟最多会生成 25 个计划脚本。
目标计算机执行
脚本作为目标客户端上的 系统 或 计算机 帐户执行, () 。 此帐户的网络访问权限有限。 必须相应地预配脚本对远程系统和位置的任何访问。
脚本监视
在设备集合上启动运行脚本后,使用以下过程监视操作。 可以在脚本执行时实时监视脚本,并在稍后返回给定运行脚本执行的状态和结果。 脚本状态数据作为 删除过期的客户端操作维护任务 或删除脚本的一部分进行清理。
在 Configuration Manager 控制台中,单击“ 监视”。
在 “监视 ”工作区中,单击“ 脚本状态”。
在 “脚本状态” 列表中,可以查看在客户端设备上运行的每个脚本的结果。 脚本退出代码 0 通常表示脚本已成功运行。
计划脚本对集合进行监视
在 Configuration Manager 控制台中,单击“ 监视”。
在“监视”工作区中,单击“ 计划的脚本”节点。
计划 脚本列表中将显示一个新行。
验证是否已在计划脚本列表中显示新行。 状态列应具有“ 计划”值。 ClientOperationId 列应为空。 验证其他列(如脚本名称、计划时间等)是否具有适当的值。
在“计划时间”之后,刷新“ 计划的脚本” 节点。 状态列应具有“ 已成功启动客户端操作”值。 ClientOperationId 列应具有整数值。
在“监视”工作区中,单击“ 脚本状态”节点。验证是否已在列表中显示新行,并且 ClientOperationId 是否等于 “计划脚本” 节点中的 ClientOperationId。
单击“ 查看状态” ,并确保显示脚本输出。
脚本输出
客户端的返回脚本输出使用 JSON 格式,方法是将脚本的结果管道到 ConvertTo-Json cmdlet。 JSON 格式始终返回可读脚本输出。 对于不将对象作为输出返回的脚本,ConvertTo-Json cmdlet 会将输出转换为客户端返回的简单字符串,而不是 JSON。
获取未知结果或客户端脱机位置的脚本不会显示在图表或数据集中。
避免返回大型脚本输出,因为它被截断为 4 KB。
将枚举对象转换为脚本中的字符串值,以便它们以 JSON 格式正确显示。
可以原始或结构化 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 自动执行其中一些任务:
- Approve-CMScript
- Deny-CMScript
- Get-CMScript
- Invoke-CMScript
- New-CMScript
- Remove-CMScript
- Set-CMScript