如何通过Azure KQL获取Windows虚拟机的当前安装版本?
获取Azure虚拟机当前Windows Server版本的KQL查询方法
你当前使用的KQL查询读取的是Azure资源管理器(ARM)中存储的虚拟机部署元数据,其中imageReference字段记录的是VM创建时使用的镜像版本,并非虚拟机当前运行的Windows系统版本——因为后续通过系统更新或手动升级后的版本不会同步到ARM元数据中。
要获取虚拟机当前的Windows Server版本,需要依赖Log Analytics工作区收集的虚拟机运行时数据,前提是目标虚拟机已安装Log Analytics代理,且工作区配置了收集相关系统数据(如WMI类Win32_OperatingSystem)。
以下是几种可行的KQL查询方案:
方案1:基于WMI事件数据查询
通过收集到的Win32_OperatingSystem WMI数据直接获取当前系统版本:
WMIEvent | where SourceName == "Win32_OperatingSystem" | extend VMName = Computer, OSFullName = tostring(EventData.Caption), OSVersion = tostring(EventData.Version) // 取每个VM最新的记录,避免历史数据干扰 | summarize arg_max(TimeGenerated, *) by VMName // 关联Resources表获取资源组、订阅等元数据 | join kind=inner ( Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project VMName = name, ResourceGroup = resourceGroup, SubscriptionId = subscriptionId ) on VMName | project SubscriptionId, ResourceGroup, VMName, OSFullName, OSVersion
方案2:通过更新历史间接获取
如果WMI数据未配置收集,可通过Windows更新历史记录推导当前版本:
UpdateSummary | where UpdateState == "Success" // 取每个VM最新的更新记录 | summarize arg_max(TimeGenerated, *) by Computer | extend VMName = Computer, OSName = tostring(ComputerProperties.OSName), OSVersion = tostring(ComputerProperties.OSVersion) // 关联资源元数据 | join kind=inner ( Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project VMName = name, ResourceGroup = resourceGroup ) on VMName | project ResourceGroup, VMName, OSName, OSVersion
注意事项
- 确保所有目标虚拟机已安装并启用Log Analytics代理,且代理能正常向工作区上报数据。
- 若未配置WMI数据收集,需在Log Analytics工作区的“数据收集规则”中添加
Win32_OperatingSystem类的收集配置。
内容的提问来源于stack exchange,提问作者Gornil
相关产品推荐
相关产品推荐

