如何为PowerShell脚本添加筛选器,筛选SSO中停用超90天的账户
实现停用超90天账户的筛选逻辑
没问题,我来帮你调整脚本,实现只保留停用超过90天账户的需求。下面是具体的修改步骤和完整脚本片段:
关键修改思路
核心是先计算出90天前的时间阈值,再用这个阈值过滤掉停用时间不足90天的账户。需要注意字段的时区和格式匹配,避免筛选出错。
1. 生成90天前的时间阈值
先执行这行代码计算阈值,建议转成UTC时间(如果你的SSO返回的StatusChanged是UTC格式的话):
$ninetyDaysAgo = (Get-Date).AddDays(-90).ToUniversalTime()
如果StatusChanged是本地时间,直接去掉.ToUniversalTime()即可。
2. 筛选符合条件的用户
在获取到所有停用用户后,用Where-Object筛选出StatusChanged早于阈值的账户:
# 获取所有停用用户 $users = oktaListDeprovisionedUsers -oOrg PREV # 计算时间阈值 $ninetyDaysAgo = (Get-Date).AddDays(-90).ToUniversalTime() # 筛选停用超90天的用户 $filteredUsers = $users | Where-Object { # 确保StatusChanged能转换为DateTime类型(如果是字符串格式的话) $statusChangedDate = [DateTime]::Parse($_.StatusChanged) $statusChangedDate -lt $ninetyDaysAgo }
3. 替换原有集合处理逻辑
把原来的$toexport初始化和后续操作,换成基于筛选后的$filteredUsers来处理:
$toexport = New-Object System.Collections.ArrayList foreach ($user in $filteredUsers) { # 保留你原本的导出逻辑,比如提取需要的字段添加到集合 $null = $toexport.Add($user) }
完整修改后的脚本片段
# 获取企业SSO中的所有停用用户 $users = oktaListDeprovisionedUsers -oOrg PREV # 计算90天前的UTC时间(根据实际时区调整) $ninetyDaysAgo = (Get-Date).AddDays(-90).ToUniversalTime() # 筛选停用超过90天的用户,添加异常处理避免解析失败 $filteredUsers = $users | Where-Object { try { $statusChangedDate = [DateTime]::Parse($_.StatusChanged) $statusChangedDate -lt $ninetyDaysAgo } catch { Write-Warning "无法解析用户 $($_.Id) 的停用日期:$($_.StatusChanged),已跳过该用户" $false } } # 初始化导出集合并处理筛选后的用户 $toexport = New-Object System.Collections.ArrayList foreach ($user in $filteredUsers) { # 这里可以根据需求自定义导出字段 $exportItem = [PSCustomObject]@{ UserId = $user.Id Username = $user.Username StatusChanged = $user.StatusChanged # 其他需要导出的字段 } $null = $toexport.Add($exportItem) } # 后续可将筛选结果传给删除脚本,建议先测试再执行删除 # foreach ($user in $filteredUsers) { # # 调用你的删除脚本逻辑 # Remove-SSOUser -UserId $user.Id -Org PREV # }
注意事项
- 时区一致性:务必确认
StatusChanged字段的时区,和$ninetyDaysAgo保持一致,否则会出现筛选偏差。 - 字段格式兼容:如果
StatusChanged是特殊格式的字符串,比如自定义日期格式,需要用[DateTime]::ParseExact()指定格式解析。 - 安全验证:在执行删除操作前,一定要先打印
$filteredUsers的数量和具体信息,确认筛选结果符合预期,避免误删有效账户。
内容的提问来源于stack exchange,提问作者Caven B
相关产品推荐
相关产品推荐

