使用動作執行命令在 Windows VM 中執行指令碼
執行命令功能會使用虛擬機器 (VM) 代理程式在 Azure Windows VM 內執行 PowerShell 指令碼。 您可以使用這些指令碼,進行一般電腦或應用程式管理。 這些指令碼能協助快速診斷和修復 VM 存取與網路問題,並讓 VM 恢復正常狀態。
福利
您有多種方式可存取虛擬機器。 執行命令可以使用虛擬機器代理程式,在虛擬機器上遠端執行指令碼。 您可以透過 Azure 入口網站、REST API 或 PowerShell,執行「執行命令」。
這項功能在您想要在虛擬機器中執行指令碼的所有情況下都很有用。 這是唯一能夠疑難排解和修復因網路或管理使用者設定不當,而未開啟 RDP 或 SSH 連接埠的虛擬機器方法。
必要條件
支援的 Windows 作業系統
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
注意
視使用何種形式來執行而定,可能需要一些逸出。 例如,如果您要在 PowerShell 工作階段中執行 命令,腳本檔案的路徑必須有引號。
下列範例使用 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 上執行的可用命令清單。
選擇要執行的命令。 有些命令可能有選擇性或必要的輸入參數。 對於這些命令,參數會顯示為文字欄位,以供提供輸入值。 對於每個命令,您可以展開 [檢視指令碼] 檢視執行中的指令碼。 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/runCommands/action
權限。 虛擬機器參與者角色和具有此權限的較高層級。
您可使用其中一個內建角色或建立自訂角色,以使用 [執行] 命令。
動作執行命令 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
。請確定您在登錄機碼
HKLM\SOFTWARE\Microsoft\Command Processor\AutoRun
中沒有任何自訂設定 (詳情在此處)。 這可能會在 RunCommand 延伸模組安裝或啟用階段期間觸發,並導致「XYZ 無法辨識為內部或外部命令、可操作的程式或批次檔」之類的錯誤。
的動作執行命令移除
如果您需要移除動作執行命令 Windows 延伸模組,請參閱 Azure PowerShell 和 CLI 的下列步驟:
使用下列移除範例中的相關資源群組名稱和虛擬器機名稱取代 rgname 和 vmname。
Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandWindowsExtension'
az vm run-command invoke --command-id RemoveRunCommandWindowsExtension --name vmname -g rgname
注意
當您再次套用執行命令時,會自動安裝延伸模組。 您可以使用延伸模組移除命令,針對與延伸模組相關的任何問題進行疑難排解。
下一步
若要了解在虛擬機器中遠端執行指令碼和命令的其他方式,請參閱在 Windows 虛擬機器中執行指令碼。