使用動作執行命令在 Windows VM 中執行指令碼

執行命令功能會使用虛擬機器 (VM) 代理程式在 Azure Windows VM 內執行 PowerShell 指令碼。 您可以使用這些指令碼,進行一般電腦或應用程式管理。 這些指令碼能協助快速診斷和修復 VM 存取與網路問題,並讓 VM 恢復正常狀態。

福利

您有多種方式可存取虛擬機器。 執行命令可以使用虛擬機器代理程式,在虛擬機器上遠端執行指令碼。 您可以透過 Azure 入口網站、REST APIPowerShell,執行「執行命令」。

這項功能在您想要在虛擬機器中執行指令碼的所有情況下都很有用。 這是唯一能夠疑難排解和修復因網路或管理使用者設定不當,而未開啟 RDP 或 SSH 連接埠的虛擬機器方法。

必要條件

支援 Windows OS

Windows OS x64
Windows 10 支援
Windows 11 支援
Windows Server 2008 SP2 支援
Windows Server 2008 R2 支援
Windows Server 2012 支援
Windows Server 2012 R2 支援
Windows Server 2016 支援
Windows Server 2016 Core 支援
Windows Server 2019 支援
Windows Server 2019 Core 支援
Windows Server 2022 支援
Windows Server 2022 Core 支援

限制

當您使用執行命令時,有下列限制:

  • 輸出僅限於最後 4,096 個位元組。
  • 執行指令碼的最短時間是大約 20 秒。
  • 在 Windows 上以系統身分執行指令碼。
  • 一次可執行一個指令碼。
  • 不支援提示資訊 (互動模式) 的指令碼。
  • 您無法取消執行中的指令碼。
  • 指令碼可以執行的最長時間是 90 分鐘。 經過這段時間後會逾時。
  • 需要有虛擬機器的輸出連線,才能傳回指令碼結果。
  • 不建議執行會導致 VM 代理程式停止或更新的指令碼。 這可能會讓延伸模組處於 [轉換中] 狀態,進而導致逾時。

注意

為正常運作,執行命令需要能夠連線 (連接埠 443) 至 Azure 公用 IP 位址。 如果延伸模組不具有這些端點的存取權,指令碼可能會成功執行,但無法傳回結果。 如果要封鎖虛擬機器上的流量,您可使用服務標籤,以利用 AzureCloud 標籤允許送往 Azure 公用 IP 位址的流量。

如果 VM 代理程式狀態為 [未就緒],則「執行命令」功能無法運作。 在 Azure 入口網站的 VM 屬性中,檢查代理程式狀態。

可用的命令

下表顯示 Windows 虛擬機器可用命令的清單。 您可以使用 RunPowerShellScript 命令來執行您想要的任何自訂指令碼。 當使用 Azure CLI 或 PowerShell 執行命令時,您為 --command-id-CommandId 參數所提供值必須是下列值的其中之一。 如果您指定的值不是可用命令,就會收到此錯誤:

The entity was not found in this Azure location

名稱 說明
RunPowerShellScript 執行 PowerShell 指令碼
DisableNLA 停用網路層級驗證
DisableWindowsUpdate 停用 Windows Update 自動更新
EnableAdminAccount 檢查本機系統管理員帳戶是否已停用,若已停用,請啟用該帳戶。
EnableEMS 啟用 EMS
EnableRemotePS 設定機器啟用遠端 PowerShell。
EnableWindowsUpdate 啟用 Windows Update 自動更新
IPConfig 對於繫結至 TCP/IP 的每個介面卡,顯示 IP 位址、子網路遮罩和預設閘道的詳細資訊。
RDPSettings 檢查登錄設定和網域原則設定。 如果機器是網域的一部分,或將設定修改為預設值,會建議原則動作。
ResetRDPCert 移除繫結至 RDP 接聽程式的 TLS/SSL 憑證,並將 RDP 接聽程式安全性還原為預設值。 如果您發現憑證有任何問題,請使用此指令碼。
SetRDPPort 設定遠端桌面連線的預設連接埠號碼或使用者指定連接埠號碼。 對於連接埠的輸入存取,啟用防火牆規則。

Azure CLI

下列範例使用 az vm run-command 命令,在 Azure Windows VM 上執行殼層指令碼。

# script.ps1
#   param(
#       [string]$arg1,
#       [string]$arg2
#   )
#   Write-Host This is a sample script with parameters $arg1 and $arg2

az vm run-command invoke  --command-id RunPowerShellScript --name win-vm -g my-resource-group \
    --scripts @script.ps1 --parameters "arg1=somefoo" "arg2=somebar"

Azure 入口網站

前往 Azure 入口網站中的 VM,並在 [作業] 下,從左側功能表選取 [執行命令]。 您會看到可在 VM 上執行的可用命令清單。

List of commands

選擇要執行的命令。 有些命令可能有選擇性或必要的輸入參數。 對於這些命令,參數會顯示為文字欄位,以供提供輸入值。 對於每個命令,您可以展開 [檢視指令碼] 檢視執行中的指令碼。 RunPowerShellScript 不同於其他命令,因為它可讓您提供您自己的自訂指令碼。

注意

內建命令是無法編輯的。

選擇命令之後,請選取 [執行] 以執行指令碼。 指令碼完成後,會在輸出視窗中傳回輸出和任何錯誤。 下列螢幕擷取畫面顯示執行 RDPSettings 命令的範例輸出。

Run command script output

PowerShell

下列範例使用 Invoke-AzVMRunCommand Cmdlet,在 Azure VM 上執行 PowerShell 指令碼。 此 Cmdlet 預期 -ScriptPath 參數中所參考的指令碼,位於 Cmdlet 執行所在位置的本機環境。

Invoke-AzVMRunCommand -ResourceGroupName '<myResourceGroup>' -Name '<myVMName>' -CommandId 'RunPowerShellScript' -ScriptPath '<pathToScript>' -Parameter @{"arg1" = "var1";"arg2" = "var2"}

注意

參數值只能是字串類型,而且指令碼會負責視需要將其轉換成其他類型。

限制於執行命令的存取

列出執行命令或顯示命令詳細資料需要訂閱層級的 Microsoft.Compute/locations/runCommands/read 權限。 內建讀者角色和具有此權限的較高層級。

執行命令需要有 Microsoft.Compute/virtualMachines/runCommands/write 權限。 虛擬機器參與者角色和具有此權限的較高層級。

您可使用其中一個內建角色或建立自訂角色,以使用 [執行] 命令。

動作執行命令 Windows 疑難解答

針對 Windows 環境的動作執行命令進行疑難解答時,請參閱 RunCommandExtension 記錄檔 (其通常位於下列目錄中:C:\WindowsAzure\Logs\Plugins\Microsoft.CPlat.Core.RunCommandWindows\<version>\RunCommandExtension.log) 以取得進一步的詳細資料。

已知問題

如果命令包含保留字元,您的動作執行命令延伸模組可能無法在 Windows 環境中執行。 例如:

如果 & 符號是在命令的參數中傳遞 (例如下列 PowerShell 指令碼),它可能會失敗。

$paramm='abc&jj'
Invoke-AzVMRunCommand -ResourceGroupName AzureCloudService1 -Name test -CommandId 'RunPowerShellScript' -ScriptPath C:\data\228332902\PostAppConfig.ps1 -Parameter @{"Prefix" = $paramm}

使用 ^ 字元逸出引數中的 &,例如 $paramm='abc^&jj'

如果要執行的命令於路徑中包含「\n」命令,執行命令延伸模組也可能無法執行,因為它會被視為新行。 例如,C:\Windows\notepad.exe 於檔案路徑中包含 \n。 請考慮於路徑中以 \N 取代 \n

的動作執行命令移除

如果您需要移除動作執行命令 Windows 延伸模組,請參閱 Azure PowerShell 和 CLI 的下列步驟:

使用下列移除範例中的相關資源群組名稱和虛擬器機名稱取代 rgnamevmname

 Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandWindowsExtension'
az vm run-command invoke  --command-id RemoveRunCommandWindowsExtension --name vmname -g rgname

注意

當您再次套用執行命令時,會自動安裝延伸模組。 您可以使用延伸模組移除命令,針對與延伸模組相關的任何問題進行疑難排解。

下一步

若要了解在虛擬機器中遠端執行指令碼和命令的其他方式,請參閱在 Windows 虛擬機器中執行指令碼