如何对比$LicensedUsers.UserPrincipalName与$AuditLogsUser生成Result.CSV?
对比授权用户与审计日志用户并生成Result.CSV文件
需求说明
对比通过Get-MgUser获取的Azure AD授权用户($LicensedUsers)的UserPrincipalName,与从审计日志CSV中提取的用户ID列表($AuditLogsUser),生成包含DisplayName、Mail、UserPrincipalName、Status字段的Result.CSV文件。状态规则:用户主体名称出现在审计日志中标记为Active,未出现则标记为Inactive。
完整实现脚本
# 获取Azure AD用户并按用户主体名称排序 $LicensedUsers = Get-MgUser | Sort-Object UserPrincipalName # 从审计日志CSV提取唯一用户ID并排序 $AuditLogsUser = Import-Csv -Path 'C:\Logs.csv' | Select-Object -ExpandProperty UserID -Unique | Sort-Object # 生成结果数据集 $results = $LicensedUsers | ForEach-Object { $userUpn = $_.UserPrincipalName # 判断用户是否在审计日志中有记录 $userStatus = if ($AuditLogsUser -contains $userUpn) { "Active" } else { "Inactive" } # 构造输出对象 [PSCustomObject]@{ DisplayName = $_.DisplayName Mail = $_.Mail UserPrincipalName = $userUpn Status = $userStatus } } # 导出为CSV文件 $results | Export-Csv -Path 'C:\Result.CSV' -NoTypeInformation -Encoding UTF8
关键步骤解析
- 获取授权用户:通过
Get-MgUser拉取Azure AD全量用户,排序后保证数据有序性,便于后续对比。 - 提取审计日志用户:导入日志CSV后,通过
-Unique参数去重,避免重复用户ID干扰状态判断。 - 状态判断与数据构造:遍历每个用户,用
-contains运算符检查UPN是否存在于审计日志用户列表,生成对应状态;同时提取所需属性构造自定义对象,确保输出格式符合要求。 - 导出CSV:使用
Export-Csv导出结果,-NoTypeInformation移除PowerShell类型信息,-Encoding UTF8保证文件支持中文等非ASCII字符。
额外优化建议
- 如果仅需筛选已分配许可证的用户,可修改
Get-MgUser命令:$LicensedUsers = Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual -CountVariable licensedCount | Sort-Object UserPrincipalName - 若审计日志中的
UserID不是完整UPN(比如仅用户名),需调整匹配逻辑,例如使用-match运算符进行模糊匹配。
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

