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

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

脚本优化说明

  1. 统一使用AzureAD模块cmdlet,消除跨模块调用的隐性问题
  2. 用SignInActivity.LastSignInDateTime替代审计日志查询,提升效率并避免Filter错误
  3. 对无上级、无登录记录的空值场景设置友好提示
  4. 统一所有日期时间输出格式为yyyy-MM-dd HH:mm:ss,保持结果一致性

内容的提问来源于stack exchange,提问作者ynnaij

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:33