如何筛选Get-MsolUser?需查询AAD中80天未更新密码的用户
解决Get-MsolUser筛选密码未更新用户的效率问题
嘿,完全懂你这种慢到让人跺脚的感受——当用户量上去的时候,先拉全量用户再本地过滤确实太折磨人了。先给你明确答案:Get-MsolUser确实没有内置的服务器端筛选参数来直接过滤密码未更新超过指定天数的用户,它的筛选能力很有限,只能做一些简单的属性匹配(比如DisplayName、UPN),像日期计算这类复杂筛选根本不支持,所以你之前的写法本质上是把所有启用用户拉到本地再逐个检查,慢是必然的。
那怎么解决?给你两个靠谱的方案:
方案1:改用AzureAD模块(推荐,效率提升巨大)
AzureAD模块支持OData筛选器,能让筛选逻辑在Azure AD服务器端完成,只返回符合条件的用户,不用拉全量数据。步骤如下:
- 先计算80天前的UTC时间(Azure AD存储的时间都是UTC,要统一时区避免误差):
$cutoffDate = (Get-Date).AddDays(-80).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
- 用
Get-AzureADUser直接在服务器端筛选:
Get-AzureADUser -Filter "AccountEnabled eq true and LastPasswordChangeDateTime le '$cutoffDate'" -All $true
这个命令会直接让Azure AD只返回启用且密码最后更新时间早于80天前的用户,速度比本地过滤快N倍,尤其是用户多的时候。
方案2:如果必须使用Msol模块(优化本地过滤)
如果你的环境只能用Msol模块,那可以通过减少返回属性来提升一点速度——默认Get-MsolUser会返回大量用户属性,我们只拉需要的属性就行:
Get-MsolUser -All -EnabledFilter EnabledOnly -SelectProperties DisplayName, UserPrincipalName, LastPasswordChangeTimestamp | Where-Object { $_.LastPasswordChangeTimestamp -lt (Get-Date).AddDays(-80).ToUniversalTime() }
这里用-SelectProperties只拉取必要的三个属性,同时把本地时间转成UTC和LastPasswordChangeTimestamp(UTC时间)比较,避免时区误差。虽然还是本地过滤,但数据量小了,速度会比原来快不少。
最后提醒下:如果是新环境,更建议转向Microsoft Graph PowerShell模块,它是微软主推的最新模块,功能更全,筛选能力更强,未来Msol模块会逐步被淘汰哦。
内容的提问来源于stack exchange,提问作者Bassie
相关产品推荐
相关产品推荐

