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

如何用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。

使用前准备:

  1. 确保已安装并导入AzureAD模块:Install-Module -Name Az.Resources -Force; Import-Module Az.Resources
  2. 已通过Connect-AzAccount完成Azure账号登录认证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:55:16