從 Configuration Manager 主控台建立及執行 PowerShell 指令碼

適用於:Configuration Manager (目前的分支)

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 指令碼安全性

執行指令碼作者和核准者

執行指令碼使用 指令碼作者指令碼核准者的 概念,作為指令碼實作和執行的個別角色。 將作者和核准者角色分開,可以對 [執行指令碼] 這個強大的工具進行重要的程序檢查。 還有一個額外的 指令碼執行者 角色,允許執行指令碼,但無法建立或核准指令碼。 請參閱 建立指令碼的安全性角色

指令碼角色控制

根據預設,使用者無法核准他們撰寫的指令碼。 由於指令碼功能強大、用途廣泛,且有可能部署到許多裝置上,因此您可以在撰寫指令碼的人員和核准指令碼的人員之間分開角色。 這些角色提供額外的安全性層級,防止在沒有監督的情況下執行指令碼。 您可以關閉二次核准,以方便測試。

核准或拒絕指令碼

指令碼必須先由 指令碼核准者 角色核准,才能執行。 若要核准指令碼:

  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. 將下列所述的權限指派給安全性角色。

安全性角色權限

角色名稱:指令碼執行者

  • 描述:這些權限可讓此角色僅執行先前由其他角色建立及核准的指令碼。
  • 權限: 確保下列項目設為 [是]。
類別 權限 狀態
集合 執行指令碼
網站 讀取
SMS 指令碼 讀取

角色名稱:腳本作者

  • 描述:這些權限可讓此角色撰寫指令碼,但無法核准或執行指令碼。
  • 權限:請確定已設定下列權限。
類別 權限 狀態
集合 執行指令碼
網站 讀取
SMS 指令碼 建立
SMS 指令碼 讀取
SMS 指令碼 刪除
SMS 指令碼 修改

角色名稱:指令碼核准者

  • 描述:這些權限可讓此角色核准指令碼,但無法建立或執行指令碼。
  • 權限: 確定已設定下列權限。
類別 權限 狀態
集合 執行指令碼
網站 讀取
SMS 指令碼 讀取
SMS 指令碼 核准
SMS 指令碼 修改

SMS 指令碼範例指令碼作者角色的權限

SMS 指令碼範例指令碼作者角色的權限

指令碼的資料夾支援

從版本 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 的屬性。

指令碼參數 - 字串

指令碼參數屬性」 對話方塊的驗證區段包含下列欄位供您使用:

  • Minimum Length - FirstName 欄位的最小字元數。
  • Maximum Length- FirstName 欄位的最大字元數
  • RegEx - 規則運算式的縮寫。 如需使用規則運算式的詳細資訊,請參閱下一節使用 規則運算式驗證
  • 自訂錯誤 - 用於新增您自己的自訂錯誤訊息,以取代任何系統驗證錯誤訊息。

使用規則運算式驗證

規則運算式是一種精簡的程式設計形式,用於根據編碼驗證檢查字元字串。 例如,您可以放置 [RegEx] 欄位,以[^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。

  • 取得未知結果或用戶端離線的指令碼不會顯示在圖表或資料集中。

  • 避免傳回大型指令碼輸出,因為它會截斷為 4 KB。

  • 在指令碼中將列舉物件轉換為字串值,使其以 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 將其中一些工作自動化:

另請參閱