如何通过PowerShell生成过去4天的Intune设备统计PNG图表
解决Intune过去4天设备统计报告的PowerShell实现方案
要实现过去4天的设备统计,核心是利用Graph API的$filter参数在服务器端筛选时间范围,避免本地过滤的兼容性问题。以下是修改后的完整脚本,包含时间筛选逻辑:
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Windows.Forms.DataVisualization # 计算过去4天的UTC时间(符合Graph API的ISO 8601格式) $fourDaysAgo = (Get-Date).AddDays(-4).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") # 筛选过去4天内同步的、符合条件的设备(服务器端过滤,效率更高) $updateddevices = Get-MgDeviceManagementManagedDevice -Filter "OSVersion eq '16.7' and DeviceCategoryDisplayName eq 'in use' and LastSyncDateTime ge $fourDaysAgo" -All $totaldevices = Get-MgDeviceManagementManagedDevice -Filter "OperatingSystem eq 'iOS' and DeviceCategoryDisplayName eq 'in use' and LastSyncDateTime ge $fourDaysAgo" -All # 定义数据点 $dataPoints = @{ "已更新至16.7" = $updateddevices.Count "iOS总设备数" = $totaldevices.Count } # 创建图表(原图表逻辑保留) $chart = New-Object System.Windows.Forms.DataVisualization.Charting.Chart $chartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea $chart.ChartAreas.Add($chartArea) $series = New-Object System.Windows.Forms.DataVisualization.Charting.Series $series.ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::StackedColumn $chart.Series.Add($series) $dataPoints.GetEnumerator() | ForEach-Object { $dataPoint = New-Object System.Windows.Forms.DataVisualization.Charting.DataPoint $dataPoint.AxisLabel = $_.Key $dataPoint.YValues[0] = $_.Value $dataPoint.IsValueShownAsLabel = $true $series.Points.Add($dataPoint) } $chart.Titles.Add("过去4天iOS设备统计") $chartArea.AxisX.Title = "设备类型" $chartArea.AxisY.Title = "数量" # 显示图表并保存 $form = New-Object System.Windows.Forms.Form $form.Text = "设备统计图表" $form.ClientSize = New-Object System.Drawing.Size(500, 350) $chart.Dock = [System.Windows.Forms.DockStyle]::Fill $form.Controls.Add($chart) $form.ShowDialog() $chart.SaveImage("C:\Downloads\last4days_chart.png", [System.Drawing.Imaging.ImageFormat]::Png)
关键说明:
- 时间格式处理:Graph API要求时间参数为UTC的ISO 8601格式(如
2024-05-20T00:00:00Z),因此用ToUniversalTime()转换并格式化,避免本地时间与服务器时间的差异问题。 - 服务器端筛选:使用
-Filter参数直接在Graph服务器端过滤数据,相比本地Where-Object更高效,且避免了DateTimeOffset类型本地比较的兼容性问题(这也是你之前用(Get-Date).AddDays(-1)未生效的核心原因)。 - 权限说明:确保Connect-MgGraph时申请了
DeviceManagementManagedDevices.Read.All权限,否则无法获取设备数据。
如果需要按每天分组统计(比如过去4天每天的更新设备数),可以在获取数据后按日期分组:
# 按LastSyncDateTime的日期分组统计已更新设备 $dailyUpdated = $updateddevices | Group-Object -Property { $_.LastSyncDateTime.Date } | Sort-Object Name # 构建按天的数据点 $dailyDataPoints = @{} $dailyUpdated | ForEach-Object { $dailyDataPoints[$_.Name.ToString("yyyy-MM-dd")] = $_.Count } # 后续图表逻辑可修改为折线图或柱状图展示每日数据
内容的提问来源于stack exchange,提问作者PowerShellWiz
相关产品推荐
相关产品推荐

