如何自动化通过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的应用ID
00000003-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
相关产品推荐
相关产品推荐

