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

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

優點

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

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

限制

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

  • 輸出僅限於最後 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 位址、子網路遮罩和預設閘道的詳細資訊。
RDPSetting 檢查登錄設定和網域原則設定。 如果機器是網域的一部分,或將設定修改為預設值,會建議原則動作。
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,並在 [作業] 下,從左側功能表選取 [執行命令]。 您會看到可在虛擬機器上執行之命令的清單。

命令清單

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

注意

內建命令是無法編輯的。

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

執行命令指令碼輸出

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/runCommand/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 虛擬機器中執行指令碼