在 Intune 的 Windows 裝置上使用 PowerShell 指令碼

使用 Microsoft Intune 管理擴充功能在 Intune 中上傳 PowerShell 指令碼。 然後,在 Windows 裝置上執行這些指令碼。 管理擴充功能可增強 MDM,並讓您更容易移至新式管理。

注意事項

如需適用於 Windows 的 Intune 管理擴充功能的詳細資訊,請參閱適用於 Windows 的 Intune 管理擴充功能

開始之前

  • 根據預設,指令碼設定為具有系統管理員權限的使用者內容會以系統管理員權限執行 PowerShell。

  • 使用者不需要登入裝置即可執行 PowerShell 指令碼。

  • Intune 管理擴充功能會在每次重新開機後檢查是否有任何新的指令碼或變更。 將原則指派給 Microsoft Entra 群組之後,PowerShell 指令碼隨即執行,並報告執行結果。 指令碼執行之後,除非指令碼或原則有所變更,否則不會再次執行。 如果指令碼失敗,Intune 管理擴充功能會在接下來的三個連續 Intune 管理擴充功能簽入中重試指令碼三次。

  • 指派給裝置的 PowerShell 指令碼會針對每個登入的新使用者執行,但在停用使用者簽入的多工作階段 SKU 上除外。

  • PowerShell 指令碼會在 Win32 應用程式執行之前執行。 換句話說,PowerShell 指令碼會先執行。 然後,Win32 應用程式會執行。

  • PowerShell 指令碼在 30 分鐘後逾時。

重要事項

使用 PowerShell 指令碼和補救指令碼時,隱私權意識的最佳做法包括:

  • 請勿在指令碼中包含任何類型的敏感性資訊 (例如密碼)
  • 請勿在指令碼中包含個人資料
  • 不使用指令碼從裝置收集個人資料
  • 一律遵循隱私權最佳作法

如需相關資訊,請參閱補救。

必要條件

  • 當 PowerShell 指令碼應用程式指派給使用者或裝置時,系統會自動安裝Intune管理擴充功能。 如需詳細資訊,請參閱適用於 Windows 的 Intune 管理擴充功能

重要事項

如果裝置的系統時鐘已過期數月或數年,則部署至執行 Intune 管理擴充功能的用戶端的指令碼將無法執行。 當系統時鐘恢復到最新狀態後,指令碼就會如預期執行。

建立指令碼原則並指派它

  1. 登入 Microsoft Intune 系統管理中心

  2. 選取裝置>指令碼和補救措施>平台指令碼>新增>Windows 10 及更新版本

    顯示正在為 Windows 裝置建立新指令碼的螢幕擷取畫面。

  3. [基本] 中,輸入下列屬性,然後選取 [下一步]:

    • 名稱:輸入 PowerShell 指令碼的名稱。
    • 描述:輸入 PowerShell 指令碼的描述。 這是選擇性設定,但建議進行。
  4. 指令碼設定中,輸入下列屬性,然後選取 [下一步]:

    • 指令碼位置: 瀏覽至 PowerShell 指令碼。 指令碼必須小於 200 KB (ASCII) 。

    • 使用登入的認證執行此指令碼: 選取 [ ] (預設) 以在裝置上使用使用者認證執行指令碼。 選擇 [否 ] 以在系統內容中執行指令碼。 許多系統管理員選擇 [是]。 如果需要指令碼才能在系統內容中執行,請選擇 [否]。

    • 強制執行指令碼簽章檢查:如果指令碼必須由信任的發行者簽署 (則選取 [ ] 預設) 。 如果不需要簽署指令碼,請選取 [否 ]。

    • 在 64 位元 PowerShell 主機中執行指令碼: 選取 [是 ],即可在 64 位元用戶端架構的 64 位元 PowerShell 主機中執行指令碼。 選取 [ ] (預設) 會在 32 位元 PowerShell 主機中執行指令碼。

      設定為 [是 ] 或 [否] 時,請使用下表來了解新的和現有的原則行為:

      在 64 位元主機中執行指令碼 用戶端架構 新指令碼 現有的原則指令碼
      32 位元 支援 32 位元 PowerShell 主機 僅在適用於 32 位元和 64 位元架構的 32 位元 PowerShell 主機中執行。
      64 位元 在 64 位元架構的 64 位元 PowerShell 主機中執行指令碼。 在 32 位元上執行時,指令碼會在 32 位元 PowerShell 主機中執行。 在 32 位元 PowerShell 主機中執行指令碼。 如果此設定變更為 64 位元,指令碼會在 (未在 64 位元 PowerShell 主機中) 執行時開啟,並回報結果。 在 32 位元上執行時,指令碼會在 32 位元 PowerShell 主機中執行。
  5. 選取 範圍標籤。 範圍標籤是選用的。 針對分散式 IT 使用角色型存取控制和範圍標籤 有詳細資訊。

    若要新增範圍標籤:

    • 選擇 選取範圍標籤> 從清單>中選取現有的範圍標籤 選取

    • 完成後,選取 [下一步]。

  6. 選取 作業>選取要包含的群組。 顯示 Microsoft Entra 群組的現有清單。

    • 選取一個或多個群組,其中包含其裝置會接收指令碼之使用者。 選擇 [選取]。 您選擇的群組會顯示在清單中,並收到您的原則。

      注意事項

      Intune 中的 PowerShell 指令碼可以以 Microsoft Entra 裝置安全性群組或 Microsoft Entra 使用者安全性群組為目標。 不過,當以已加入工作場所 (WPJ) 裝置為目標時,只能使用Microsoft Entra裝置安全性群組, () 忽略使用者目標。

    • 選取 [下一步]

      將 PowerShell 指令碼指派或部署至 Microsoft Intune 中的裝置群組

  7. [檢閱 + 新增] 中,會顯示您所設定之設定的摘要。 選取 [ 新增] 以儲存指令碼。 當您選取 [新增] 時,原則便會部署到您選擇的群組。

案例 - 無法執行指令碼

上午 8 點

  • 簽入
  • 執行指令碼 ConfigScript01
  • 指令碼失敗

上午 9 點

  • 簽入
  • 執行指令碼 ConfigScript01
  • 指令碼失敗 (重試計數 = 1)

上午 10 點

  • 簽入
  • 執行指令碼 ConfigScript01
  • 指令碼失敗 (重試計數 = 2)

上午 11 點

  • 簽入
  • 執行指令碼 ConfigScript01
  • 指令碼失敗 (重試計數 = 3)

中午 12 點

  • 簽入
  • 不會進行其他嘗試執行 ConfigScript01指令碼。
  • 如果沒有對指令碼進行其他變更,則不會進行其他嘗試執行指令碼。

監視執行狀態

您可以在入口網站中監視使用者和裝置的 PowerShell 指令碼執行狀態。

PowerShell 指令碼中,選取要監視的指令碼,選擇 [監視],然後選擇下列其中一個報告:

  • 裝置狀態
  • 使用者狀態

注意事項

裝置狀態:從 Intune 系統管理中心的平台指令碼匯出現在會使用 Intune 匯出 API,且 CSV 欄名稱會與 API 結構描述一致。

刪除指令碼

PowerShell 指令碼中,以滑鼠右鍵按一下指令碼,然後選取 [刪除]。

常見問題和解決方案

問題:PowerShell 指令碼未執行

可能的解決方法

  • 並非每次登入時都會執行 PowerShell 指令碼。 他們執行:

    • 指令碼指派給裝置時

    • 如果您變更指令碼,請上傳指令碼,並將指令碼指派給使用者或裝置

      提示

      Microsoft Intune管理擴充功能是在裝置上執行的服務,就像服務應用程式 (services.msc) 中列出的任何其他服務一樣。 裝置重新開機之後,此服務可能會重新啟動,並使用 Intune 服務檢查是否有任何指派的 PowerShell 指令碼。 如果 Microsoft Intune 管理擴充功能服務設定為手動,則服務可能不會在裝置重新開機後重新啟動。

  • 確定裝置已加入 Microsoft Entra ID。 僅在 Microsoft Entra ID 中向您的工作場所或組織註冊的裝置不會收到指令碼。

  • 確認 Intune 管理擴充功能已下載至 %ProgramFiles(x86)%\Microsoft Intune Management Extension

  • 指令碼不會在 S 模式的 Surface Hub 或 Windows 上執行。

  • 檢閱記錄檔是否有任何錯誤。 請參閱本文) (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下列程式碼片段會透過 AgentExecutor 執行指令碼至 PowerShell x86 () C:\Windows\SysWOW64\WindowsPowerShell\v1.0.output 它會保留記錄供您檢閱。 請記住,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
      

問題: 為什麼即使不再受管理 Windows,指令碼仍在執行?

當不再管理具有指派指令碼的 Windows 裝置時,IME 不會立即移除。 IME 會在下一次 IME 簽入 (偵測到 Windows 未受到管理,通常每 8 小時) 一次,然後取消指令碼執行。 在此同時,任何本機儲存的指令碼都可以執行。 當 IME 無法簽入時,它會) 裝置喚醒時間 (重試簽入最多 24 小時,然後將自己從 Windows 裝置中移除。

後續步驟

監控疑難排解 您的個人檔案。