如何用PowerShell调用Microsoft Graph API获取Office365指定用户登录活动
问题排查与解决方案
1. PowerShell中Graph API请求$select参数报错的解决
在PowerShell里,$是变量标识符,直接在双引号包裹的URL中写$select会被解析成PowerShell变量,而非Graph API的查询参数,这是核心问题。解决方式有两种:
方式一:转义
$符号
在$select前加PowerShell的转义符反引号(),确保$`被当作普通字符传递给Graph API:$requestUrl = "https://graph.microsoft.com/beta/users/$userId?`$select=signInActivity"方式二:用单引号拼接URL
单引号内的内容不会被PowerShell解析变量,直接保留原始字符串:$requestUrl = 'https://graph.microsoft.com/beta/users/' + $userId + '?$select=signInActivity'
额外确认点:
- 脚本使用的是应用权限(而非委托权限),且
Directory.Read.All和AuditLog.Read.All权限已获得全局管理员同意。 - 若用
Connect-MgGraph模块,需确保连接时指定应用权限(比如证书认证方式),而非交互式登录的委托权限。
2. VS Code提示$userId变量未使用的解决
这通常是PSScriptAnalyzer规则的误判,或变量使用方式未被正确识别,可通过以下方式解决:
显式引用变量:在构建URL后添加一行日志输出,让分析器明确识别变量已被使用:
Write-Host "正在查询用户ID: $userId"改用字符串格式化:调整URL拼接方式,让分析器更容易检测到变量引用:
$requestUrl = [string]::Format("https://graph.microsoft.com/beta/users/{0}?`$select=signInActivity", $userId)刷新VS Code缓存:按下
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(Mac),执行Reload Window操作清除分析器缓存。
完整示例脚本
# 导入CSV文件(CSV需包含UPN列) $users = Import-Csv -Path "users.csv" # 配置Graph API应用权限认证(以证书认证为例) $clientId = "你的应用ID" $tenantId = "你的租户ID" $certThumbprint = "证书指纹" Connect-MgGraph -ClientId $clientId -TenantId $tenantId -CertificateThumbprint $certThumbprint foreach ($user in $users) { # 根据UPN获取用户ID $userId = (Get-MgUser -Filter "userPrincipalName eq '$($user.UPN)'").Id # 构建正确的请求URL $requestUrl = "https://graph.microsoft.com/beta/users/$userId?`$select=signInActivity" # 显式引用变量消除VS Code提示 Write-Verbose "处理用户: $($user.UPN),ID: $userId" -Verbose # 发送请求并提取lastSignInDateTime $userActivity = Invoke-MgGraphRequest -Uri $requestUrl -Method Get $lastSignIn = $userActivity.signInActivity.lastSignInDateTime # 输出结构化结果 [PSCustomObject]@{ UserUPN = $user.UPN UserId = $userId LastSignInDateTime = $lastSignIn } }
内容的提问来源于stack exchange,提问作者Bernietechy
相关产品推荐
相关产品推荐

