如何通过Azure PowerShell获取原地升级Azure VM的操作系统详情
获取Azure原地升级VM的真实操作系统信息
问题背景
使用Get-AzVM获取VM的镜像元数据时,部分经原地升级的Azure VM会出现StorageProfile.ImageReference.Offer/Sku与实际操作系统不一致的情况(例如原镜像为Windows 10,升级到Windows 11后,元数据仍显示Windows 10相关信息),需要通过PowerShell获取VM的真实操作系统信息,期望输出格式为Windows (Windows 11 Enterprise)。
解决方案
由于原地升级是在VM内部完成的系统更新,Azure的VM元数据不会自动同步更新,因此需要直接在VM内部查询操作系统的实际信息。可以通过Invoke-AzVMRunCommand在目标VM上执行本地命令获取真实OS信息:
Windows VM脚本示例
# 定位目标VM $vm = Get-AzVM -ResourceGroupName my-rg -Name myhostname1 # 在VM内部执行命令获取真实OS信息 $osResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName ` -VMName $vm.Name ` -CommandId 'RunPowerShellScript' ` -ScriptString @" # 获取操作系统显示名称 $osCaption = (Get-CimInstance Win32_OperatingSystem).Caption # 确定操作系统家族 $osFamily = if ($osCaption -match 'Windows') { 'Windows' } else { 'Unknown' } # 输出期望格式的结果 Write-Output "$osFamily ($osCaption)" "@ # 提取并打印结果 $realOsInfo = $osResult.Value[0].Message.Trim() Write-Output $realOsInfo
Linux VM脚本示例(可选)
如果是Linux VM,可修改脚本内的执行命令为:
$osResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName ` -VMName $vm.Name ` -CommandId 'RunShellScript' ` -ScriptString @" osFamily="Linux" osCaption=$(lsb_release -d | awk -F':\t' '{print $2}') echo "$osFamily ($osCaption)" "@
注意事项
- 目标VM必须已启用Azure VM代理,否则无法执行
Invoke-AzVMRunCommand。 - 当前执行PowerShell的账号需要拥有对该VM的
Microsoft.Compute/virtualMachines/runCommand/action权限。 Get-CimInstance是Get-WmiObject的替代方案,兼容性更好,推荐使用。
内容的提问来源于stack exchange,提问作者RSW
相关产品推荐
相关产品推荐

