適用於: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 指令碼安全性
執行指令碼作者和核准者
執行指令碼使用 指令碼作者 和 指令碼核准者的 概念,作為指令碼實作和執行的個別角色。 將作者和核准者角色分開,可以對 [執行指令碼] 這個強大的工具進行重要的程序檢查。 還有一個額外的 指令碼執行者 角色,允許執行指令碼,但無法建立或核准指令碼。 請參閱 建立指令碼的安全性角色。
指令碼角色控制
根據預設,使用者無法核准他們撰寫的指令碼。 由於指令碼功能強大、用途廣泛,且有可能部署到許多裝置上,因此您可以在撰寫指令碼的人員和核准指令碼的人員之間分開角色。 這些角色提供額外的安全性層級,防止在沒有監督的情況下執行指令碼。 您可以關閉二次核准,以方便測試。
核准或拒絕指令碼
指令碼必須先由 指令碼核准者 角色核准,才能執行。 若要核准指令碼:
- 在 Configuration Manager 主控台中,按一下 [軟體程式庫]。
- 在 「軟體庫」 工作區中,按一下 「指令碼」。
- 在 [指令碼] 清單中,選擇您要核准或拒絕的指令碼,然後在 [常用] 索引標籤的 [指令碼] 群組中,按一下 [核准/拒絕]。
- 在 [核准或拒絕指令碼 ] 對話方塊中,選取指令碼的 [核准] 或 [拒絕 ]。 您可以選擇輸入關於您決策的註解。 如果拒絕指令碼,它就無法在用戶端裝置上執行。
- 完成精靈。 在 [指令碼 ] 清單中,您會看到 [核准狀態 ] 資料行會根據您所採取的動作而變更。
允許使用者核准自己的指令碼
此核准主要用於腳本開發的測試階段。
- 在 Configuration Manager 主控台中,按一下 [系統管理]。
- 在 [ 系統管理 ] 工作區中,展開 [網站設定],然後按一下 [網站]。
- 在網站清單中選擇您的網站,然後在 [常用 ] 索引標籤的 [網站 ] 群組中,按一下 [ 階層設定]。
- 在 [階層設定屬性] 對話方塊的 [一般] 索引標籤上,清除 [指令碼作者需要額外的指令碼核准者] 核取方塊。
重要事項
最佳做法是,不應允許指令碼作者核准自己的指令碼。 應該只在實驗室環境中允許。 請仔細考慮在生產環境中變更此設定的潛在影響。
安全性範圍
執行指令碼使用 Configuration Manager 的現有功能安全性範圍,透過指派代表使用者群組的標籤來控制指令碼撰寫和執行。 如需使用安全性範圍的詳細資訊,請參閱 設定 Configuration Manager 的角色型系統管理。
建立指令碼的安全性角色
預設不會在 Configuration Manager 中建立用於執行指令碼的三個安全性角色。 若要建立指令碼執行者、指令碼作者和指令碼核准者角色,請遵循概述的步驟。
- 在 Configuration Manager 主控台中,移至 [系統管理>] 安全性>安全性角色
- 以滑鼠右鍵按一下角色,然後按一下 [複製]。 您複製的角色已指派權限。 請確定您只取得所需的權限。
- 為自訂角色提供 名稱 和 描述。
- 將下列所述的權限指派給安全性角色。
安全性角色權限
角色名稱:指令碼執行者
- 描述:這些權限可讓此角色僅執行先前由其他角色建立及核准的指令碼。
- 權限: 確保下列項目設為 [是]。
| 類別 | 權限 | 狀態 |
|---|---|---|
| 集合 | 執行指令碼 | 是 |
| 網站 | 讀取 | 是 |
| SMS 指令碼 | 讀取 | 是 |
角色名稱:腳本作者
- 描述:這些權限可讓此角色撰寫指令碼,但無法核准或執行指令碼。
- 權限:請確定已設定下列權限。
| 類別 | 權限 | 狀態 |
|---|---|---|
| 集合 | 執行指令碼 | 否 |
| 網站 | 讀取 | 是 |
| SMS 指令碼 | 建立 | 是 |
| SMS 指令碼 | 讀取 | 是 |
| SMS 指令碼 | 刪除 | 是 |
| SMS 指令碼 | 修改 | 是 |
角色名稱:指令碼核准者
- 描述:這些權限可讓此角色核准指令碼,但無法建立或執行指令碼。
- 權限: 確定已設定下列權限。
| 類別 | 權限 | 狀態 |
|---|---|---|
| 集合 | 執行指令碼 | 否 |
| 網站 | 讀取 | 是 |
| SMS 指令碼 | 讀取 | 是 |
| SMS 指令碼 | 核准 | 是 |
| SMS 指令碼 | 修改 | 是 |
SMS 指令碼範例指令碼作者角色的權限
指令碼的資料夾支援
從版本 2403 開始,您可以使用資料夾來組織指令碼。 此變更可讓您更好地分類和管理指令碼。
開啟 Configuration Manager 主控台,然後移至 [軟體庫] 工作區。 從功能區或快顯功能表的 [指令碼] 中,從下列選項中選取:
- 建立資料夾
- 刪除資料夾
- 重新命名資料夾
- 移動資料夾
- 設定安全性範圍
建立指令碼
- 在 Configuration Manager 主控台中,按一下 [軟體程式庫]。
- 在 「軟體庫」 工作區中,按一下 「指令碼」。
- 在 [常用 ] 索引標籤的 [ 建立] 群組中,按一下 [建立指令碼]。
- 在 [建立指令碼] 精靈的 [指令碼] 頁面上,設定下列設定:
- 指令碼名稱 - 輸入指令碼的名稱。 雖然您可以建立多個具有相同名稱的指令碼,但使用重複的名稱會使您在 Configuration Manager 主控台中找不到所需的指令碼變得更加困難。
- 指令碼語言 - 目前僅支援 PowerShell 指令碼。
- 匯入 - 將 PowerShell 指令碼匯入主控台。 指令碼會顯示在 [指令碼 ] 欄位中。
- 清除 - 從 [指令碼] 欄位移除目前的指令碼。
- 指令碼 - 顯示目前匯入的指令碼。 您可以視需要編輯此欄位中的指令碼。
- 完成精靈。 新指令碼會顯示在 [指令碼] 清單中,狀態為 [正在等候核准]。 您必須先核准,才能在用戶端裝置上執行此指令碼。
重要事項
使用 [執行指令碼] 功能時,避免編寫指令碼、裝置重新開機或重新啟動 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 不會保存核准狀態。
提示
請勿編輯在用戶端上主動執行的指令碼。 他們不會完成原始腳本的執行,您可能無法從這些用戶端獲得預期的結果。
編輯指令碼
- 移至 [軟體庫] 工作區下的 [指令碼] 節點。
- 選取要編輯的指令碼,然後按一下功能區中的 [ 編輯 ]。
- 在 [腳本詳細資料] 頁面中變更或重新匯入您的腳本。
- 按一下 下一步 檢視 摘要 ,編輯完成後 關閉 。
複製指令碼
- 移至 [軟體庫] 工作區下的 [指令碼] 節點。
- 選取要複製的指令碼,然後按一下功能區中的 [複製 ]。
- 在 [指令碼名稱 ] 欄位中重新命名指令碼,並進行您可能需要的其他編輯。
- 按一下 下一步 檢視 摘要 ,編輯完成後 關閉 。
執行指令碼
指令碼獲核准之後,便可針對單一裝置或集合執行。 指令碼執行開始後,就會透過一小時內逾時的高優先順序系統快速啟動。 然後使用狀態訊息系統傳回指令碼的結果。
若要為指令碼選取目標集合:
- 在 Configuration Manager 主控台中,按一下 [資產與合規性]。
- 在「資產與合規性」工作區中,按一下 「裝置集合」。
- 在 [裝置集合 ] 清單中,按一下您要執行指令碼的裝置集合。
- 選取您選擇的集合,按一下 [執行指令碼]。
- 在 [執行指令碼] 精靈的 [指令碼] 頁面上,從清單中選擇指令碼。 只會顯示核准的指令碼。
- 按一下 [下一步],然後完成精靈。
重要事項
如果指令碼未執行,例如因為目標裝置在一小時內關閉,您必須再次執行指令碼。
排程指令碼的執行時間
從 Configuration Manager 目前分支版本 2309 開始,您現在可以在 UTC 中排程指令碼的執行時間。
在集合上排程指令碼執行:
在 Configuration Manager 主控台中,按一下 [資產與合規性]。
在「資產與合規性」工作區中,按一下 「裝置集合」。
在 [裝置集合] 清單中,按一下您要排程指令碼的裝置集合。
選取您選擇的集合,按一下 [執行指令碼]。
在 [ 排程] 頁面上,排程指令碼執行時間核取方塊,然後指定 UTC 排程時間。
確認 [摘要] 頁面上顯示的詳細資料。
按一下 [下一步],然後完成精靈。
注意事項
每 5 分鐘最多會處理 25 個排程的指令碼。
目標電腦執行
指令碼會以目標用戶端上的系統或電腦帳戶 () 執行。 此帳戶的網路存取權有限。 指令碼對遠端系統和位置的任何存取都必須相應地佈建。
指令碼監控
在裝置集合上啟動執行指令碼後,請使用下列程序來監視作業。 您可以在指令碼執行時即時監控指令碼,稍後返回給定執行指令碼執行的狀態和結果。 指令碼狀態資料會隨著「 刪除已過時的用戶端作業」維護工作 或指令碼刪除的一部分而清除。
在 Configuration Manager 主控台中,按一下 [監視]。
在 [監控 ] 工作區中,按一下 [指令碼狀態]。
在 [指令碼狀態 ] 清單中,您可以檢視在用戶端裝置上執行的每個指令碼的結果。 指令碼結束代碼 0 通常表示指令碼成功執行。
排程指令碼 對集合進行監視
在 Configuration Manager 主控台中,按一下 [監視]。
在 [監控] 工作區中,按一下 [排程的指令碼] 節點。
新列將會顯示在 [排程的指令碼] 清單中。
確認已在 [排程的指令碼] 清單中顯示新資料列。 狀態資料行的值應該為 [已排程]。 ClientOperationId 欄位應為空白。 確認指令碼名稱、排程時間等其他資料欄位有適當的值。
在排程時間之後,重新整理排 程指令碼 節點。 [狀態] 資料欄位的值應為 [已成功起始的用戶端作業]。 ClientOperationId 欄位應該有整數值。
在「監控」工作區中,按一下 「指令碼狀態」節點。確認新列已顯示在清單中,且 ClientOperationId 等於排 程指令碼 節點中的 ClientOperationId。
按一下 檢視狀態 並確保腳本輸出顯示。
指令碼輸出
用戶端透過將指令碼結果管道傳輸至 ConvertTo-Json Cmdlet,使用 JSON 格式設定傳回指令碼輸出。 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 將其中一些工作自動化: