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

PowerShell脚本:基于多列CSV为无所有者Azure AD应用分配所有者

Azure AD应用所有者分配脚本解决方案

你的需求与问题

你是PowerShell脚本开发新手,需要实现以下功能:

  • 用包含两列的CSV文件(A列新所有者ID,B列应用ID),仅为无所有者的Azure AD应用分配所有者
  • 导出包含应用名称和新所有者信息的结果
  • 当前无法实现CSV列的对应循环逻辑,也不知道如何导出应用名称而非对象ID

你的现有脚本:

$AppId = Import-csv "C:\Users\crondon\Documents\Azure Tasks\azureapps.csv"

foreach ($assign in $appid)
{
   Add-AzureADApplicationOwner -ObjectId $assign.application -RefObjectId $assign.owner
   Get-AzureADApplicationOwner -ObjectId $assign.application | select objectid, displayname | Export-csv "C:\Users\crondon\Documents\Azure Tasks\new-azureowner.csv" -append
}

修改后的完整脚本

# 导入CSV分配清单
$appOwnerAssignments = Import-Csv "C:\Users\crondon\Documents\Azure Tasks\azureapps.csv"
# 初始化数组存储所有操作结果
$results = @()

foreach ($assignment in $appOwnerAssignments) {
    # 根据CSV中的应用ID,获取完整的Azure AD应用对象(包含名称)
    $targetApp = Get-AzureADApplication -Filter "AppId eq '$($assignment.application)'"
    if (-not $targetApp) {
        Write-Warning "找不到应用ID为 $($assignment.application) 的应用,跳过该行"
        continue
    }

    # 检查目标应用当前是否已有所有者
    $currentOwners = Get-AzureADApplicationOwner -ObjectId $targetApp.ObjectId -ErrorAction SilentlyContinue
    if ($currentOwners -and $currentOwners.Count -gt 0) {
        Write-Host "应用 '$($targetApp.DisplayName)' 已有所有者,跳过分配"
        continue
    }

    # 验证要分配的所有者是否存在
    $targetOwner = Get-AzureADUser -Filter "ObjectId eq '$($assignment.owner)'" -ErrorAction SilentlyContinue
    if (-not $targetOwner) {
        Write-Warning "找不到所有者ID为 $($assignment.owner) 的用户,跳过应用 '$($targetApp.DisplayName)'"
        continue
    }

    # 执行所有者分配操作
    try {
        Add-AzureADApplicationOwner -ObjectId $targetApp.ObjectId -RefObjectId $targetOwner.ObjectId -ErrorAction Stop
        Write-Host "✅ 成功为应用 '$($targetApp.DisplayName)' 分配所有者 '$($targetOwner.DisplayName)'"

        # 记录成功结果
        $results += [PSCustomObject]@{
            应用名称       = $targetApp.DisplayName
            应用ID         = $targetApp.AppId
            新所有者ID     = $targetOwner.ObjectId
            新所有者名称   = $targetOwner.DisplayName
            分配状态       = "成功"
        }
    }
    catch {
        Write-Error "❌ 为应用 '$($targetApp.DisplayName)' 分配所有者时出错:$_"
        # 记录失败结果
        $results += [PSCustomObject]@{
            应用名称       = $targetApp.DisplayName
            应用ID         = $targetApp.AppId
            新所有者ID     = $assignment.owner
            新所有者名称   = "无效/未找到"
            分配状态       = "失败"
        }
    }
}

# 将所有结果一次性导出到CSV(避免多次追加的混乱)
$results | Export-Csv "C:\Users\crondon\Documents\Azure Tasks\new-azureowner.csv" -NoTypeInformation -Encoding UTF8
Write-Host "操作完成,结果已导出到指定CSV文件"

核心改进说明

  • 循环逻辑修正:用$assignment遍历CSV的每一行,确保每一行的应用ID和所有者ID精准对应处理
  • 获取应用名称:通过Get-AzureADApplication根据应用ID获取完整对象,直接提取DisplayName字段,解决了仅能拿到对象ID的问题
  • 无所有者判断:先检查应用当前的所有者列表,只有当应用没有任何所有者时才执行分配,符合你的需求
  • 错误与异常处理:添加了应用/所有者不存在的校验,以及分配过程的异常捕获,避免脚本中途崩溃,同时记录失败原因
  • 结果导出优化:用数组统一收集所有操作结果,最后一次性导出CSV,避免多次-append导致的文件格式问题,结果包含应用名称、所有者名称等实用信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:34