使用動作執行命令在 Windows VM 中執行指令碼
「執行命令」功能會使用虛擬機器 (VM) 代理程式在 Azure Windows VM 中執行 PowerShell 指令碼。 您可以使用這些指令碼,進行一般電腦或應用程式管理。 這些指令碼有助於快速診斷和修復 VM 存取與網路問題,並讓 VM 恢復正常狀態。
優點
您可以透過多種方式來存取虛擬機器。 執行命令可以使用虛擬機器代理程式,在虛擬機器上遠端執行指令碼。 您可以透過 Azure 入口網站、REST API 或 PowerShell,執行「執行命令」。
這項功能在您想要在虛擬機器中執行指令碼的所有情況下都很有用。 這是針對因網路或管理使用者設定不當而未開啟 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:
在下列移除範例中,將 rgname 和 vmname 取代為相關的資源組名和虛擬機器名稱。
Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandWindowsExtension'
az vm run-command invoke --command-id RemoveRunCommandWindowsExtension --name vmname -g rgname
注意
當您再次套用執行命令時,會自動安裝延伸模組。 您可以使用擴充功能移除命令,針對與延伸模組相關的任何問題進行疑難排解。
後續步驟
若要了解在虛擬機器中遠端執行指令碼和命令的其他方式,請參閱在 Windows 虛擬機器中執行指令碼。