PowerShell Graph SDK脚本:过滤无许可证用户及添加用户类型列求助
解决Microsoft Graph API PowerShell脚本过滤用户并生成CSV的问题
问题说明
需要生成保存至C:\temp的CSV文件,包含以下内容:
- 本地AD及Azure AD用户的
DisplayName(显示名称) - 用户上次更改密码的时间戳
lastPasswordChangeDateTime - 过滤掉无许可证的资源账户(如共享邮箱)
- 可选需求:新增列标识用户属于本地AD还是Azure AD
原脚本可正常生成基础CSV,但尝试过滤无许可证用户时遇到两个问题:
- 使用
-Filter 'assignedLicenses/$count eq 0'无法实现过滤 - 自定义循环生成对象时,脚本无报错但输出空白CSV
问题原因
- Graph API过滤限制:
assignedLicenses/$count无法直接在-Filter中使用,Graph API不支持对集合属性的计数过滤 - 脚本逻辑错误:
lastPasswordChangeDateTime是Get-MgUser返回对象的直接属性,而非PasswordProfile子属性foreach循环内的[PSCustomObject]未正确输出到管道,导致无内容写入CSV- 默认
Get-MgUser未返回AssignedLicenses和OnPremisesSyncEnabled等属性,导致过滤和判断逻辑失效
解决方案
1. 正确获取所需属性
使用-Property参数指定需要的属性,确保能获取到许可证信息和同步状态:
Get-MgUser -All -Property DisplayName, lastPasswordChangeDateTime, AssignedLicenses, OnPremisesSyncEnabled
2. 过滤有许可证的用户
通过Where-Object判断AssignedLicenses的数量,确保只保留有许可证的用户:
Where-Object { $_.AssignedLicenses.Count -gt 0 }
3. 标识用户来源
通过OnPremisesSyncEnabled属性判断:
- 值为
$true:本地AD同步用户 - 值为
$false或$null:Azure AD原生用户
完整脚本
# 获取所有有许可证的用户,并指定所需属性 $usersWithLicenses = Get-MgUser -All -Property DisplayName, lastPasswordChangeDateTime, AssignedLicenses, OnPremisesSyncEnabled | Where-Object { $_.AssignedLicenses.Count -gt 0 } # 生成自定义对象并导出CSV $usersWithLicenses | ForEach-Object { [PSCustomObject]@{ DisplayName = $_.DisplayName LastPasswordChangeDateTime = if ($_.lastPasswordChangeDateTime) { $_.lastPasswordChangeDateTime } else { "N/A" } UserSource = if ($_.OnPremisesSyncEnabled) { "本地AD" } else { "Azure AD" } } } | Export-Csv -Path "C:\temp\userupdate.csv" -NoTypeInformation -Encoding UTF8
脚本说明
-NoTypeInformation:避免CSV文件头部添加冗余类型信息-Encoding UTF8:确保CSV文件支持中文显示- 空值处理:当
lastPasswordChangeDateTime为空时,显示"N/A",兼容PowerShell 5.x及以上版本
内容的提问来源于stack exchange,提问作者Mickey J
相关产品推荐
相关产品推荐

