多用户时PowerShell获取AzureAD登录日志无结果及空登录记录处理
解决方案
修改后的完整代码
# 读取UPN列表 $UPNList = Get-Content c:\temp\users.txt # 初始化数组存储所有结果 $allResults = @() foreach ($User in $UPNList) { # 规避Azure AD API调用频率限制 Start-Sleep -Milliseconds 1000 # 获取用户最新登录记录 $signInLog = Get-AzureADAuditSignInLogs -Filter "UserPrincipalName eq '$User'" -Top 1 if ($signInLog) { # 有登录记录时,构造结果对象 $result = $signInLog | Select-Object CreatedDateTime, UserPrincipalName, IsInteractive, AppDisplayName, IpAddress, TokenIssuerType, @{Name = 'DeviceOS'; Expression = {$_.DeviceDetail.OperatingSystem}} } else { # 无登录记录时,构造空字段对象,仅保留UPN $result = [PSCustomObject]@{ CreatedDateTime = $null UserPrincipalName = $User IsInteractive = $null AppDisplayName = $null IpAddress = $null TokenIssuerType = $null DeviceOS = $null } } # 将当前用户结果加入数组 $allResults += $result } # 统一导出所有结果到CSV $allResults | Export-Csv -Path 'c:\temp\results.txt' -NoTypeInformation -Encoding UTF8
关键修改说明
- 改用数组收集结果后统一导出:原代码用
Export-Csv -Append时,若某用户无登录记录($result为$null),不会写入任何内容;若第一个用户无结果,CSV文件可能无法创建,后续Append操作失效。先收集所有结果再一次性导出,确保所有用户记录都能写入文件。 - 处理无登录记录的用户:通过
if ($signInLog)判断是否存在登录记录,无记录时手动构造包含目标UPN的自定义对象,其余字段设为$null,保证CSV中保留该用户的条目。 - 添加UTF8编码:避免导出CSV时出现中文乱码问题(如果UPN包含中文)。
内容的提问来源于stack exchange,提问作者Vick Vega
相关产品推荐
相关产品推荐

