Azure AD用户密码检查脚本求助:登录时间获取与格式转换
解决Azure AD管理PowerShell脚本的两个问题
问题1:「Last Login」嵌入脚本后无返回值
核心原因
Get-AzureADAuditSignInLogs的Filter语法易因UPN包含@等特殊字符出现解析错误- 单用户循环调用审计日志cmdlet效率偏低,且无登录记录的用户会直接返回空值
- 跨模块混用
Get-MsolUser与AzureAD cmdlet时,存在对象属性传递的隐性兼容性问题
解决方案
改用Get-AzureADUser自带的SignInActivity属性直接获取最后登录时间,无需单独查询审计日志——该方式更高效,且能避免Filter语法错误,同时可对无登录记录的用户设置默认提示。
问题2:Zulu时间格式转换为统一日期格式
解决方案
Zulu时间(如2017-08-03T12:30:00.000Z)本质是UTC标准时间,可通过DateTime类型转换为本地时间或指定统一格式输出,示例代码:
# 转为本地时间并指定格式 $zuluTime = '2017-08-03T12:30:00.000Z' $localTime = [DateTime]::Parse($zuluTime).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") # 或转为UTC时间保持全局一致 $utcTime = [DateTime]::Parse($zuluTime).ToString("yyyy-MM-dd HH:mm:ss")
修改后的完整脚本
# 统一使用AzureAD模块获取用户数据,避免跨模块兼容问题 Get-AzureADUser -Top 3 | Select-Object DisplayName, @{n="UPN";e={$_.UserPrincipalName}}, @{n="Enabled";e={$_.AccountEnabled}}, @{n="PwLastSet";e={$_.LastPasswordChangeDateTime.ToString("yyyy-MM-dd HH:mm:ss")}}, @{n="PwAge";e={(New-TimeSpan -Start $_.LastPasswordChangeDateTime -End (Get-Date)).Days}}, @{n="Manager";e={ $manager = Get-AzureADUserManager -ObjectId $_.ObjectId $manager.UserPrincipalName ?? "无上级" }}, @{n="Last Login";e={ if ($_.SignInActivity.LastSignInDateTime) { $_.SignInActivity.LastSignInDateTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") } else { "从未登录" } }} | Sort-Object PwAge -Descending
脚本优化说明
- 统一使用AzureAD模块cmdlet,消除跨模块调用的隐性问题
- 用
SignInActivity.LastSignInDateTime替代审计日志查询,提升效率并避免Filter错误 - 对无上级、无登录记录的空值场景设置友好提示
- 统一所有日期时间输出格式为
yyyy-MM-dd HH:mm:ss,保持结果一致性
内容的提问来源于stack exchange,提问作者ynnaij
相关产品推荐
相关产品推荐

