You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:42:52