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
相关产品推荐
相关产品推荐

