如何用PowerShell批量获取EA和SPN的所有者邮箱及相关信息?
PowerShell 兼容EA和SPN的对象信息提取脚本
以下是能同时处理Enterprise Application(EA)和Service Principal(SPN)的完整脚本,可准确识别对象类型、提取DisplayName及所有者邮箱,并输出CSV文件:
# 1. 定义需要处理的ObjectId列表,也可从文件读取:$objectIds = Get-Content "C:\path\to\objectids.txt" $objectIds = @("xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy") # 2. 初始化结果数组 $results = @() foreach ($id in $objectIds) { $objectType = $null $displayName = $null $owners = $null # 先尝试获取Service Principal(SPN) try { $spn = Get-AzADServicePrincipal -ObjectId $id -ErrorAction Stop $objectType = "SPN" $displayName = $spn.DisplayName # 获取SPN所有者邮箱 $spnOwners = Get-AzADServicePrincipalOwner -ObjectId $id -ErrorAction SilentlyContinue $owners = $spnOwners.Mail -join "," } catch [Microsoft.Azure.Commands.ActiveDirectory.AadObjectNotFoundException] { # 若SPN不存在,尝试获取Enterprise Application(EA) try { $ea = Get-AzADApplication -ObjectId $id -ErrorAction Stop $objectType = "EA" $displayName = $ea.DisplayName # 获取EA所有者邮箱 $eaOwners = Get-AzADApplicationOwner -ObjectId $id -ErrorAction SilentlyContinue $owners = $eaOwners.Mail -join "," } catch [Microsoft.Azure.Commands.ActiveDirectory.AadObjectNotFoundException] { # 若两种对象都不存在,标记为未知 $objectType = "Unknown" $displayName = "Not Found" $owners = "N/A" } catch { # 捕获其他EA相关错误 $objectType = "EA Error" $displayName = "Error Retrieving" $owners = "Error" } } catch { # 捕获其他SPN相关错误 $objectType = "SPN Error" $displayName = "Error Retrieving" $owners = "Error" } # 将当前对象信息加入结果数组 $results += [PSCustomObject]@{ ObjectId = $id ObjectType = $objectType DisplayName = $displayName Owners = $owners } } # 3. 输出到CSV文件 $results | Export-Csv -Path "C:\path\to\output.csv" -NoTypeInformation -Encoding UTF8
关键说明:
- 错误处理优化:使用
try/catch精准捕获AadObjectNotFoundException,避免无关错误干扰,同时区分SPN和EA的获取逻辑,解决了兼容报错问题。 - 对象类型判断:先尝试获取SPN,失败后再尝试EA,确保每个ObjectId都能匹配到对应类型。
- 所有者处理:分别调用
Get-AzADServicePrincipalOwner和Get-AzADApplicationOwner获取对应对象的所有者,用-join ","将多个邮箱拼接为字符串。 - 兼容性:支持直接定义ObjectId数组,也可通过
Get-Content从文本文件批量读取ObjectId。
使用前准备:
- 确保已安装并导入AzureAD模块:
Install-Module -Name Az.Resources -Force; Import-Module Az.Resources - 已通过
Connect-AzAccount完成Azure账号登录认证。
内容的提问来源于stack exchange,提问作者himi
相关产品推荐
相关产品推荐

