如何使用PowerCLI获取Datastore与Datastore Cluster关联的事件?
解决方案
核心原理
Get-VIEvent cmdlet 本身做了输入类型校验,仅允许继承自InventoryItemImpl的清单对象传入,而DatastoreClusterImpl、VmfsDatastoreImpl两类对象不在该继承链内,因此会触发类型报错。直接调用vSphere底层的EventManager API即可绕过该限制,返回的事件结构与Get-VIEvent完全一致。
具体实现代码
查询Datastore Cluster事件
# 1. 获取目标Datastore Cluster对象 $dsCluster = Get-VMFolder "FOLDER_NAME" -Type Datastore | Get-DatastoreCluster -Name "目标集群名称" # 2. 获取当前vCenter连接的EventManager实例 $eventManager = Get-View EventManager # 3. 构造事件查询过滤器 $eventFilter = New-Object VMware.Vim.EventFilterSpec # 绑定查询目标实体的MoRef $eventFilter.Entity = New-Object VMware.Vim.EventFilterSpecByEntity $eventFilter.Entity.Entity = $dsCluster.ExtensionData.MoRef # 递归配置:Self仅查询集群本身事件,All可同时查询集群下所有Datastore的事件 $eventFilter.Entity.Recursion = "Self" # 可选配置:增加时间范围过滤,以下示例查询最近7天的事件 $eventFilter.Time = New-Object VMware.Vim.EventFilterSpecByTime $eventFilter.Time.BeginTime = (Get-Date).AddDays(-7) $eventFilter.Time.EndTime = Get-Date # 4. 执行查询获取事件列表 $events = $eventManager.QueryEvents($eventFilter) # 格式化输出结果 $events | Select-Object CreatedTime, FullFormattedMessage, UserName | Format-Table -AutoSize
查询单个Datastore事件
仅需修改第一步的目标对象获取逻辑即可,后续逻辑完全通用:
# 替换第一步代码,获取目标Datastore对象 $datastore = Get-Datastore "目标Datastore名称" # 后续过滤器绑定MoRef改为$datastore.ExtensionData.MoRef即可
关于Get-TaskPlus报错的说明
该函数的参数和内部逻辑默认仅适配InventoryItemImpl类型的对象,即使移除参数类型限制,内部的实体匹配逻辑仍无法识别Datastore相关类型,因此无返回结果,无需修改该函数,直接使用上述API方案即可覆盖需求。
内容的提问来源于stack exchange,提问作者codewario
相关产品推荐
相关产品推荐

