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

如何自动化通过PowerShell从Azure AD提取用户最后登录时间?

实现Azure AD用户最后登录时间自动化提取方案

核心问题原因

你当前使用的Connect-AzureAD默认是交互式认证逻辑,在计划任务这类无用户交互的自动化场景中,必然会触发凭据输入弹窗。要实现无交互运行,必须采用**服务主体(Service Principal)**的非交互式认证方式,同时分配匹配的权限。

具体实现步骤

1. 创建Azure AD服务主体并分配权限

用全局管理员账户打开PowerShell,完成服务主体的创建与权限配置:

  • 创建服务主体:
    $sp = New-AzADServicePrincipal -DisplayName "AzureAD-LoginReport-SP"
    
    记录输出中的ApplicationId(客户端ID)和TenantId,后续脚本要用到。
  • 生成服务主体的客户端密钥(有效期可按需调整):
    $credential = New-AzADServicePrincipalCredential -ObjectId $sp.Id -EndDate (Get-Date).AddYears(1)
    
    务必记录SecretText字段的值,该密钥仅显示一次,丢失后需重新生成。
  • 分配读取登录数据的必要权限:
    读取用户最后登录时间需要AuditLog.Read.All和Directory.Read.All应用权限,执行以下命令:
    # 分配AuditLog.Read.All权限
    New-AzADServicePrincipalPermissionGrant -ObjectId $sp.Id -PermissionId "00000002-0000-0000-c000-000000000000" -ResourceId (Get-AzADServicePrincipal -ApplicationId "00000002-0000-0000-c000-000000000000").Id -Scope "/"
    # 分配Directory.Read.All权限
    New-AzADServicePrincipalPermissionGrant -ObjectId $sp.Id -PermissionId "00000003-0000-0000-c000-000000000000" -ResourceId (Get-AzADServicePrincipal -ApplicationId "00000002-0000-0000-c000-000000000000").Id -Scope "/"
    

    注:若使用Microsoft Graph模块(推荐,Azure AD模块已逐步废弃),需将资源ID替换为Microsoft Graph的应用ID00000003-0000-0000-c000-000000000000,权限ID可通过Get-AzADServicePrincipalPermission查询对应权限的ID。

2. 修改PowerShell脚本为非交互式认证

替换原有的Connect-AzureAD命令,改用服务主体完成无交互登录:

# 填入服务主体的凭据信息
$clientId = "你的服务主体ApplicationId"
$tenantId = "你的租户ID"
$clientSecret = ConvertTo-SecureString "你的客户端密钥SecretText" -AsPlainText -Force
$psCredential = New-Object System.Management.Automation.PSCredential($clientId, $clientSecret)

# 非交互式连接Azure AD
Connect-AzureAD -Credential $psCredential -TenantId $tenantId -ServicePrincipal | Out-Null

# 提取并输出用户最后登录时间
Get-AzureADUser -All $true | Select-Object DisplayName, UserPrincipalName, LastSignInDateTime

若使用Microsoft Graph模块,可替换为以下代码:

$clientSecretCredential = New-Object Microsoft.Identity.Client.ClientSecretCredential($tenantId, $clientId, $clientSecret)
Connect-MgGraph -ClientSecretCredential $clientSecretCredential -TenantId $tenantId
Get-MgUser -All -Property DisplayName,UserPrincipalName,SignInActivity | Select-Object DisplayName,UserPrincipalName,@{Name='LastSignInDateTime';Expression={$_.SignInActivity.LastSignInDateTime}}

3. 配置计划任务确保无交互运行

打开「任务计划程序」创建新任务,关键配置如下:

  • 常规选项卡:勾选「不管用户是否登录都要运行」,取消勾选「使用最高权限运行」(服务主体权限足够时无需提升)。
  • 触发器:设置符合需求的运行频率(如每日固定时间)。
  • 操作:选择「启动程序」,程序/脚本填powershell.exe,添加参数填-ExecutionPolicy Bypass -File "你的脚本完整路径.ps1"。
  • 设置:取消勾选「如果任务运行时间超过X小时就停止」,避免脚本被强制中断。

权限验证注意事项

  • 服务主体需分配应用权限而非委派权限,自动化场景无用户上下文,委派权限无法生效。
  • 若使用Security Reader角色,需将该角色直接分配给服务主体(而非普通用户账户),并设置角色范围为整个租户,确保能读取登录日志和用户数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:14:58